From nobody Wed Nov 5 16:15:55 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1496404398495472.52813576481674; Fri, 2 Jun 2017 04:53:18 -0700 (PDT) Received: from localhost ([::1]:49202 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGl8n-0000vt-0V for importer@patchew.org; Fri, 02 Jun 2017 07:53:17 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44026) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGl7R-000871-0L for qemu-devel@nongnu.org; Fri, 02 Jun 2017 07:51:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dGl7L-0007gT-VB for qemu-devel@nongnu.org; Fri, 02 Jun 2017 07:51:53 -0400 Received: from mx1.redhat.com ([209.132.183.28]:44204) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dGl7L-0007fu-MH for qemu-devel@nongnu.org; Fri, 02 Jun 2017 07:51:47 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8CF9D334593 for ; Fri, 2 Jun 2017 11:51:46 +0000 (UTC) Received: from pxdev.xzpeter.org.com (ovpn-12-63.pek2.redhat.com [10.72.12.63]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9587777BF6; Fri, 2 Jun 2017 11:51:25 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 8CF9D334593 Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=peterx@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 8CF9D334593 From: Peter Xu To: qemu-devel@nongnu.org Date: Fri, 2 Jun 2017 19:50:52 +0800 Message-Id: <1496404254-17429-2-git-send-email-peterx@redhat.com> In-Reply-To: <1496404254-17429-1-git-send-email-peterx@redhat.com> References: <1496404254-17429-1-git-send-email-peterx@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Fri, 02 Jun 2017 11:51:46 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 1/3] exec: add page_mask for address_space_do_translate X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , Maxime Coquelin , Jason Wang , peterx@redhat.com, "Michael S . Tsirkin" Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The function is originally used for address_space_translate() and what we care about most is (xlat, plen) range. However for iotlb requests, we don't really care about "plen", but the size of the page that "xlat" is located on. While, plen cannot really contain this information. A simple example to show why "plen" is not good for IOTLB translations: E.g., for huge pages, it is possible that guest mapped 1G huge page on device side that used this GPA range: 0x100000000 - 0x13fffffff Then let's say we want to translate one IOVA that finally mapped to GPA 0x13ffffe00 (which is located on this 1G huge page). Then here we'll get: (xlat, plen) =3D (0x13fffe00, 0x200) So the IOTLB would be only covering a very small range since from "plen" (which is 0x200 bytes) we cannot tell the size of the page. Actually we can really know that this is a huge page - we just throw the information away in address_space_do_translate(). This patch introduced "page_mask" optional parameter to capture that page mask info. Also, I made "plen" an optional parameter as well, with some comments for the whole function. No functional change yet. Signed-off-by: Peter Xu --- exec.c | 46 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/exec.c b/exec.c index 8fc0e78..63a3ff0 100644 --- a/exec.c +++ b/exec.c @@ -465,21 +465,45 @@ address_space_translate_internal(AddressSpaceDispatch= *d, hwaddr addr, hwaddr *x return section; } =20 -/* Called from RCU critical section */ +/** + * address_space_do_translate - translate an address in AddressSpace + * + * @as: the address space that we want to translate on + * @addr: the address to be translated in above address space + * @xlat: the translated address offset within memory region. It + * cannot be @NULL. + * @plen_out: valid read/write length of the translated address. It + * can be @NULL when we don't care about it. + * @page_mask_out: page mask for the translated address. This + * should only be meaningful for IOMMU translated + * addresses, since there may be huge pages that this bit + * would tell. It can be @NULL if we don't care about it. + * @is_write: whether the translation operation is for write + * @is_mmio: whether this can be MMIO, set true if it can + * + * This function is called from RCU critical section + */ static MemoryRegionSection address_space_do_translate(AddressSpace *as, hwaddr addr, hwaddr *xlat, - hwaddr *plen, + hwaddr *plen_out, + hwaddr *page_mask_ou= t, bool is_write, bool is_mmio) { IOMMUTLBEntry iotlb; MemoryRegionSection *section; MemoryRegion *mr; + hwaddr page_mask =3D TARGET_PAGE_MASK; + hwaddr plen =3D (hwaddr)(-1); + + if (plen_out) { + plen =3D *plen_out; + } =20 for (;;) { AddressSpaceDispatch *d =3D atomic_rcu_read(&as->dispatch); - section =3D address_space_translate_internal(d, addr, &addr, plen,= is_mmio); + section =3D address_space_translate_internal(d, addr, &addr, &plen= , is_mmio); mr =3D section->mr; =20 if (!mr->iommu_ops) { @@ -490,7 +514,8 @@ static MemoryRegionSection address_space_do_translate(A= ddressSpace *as, IOMMU_WO : IOMMU_RO); addr =3D ((iotlb.translated_addr & ~iotlb.addr_mask) | (addr & iotlb.addr_mask)); - *plen =3D MIN(*plen, (addr | iotlb.addr_mask) - addr + 1); + page_mask =3D iotlb.addr_mask; + plen =3D MIN(plen, (addr | iotlb.addr_mask) - addr + 1); if (!(iotlb.perm & (1 << is_write))) { goto translate_fail; } @@ -500,6 +525,14 @@ static MemoryRegionSection address_space_do_translate(= AddressSpace *as, =20 *xlat =3D addr; =20 + if (page_mask_out) { + *page_mask_out =3D page_mask; + } + + if (plen_out) { + *plen_out =3D plen; + } + return *section; =20 translate_fail: @@ -518,7 +551,7 @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpac= e *as, hwaddr addr, =20 /* This can never be MMIO. */ section =3D address_space_do_translate(as, addr, &xlat, &plen, - is_write, false); + NULL, is_write, false); =20 /* Illegal translation */ if (section.mr =3D=3D &io_mem_unassigned) { @@ -560,7 +593,8 @@ MemoryRegion *address_space_translate(AddressSpace *as,= hwaddr addr, MemoryRegionSection section; =20 /* This can be MMIO, so setup MMIO bit. */ - section =3D address_space_do_translate(as, addr, xlat, plen, is_write,= true); + section =3D address_space_do_translate(as, addr, xlat, plen, + NULL, is_write, true); mr =3D section.mr; =20 if (xen_enabled() && memory_access_is_direct(mr, is_write)) { --=20 2.7.4 From nobody Wed Nov 5 16:15:55 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1496404399422200.14188327812724; Fri, 2 Jun 2017 04:53:19 -0700 (PDT) Received: from localhost ([::1]:49203 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGl8m-0000wM-Ri for importer@patchew.org; Fri, 02 Jun 2017 07:53:16 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44049) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGl7R-00087l-Sv for qemu-devel@nongnu.org; Fri, 02 Jun 2017 07:51:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dGl7Q-0007jV-Ux for qemu-devel@nongnu.org; Fri, 02 Jun 2017 07:51:53 -0400 Received: from mx1.redhat.com ([209.132.183.28]:52474) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dGl7Q-0007jM-PU for qemu-devel@nongnu.org; Fri, 02 Jun 2017 07:51:52 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B945380E7B for ; Fri, 2 Jun 2017 11:51:51 +0000 (UTC) Received: from pxdev.xzpeter.org.com (ovpn-12-63.pek2.redhat.com [10.72.12.63]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2205E7839E; Fri, 2 Jun 2017 11:51:46 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com B945380E7B Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=peterx@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com B945380E7B From: Peter Xu To: qemu-devel@nongnu.org Date: Fri, 2 Jun 2017 19:50:53 +0800 Message-Id: <1496404254-17429-3-git-send-email-peterx@redhat.com> In-Reply-To: <1496404254-17429-1-git-send-email-peterx@redhat.com> References: <1496404254-17429-1-git-send-email-peterx@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Fri, 02 Jun 2017 11:51:51 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 2/3] exec: simplify address_space_get_iotlb_entry X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , Maxime Coquelin , Jason Wang , peterx@redhat.com, "Michael S . Tsirkin" Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This patch let address_space_get_iotlb_entry() to use the newly introduced page_mask parameter in address_space_do_translate(). Then we will be sure the IOTLB can be aligned to page mask, also we should nicely support huge pages now when introducing a764040. Fixes: a764040 ("exec: abstract address_space_do_translate()") Signed-off-by: Peter Xu --- exec.c | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/exec.c b/exec.c index 63a3ff0..1f86253 100644 --- a/exec.c +++ b/exec.c @@ -544,14 +544,14 @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSp= ace *as, hwaddr addr, bool is_write) { MemoryRegionSection section; - hwaddr xlat, plen; + hwaddr xlat, page_mask; =20 - /* Try to get maximum page mask during translation. */ - plen =3D (hwaddr)-1; - - /* This can never be MMIO. */ - section =3D address_space_do_translate(as, addr, &xlat, &plen, - NULL, is_write, false); + /* + * This can never be MMIO, and we don't really care about plen, + * but page mask. + */ + section =3D address_space_do_translate(as, addr, &xlat, NULL, + &page_mask, is_write, false); =20 /* Illegal translation */ if (section.mr =3D=3D &io_mem_unassigned) { @@ -562,20 +562,11 @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSp= ace *as, hwaddr addr, xlat +=3D section.offset_within_address_space - section.offset_within_region; =20 - if (plen =3D=3D (hwaddr)-1) { - /* If not specified during translation, use default mask */ - plen =3D TARGET_PAGE_MASK; - } else { - /* Make it a valid page mask */ - assert(plen); - plen =3D pow2floor(plen) - 1; - } - return (IOMMUTLBEntry) { .target_as =3D section.address_space, - .iova =3D addr & ~plen, - .translated_addr =3D xlat & ~plen, - .addr_mask =3D plen, + .iova =3D addr & ~page_mask, + .translated_addr =3D xlat & ~page_mask, + .addr_mask =3D page_mask, /* IOTLBs are for DMAs, and DMA only allows on RAMs. */ .perm =3D IOMMU_RW, }; --=20 2.7.4 From nobody Wed Nov 5 16:15:55 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1496404475882963.0002952848797; Fri, 2 Jun 2017 04:54:35 -0700 (PDT) Received: from localhost ([::1]:49206 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGlA1-0001pV-3B for importer@patchew.org; Fri, 02 Jun 2017 07:54:33 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44171) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dGl7e-0008JH-5C for qemu-devel@nongnu.org; Fri, 02 Jun 2017 07:52:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dGl7Z-0007mn-66 for qemu-devel@nongnu.org; Fri, 02 Jun 2017 07:52:06 -0400 Received: from mx1.redhat.com ([209.132.183.28]:53390) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dGl7Y-0007ma-U5 for qemu-devel@nongnu.org; Fri, 02 Jun 2017 07:52:01 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E04D47AE81 for ; Fri, 2 Jun 2017 11:51:59 +0000 (UTC) Received: from pxdev.xzpeter.org.com (ovpn-12-63.pek2.redhat.com [10.72.12.63]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7B07777A3F; Fri, 2 Jun 2017 11:51:52 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com E04D47AE81 Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=peterx@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com E04D47AE81 From: Peter Xu To: qemu-devel@nongnu.org Date: Fri, 2 Jun 2017 19:50:54 +0800 Message-Id: <1496404254-17429-4-git-send-email-peterx@redhat.com> In-Reply-To: <1496404254-17429-1-git-send-email-peterx@redhat.com> References: <1496404254-17429-1-git-send-email-peterx@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Fri, 02 Jun 2017 11:52:00 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 3/3] vhost: iommu: cache static mapping if there is X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , Maxime Coquelin , Jason Wang , peterx@redhat.com, "Michael S . Tsirkin" Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This patch pre-heat vhost iotlb cache when passthrough mode enabled. Sometimes, even if user specified iommu_platform for vhost devices, IOMMU might still be disabled. One case is passthrough mode in VT-d implementation. We can detect this by observing iommu_list. If it's empty, it means IOMMU translation is disabled, then we can actually pre-heat the translation (it'll be static mapping then) by first invalidating all IOTLB, then cache existing memory ranges into vhost backend iotlb using 1:1 mapping. Reviewed-by: Jason Wang Signed-off-by: Peter Xu --- hw/virtio/trace-events | 4 +++ hw/virtio/vhost.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 70 insertions(+) diff --git a/hw/virtio/trace-events b/hw/virtio/trace-events index 1f7a7c1..54dcbb3 100644 --- a/hw/virtio/trace-events +++ b/hw/virtio/trace-events @@ -24,3 +24,7 @@ virtio_balloon_handle_output(const char *name, uint64_t g= pa) "section name: %s g virtio_balloon_get_config(uint32_t num_pages, uint32_t actual) "num_pages:= %d actual: %d" virtio_balloon_set_config(uint32_t actual, uint32_t oldactual) "actual: %d= oldactual: %d" virtio_balloon_to_target(uint64_t target, uint32_t num_pages) "balloon tar= get: %"PRIx64" num_pages: %d" + +# hw/virtio/vhost.c +vhost_iommu_commit(void) "" +vhost_iommu_static_preheat(void) "" diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index 03a46a7..d03d720 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -27,6 +27,7 @@ #include "hw/virtio/virtio-access.h" #include "migration/blocker.h" #include "sysemu/dma.h" +#include "trace.h" =20 /* enabled until disconnected backend stabilizes */ #define _VHOST_DEBUG 1 @@ -730,6 +731,11 @@ static void vhost_iommu_unmap_notify(IOMMUNotifier *n,= IOMMUTLBEntry *iotlb) } } =20 +static bool vhost_iommu_mr_enabled(struct vhost_dev *dev) +{ + return !QLIST_EMPTY(&dev->iommu_list); +} + static void vhost_iommu_region_add(MemoryListener *listener, MemoryRegionSection *section) { @@ -782,6 +788,65 @@ static void vhost_iommu_region_del(MemoryListener *lis= tener, } } =20 +static void vhost_iommu_commit(MemoryListener *listener) +{ + struct vhost_dev *dev =3D container_of(listener, struct vhost_dev, + iommu_listener); + struct vhost_memory_region *r; + int i; + + trace_vhost_iommu_commit(); + + if (!vhost_iommu_mr_enabled(dev)) { + /* + * This means iommu_platform is enabled, however iommu memory + * region is disabled, e.g., when device passthrough is setup. + * Then, no translation is needed any more. + * + * Let's first invalidate the whole IOTLB, then pre-heat the + * static mapping by looping over vhost memory ranges. + */ + + if (dev->vhost_ops->vhost_invalidate_device_iotlb(dev, 0, + UINT64_MAX)) { + error_report("%s: flush existing IOTLB failed", __func__); + return; + } + + /* + * Current VHOST_IOTLB_INVALIDATE API has a small defect that + * the invalidation for (start=3D0, size=3DUINT64_MAX) cannot + * really invalidate an cached range of (start=3DUINT64_MAX-1, + * size=3D1). We send this 2nd invalidation to workaround this. + * But, frankly speaking for QEMU we don't have a problem with + * this since we will never have a vhost cache with range + * (start=3DUINT64_MAX-1, size=3D1) - if you see + * address_space_get_iotlb_entry() all IOTLBs are page + * aligned. + */ + if (dev->vhost_ops->vhost_invalidate_device_iotlb(dev, UINT64_MAX, + 1)) { + error_report("%s: flush existing IOTLB failed", __func__); + return; + } + + for (i =3D 0; i < dev->mem->nregions; i++) { + r =3D &dev->mem->regions[i]; + /* Vhost regions are writable RAM, so IOMMU_RW suites. */ + if (dev->vhost_ops->vhost_update_device_iotlb(dev, + r->guest_phys_ad= dr, + r->userspace_add= r, + r->memory_size, + IOMMU_RW)) { + error_report("%s: pre-heat static mapping failed", __func_= _); + return; + } + } + + trace_vhost_iommu_static_preheat(); + } +} + static void vhost_region_nop(MemoryListener *listener, MemoryRegionSection *section) { @@ -1298,6 +1363,7 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opaq= ue, hdev->iommu_listener =3D (MemoryListener) { .region_add =3D vhost_iommu_region_add, .region_del =3D vhost_iommu_region_del, + .commit =3D vhost_iommu_commit, }; =20 if (hdev->migration_blocker =3D=3D NULL) { --=20 2.7.4