xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: "Roger Pau Monné" <roger.pau@citrix.com>
To: Paul Durrant <Paul.Durrant@citrix.com>
Cc: "jgross@suse.com" <jgross@suse.com>,
	Andrew Cooper <Andrew.Cooper3@citrix.com>,
	'Roman Shaposhnik' <roman@zededa.com>,
	"jbeulich@suse.com" <jbeulich@suse.com>,
	"xen-devel@lists.xenproject.org" <xen-devel@lists.xenproject.org>,
	"boris.ostrovsky@oracle.com" <boris.ostrovsky@oracle.com>
Subject: Re: [Xen-devel] [BUG] After upgrade to Xen 4.12.0 iommu=no-igfx
Date: Mon, 22 Jul 2019 16:39:53 +0200	[thread overview]
Message-ID: <20190722143953.tkcmv5bb72sdlkql@Air-de-Roger> (raw)
In-Reply-To: <81a7cdc728294e5ca05fd056a87cb21b@AMSPEX02CL03.citrite.net>

On Mon, Jul 22, 2019 at 04:03:44PM +0200, Paul Durrant wrote:
> > -----Original Message-----
> [snip]
> > > > diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
> > > > index 79ec6719f5..9d91f0d633 100644
> > > > --- a/xen/drivers/passthrough/iommu.c
> > > > +++ b/xen/drivers/passthrough/iommu.c
> > > > @@ -185,7 +185,7 @@ void __hwdom_init iommu_hwdom_init(struct domain *d)
> > > >      register_keyhandler('o', &iommu_dump_p2m_table, "dump iommu p2m table", 0);
> > > >
> > > >      hd->status = IOMMU_STATUS_initializing;
> > > > -    hd->need_sync = iommu_hwdom_strict && !iommu_use_hap_pt(d);
> > > > +    hd->need_sync = !iommu_use_hap_pt(d);
> > >
> > > But this is going to mean the if() below is true for non-strict dom0, which means it pointlessly
> > maps the dom0 page list when hwdom_iommu_map() should have already mapped all conventional RAM.
> > 
> > Right, this all seems quite broken. Non-translated guests (ie: PV)
> > would always need iommu page-table sync, but set_identity_p2m_entry
> > contains the following:
> > 
> > if ( !paging_mode_translate(p2m->domain) )
> > {
> >     if ( !need_iommu_pt_sync(d) )
> >         return 0;
> >     return iommu_legacy_map(d, _dfn(gfn_l), _mfn(gfn_l), PAGE_ORDER_4K,
> >                             IOMMUF_readable | IOMMUF_writable);
> > }
> > 
> > I wonder whether the usage of need_iommu_pt_sync is wrong there, and
> > should instead be !has_iommu_pt(d), since non-translated domains would
> > never share the iommu page-tables anyway.
> 
> You want syncing if the domain has IOMMU page tables and shared EPT is not in use, so this logic just seems wrong.

Right, so for a PV domain this would mean syncing if the iommu is in
used, because there's no sharing at all.

> > 
> > In any case, I think need_sync must be set when the iommu page tables
> > are not shared, and gating it on iommu_hwdom_strict seems wrong to me,
> > the strictness of the iommu doesn't affect whether a sync is need or
> > not.
> 
> I think need_sync is gated on strict mode because, in 'relaxed' mode, the mappings that are set up when dom0 is started are supposed to be static (modulo hotplug RAM)... so modifications to the domain's page list are not supposed to have any effect, and so no synchronization need be done.

Hm, right, in relaxed mode dom0 is supposed to have all RAM regions
mapped in the iommu page-tables, so there's no need to modify the
iommu page tables at run time.

This approach seems slightly broken if dma operations agains mmio
regions are attempted by dom0, but anyway, this seems to have worked
fine so far.

> > 
> > I've updated the patch to avoid the pointless mapping of dom0 page
> > list, but I haven't included the change to set_identity_p2m_entry.
> > 
> 
> So, I think the albeit odd looking logic in iommu_hwdom_init() was actually correct, but the code in set_identity_p2m_entry() is wrong.

Ack, see the patch below. I think it might also be helpful to add a
comment to the setting of need_sync in iommu_hwdom_init in order to
mention that relaxed domains don't need sync because all ram is
already mapped in the iommu page tables.

Thanks, Roger.
---8<---
diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
index fef97c82f6..88a2430c8c 100644
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -836,7 +836,7 @@ guest_physmap_add_page(struct domain *d, gfn_t gfn, mfn_t mfn,
          */
         for ( i = 0; i < (1UL << page_order); ++i, ++page )
         {
-            if ( !need_iommu_pt_sync(d) )
+            if ( !has_iommu_pt(d) )
                 /* nothing */;
             else if ( get_page_and_type(page, d, PGT_writable_page) )
                 put_page_and_type(page);
@@ -1341,7 +1341,7 @@ int set_identity_p2m_entry(struct domain *d, unsigned long gfn_l,
 
     if ( !paging_mode_translate(p2m->domain) )
     {
-        if ( !need_iommu_pt_sync(d) )
+        if ( !has_iommu_pt(d) )
             return 0;
         return iommu_legacy_map(d, _dfn(gfn_l), _mfn(gfn_l), PAGE_ORDER_4K,
                                 IOMMUF_readable | IOMMUF_writable);
@@ -1432,7 +1432,7 @@ int clear_identity_p2m_entry(struct domain *d, unsigned long gfn_l)
 
     if ( !paging_mode_translate(d) )
     {
-        if ( !need_iommu_pt_sync(d) )
+        if ( !has_iommu_pt(d) )
             return 0;
         return iommu_legacy_unmap(d, _dfn(gfn_l), PAGE_ORDER_4K);
     }


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

  reply	other threads:[~2019-07-22 14:40 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-19 19:31 [Xen-devel] [BUG] After upgrade to Xen 4.12.0 iommu=no-igfx Roman Shaposhnik
2019-07-19 20:02 ` Roman Shaposhnik
2019-07-22  8:20   ` Paul Durrant
2019-07-22 11:48     ` Roger Pau Monné
2019-07-22 11:54       ` Paul Durrant
2019-07-22 13:48         ` Roger Pau Monné
2019-07-22 14:03           ` Paul Durrant
2019-07-22 14:39             ` Roger Pau Monné [this message]
2019-07-22 15:02               ` Paul Durrant
2019-07-22 15:21                 ` Roger Pau Monné
2019-07-22 23:36                   ` Roman Shaposhnik
2019-07-22 23:47                     ` Andrew Cooper
2019-07-23 17:32                       ` Roman Shaposhnik
2019-07-23 17:35                         ` Andrew Cooper
2019-07-23 17:48                           ` Roman Shaposhnik
2019-07-23 17:50                             ` Andrew Cooper
2019-07-23 17:58                               ` Roman Shaposhnik
2019-07-23 18:12                                 ` Andrew Cooper
2019-07-23 18:25                                   ` Roman Shaposhnik
2019-07-26  7:58                                     ` Jan Beulich
2019-07-30 17:56                                       ` Roman Shaposhnik
2019-07-31  8:34                                         ` Jan Beulich
2019-07-31  8:58                                           ` Andrew Cooper
2019-07-31  9:30                                             ` Jan Beulich
2019-07-31 19:37                                               ` Roman Shaposhnik
2019-07-24 12:00                                 ` Jan Beulich
2019-07-24 12:04                                   ` Jan Beulich
2019-07-24 11:23                         ` Andrew Cooper
2019-07-24 11:40                           ` Andrew Cooper
2019-07-24 14:11                         ` Roger Pau Monné
2019-07-26  0:47                           ` Roman Shaposhnik
2019-07-26  9:35                             ` Roger Pau Monné
2019-07-30  9:21                               ` Roger Pau Monné
2019-07-30 17:55                                 ` Roman Shaposhnik
2019-07-31  8:31                                   ` Jan Beulich
2019-07-31  8:36                                   ` Roger Pau Monné
2019-07-31  8:43                                     ` Roger Pau Monné
2019-07-31 19:35                                       ` Roman Shaposhnik
2019-07-31 19:46                                         ` Andrew Cooper
2019-07-31 21:03                                           ` Roman Shaposhnik
2019-08-01  8:15                                             ` Roger Pau Monné
2019-08-01 18:25                                               ` Roman Shaposhnik
2019-08-02  8:05                                                 ` Roger Pau Monné
2019-08-06 16:17                                                   ` Roger Pau Monné
2019-08-06 21:48                                                     ` Roman Shaposhnik
2019-08-07  7:08                                                       ` Jan Beulich
2019-08-07  9:57                                                         ` Roger Pau Monné
2019-08-07 10:03                                                           ` Jan Beulich
2019-08-07  7:35                                                       ` Roger Pau Monné
2019-08-07  8:31                                                         ` Jan Beulich
2019-08-07 10:17                                                           ` Roger Pau Monné
2019-08-12  8:57                                                         ` Roger Pau Monné
2019-08-13 19:24                                                           ` Roman Shaposhnik
2019-08-14  8:06                                                             ` Roger Pau Monné
2019-08-19  5:00                                                               ` Roman Shaposhnik
2019-08-19  8:16                                                                 ` Roger Pau Monné
2019-08-20  2:03                                                                   ` Roman Shaposhnik
2019-08-01  7:35                                           ` Jan Beulich
2019-07-31 19:30                                     ` Roman Shaposhnik
2019-08-01  8:45                                       ` Roger Pau Monné
2019-08-01 18:19                                         ` Roman Shaposhnik
2019-07-20 16:39 ` Andrew Cooper
2019-07-22  8:03   ` Paul Durrant
2019-07-24 17:42 ` Rich Persaud
2019-07-26  1:13   ` Roman Shaposhnik

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190722143953.tkcmv5bb72sdlkql@Air-de-Roger \
    --to=roger.pau@citrix.com \
    --cc=Andrew.Cooper3@citrix.com \
    --cc=Paul.Durrant@citrix.com \
    --cc=boris.ostrovsky@oracle.com \
    --cc=jbeulich@suse.com \
    --cc=jgross@suse.com \
    --cc=roman@zededa.com \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).