From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60312) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fJQ6S-0006wL-8D for qemu-devel@nongnu.org; Thu, 17 May 2018 17:06:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fJQ6O-000828-8m for qemu-devel@nongnu.org; Thu, 17 May 2018 17:06:24 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:50054 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fJQ6O-00081u-2r for qemu-devel@nongnu.org; Thu, 17 May 2018 17:06:20 -0400 Date: Fri, 18 May 2018 00:06:14 +0300 From: "Michael S. Tsirkin" Message-ID: <20180518000522-mutt-send-email-mst@kernel.org> References: <20180517085927.24925-1-peterx@redhat.com> <20180517085927.24925-13-peterx@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180517085927.24925-13-peterx@redhat.com> Subject: Re: [Qemu-devel] [PATCH v3 12/12] intel-iommu: new sync_shadow_page_table List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Peter Xu Cc: qemu-devel@nongnu.org, Tian Kevin , Alex Williamson , Jintack Lim , Jason Wang On Thu, May 17, 2018 at 04:59:27PM +0800, Peter Xu wrote: > Firstly, introduce the sync_shadow_page_table() helper to resync the > whole shadow page table of an IOMMU address space. Meanwhile, when we > receive domain invalidation or similar requests (for example, context > entry invalidations, global invalidations, ...), we should not really > run the replay logic, instead we can now use the new sync shadow page > table API to resync the whole shadow page table. > > There will be two major differences: > > 1. We don't unmap-all before walking the page table, we just sync. The > global unmap-all can create a very small window that the page table > is invalid or incomplete The implication is that with vfio, device might stop working without this change. > 2. We only walk the page table once now (while replay can be triggered > multiple times depending on how many notifiers there are) > > Signed-off-by: Peter Xu > --- > hw/i386/intel_iommu.c | 14 +++++++++----- > 1 file changed, 9 insertions(+), 5 deletions(-) > > diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c > index a1a2a009c1..fbb2f763f0 100644 > --- a/hw/i386/intel_iommu.c > +++ b/hw/i386/intel_iommu.c > @@ -1065,6 +1065,11 @@ static int vtd_sync_shadow_page_table_range(VTDAddressSpace *vtd_as, > return vtd_page_walk(&ce_cache, addr, addr + size, &info); > } > > +static int vtd_sync_shadow_page_table(VTDAddressSpace *vtd_as) > +{ > + return vtd_sync_shadow_page_table_range(vtd_as, NULL, 0, UINT64_MAX); > +} > + > /* > * Fetch translation type for specific device. Returns <0 if error > * happens, otherwise return the shifted type to check against > @@ -1397,7 +1402,7 @@ static void vtd_iommu_replay_all(IntelIOMMUState *s) > VTDAddressSpace *vtd_as; > > QLIST_FOREACH(vtd_as, &s->notifiers_list, next) { > - memory_region_iommu_replay_all(&vtd_as->iommu); > + vtd_sync_shadow_page_table(vtd_as); > } > } > > @@ -1470,14 +1475,13 @@ static void vtd_context_device_invalidate(IntelIOMMUState *s, > vtd_switch_address_space(vtd_as); > /* > * So a device is moving out of (or moving into) a > - * domain, a replay() suites here to notify all the > - * IOMMU_NOTIFIER_MAP registers about this change. > + * domain, resync the shadow page table. > * This won't bring bad even if we have no such > * notifier registered - the IOMMU notification > * framework will skip MAP notifications if that > * happened. > */ > - memory_region_iommu_replay_all(&vtd_as->iommu); > + vtd_sync_shadow_page_table(vtd_as); > } > } > } > @@ -1535,7 +1539,7 @@ static void vtd_iotlb_domain_invalidate(IntelIOMMUState *s, uint16_t domain_id) > if (!vtd_dev_to_context_entry(s, pci_bus_num(vtd_as->bus), > vtd_as->devfn, &ce) && > domain_id == VTD_CONTEXT_ENTRY_DID(ce.hi)) { > - memory_region_iommu_replay_all(&vtd_as->iommu); > + vtd_sync_shadow_page_table(vtd_as); > } > } > } > -- > 2.17.0