From nobody Wed Nov 5 18:45:23 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.zohomail.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; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1535812813598102.16478710603212; Sat, 1 Sep 2018 07:40:13 -0700 (PDT) Received: from localhost ([::1]:37431 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fw74E-0004La-0L for importer@patchew.org; Sat, 01 Sep 2018 10:40:02 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55150) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fw6qO-0006PL-LU for qemu-devel@nongnu.org; Sat, 01 Sep 2018 10:25:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fw6oa-0005ap-H4 for qemu-devel@nongnu.org; Sat, 01 Sep 2018 10:23:53 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:51124 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 1fw6oZ-0005ZG-1V; Sat, 01 Sep 2018 10:23:51 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A37E385756; Sat, 1 Sep 2018 14:23:50 +0000 (UTC) Received: from laptop.redhat.com (ovpn-116-157.ams2.redhat.com [10.36.116.157]) by smtp.corp.redhat.com (Postfix) with ESMTP id C2B062166B41; Sat, 1 Sep 2018 14:23:48 +0000 (UTC) From: Eric Auger To: eric.auger.pro@gmail.com, eric.auger@redhat.com, qemu-devel@nongnu.org, qemu-arm@nongnu.org, peter.maydell@linaro.org Date: Sat, 1 Sep 2018 16:23:00 +0200 Message-Id: <20180901142312.11662-9-eric.auger@redhat.com> In-Reply-To: <20180901142312.11662-1-eric.auger@redhat.com> References: <20180901142312.11662-1-eric.auger@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Sat, 01 Sep 2018 14:23:50 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Sat, 01 Sep 2018 14:23:50 +0000 (UTC) for IP:'10.11.54.6' DOMAIN:'int-mx06.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'eric.auger@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [RFC 08/20] memory: Introduce IOMMUIOLTBNotifier 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: yi.l.liu@intel.com, cdall@kernel.org, mst@redhat.com, jean-philippe.brucker@arm.com, peterx@redhat.com, alex.williamson@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RDMRC_1 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Current IOMMUNotifiers dedicate to IOTLB related notifications. We want to introduce notifiers for virtual IOMMU config changes. Let's create a new IOMMUIOLTBNotifier datatype. This paves the way to the introduction of an IOMMUConfigNotifier. IOMMUNotifier now has an iotlb_notifier field. We change all calling sites. We also rename IOMMU_NOTIFIER_ALL into IOMMU_NOTIFIER_IOTLB_ALL Signed-off-by: Eric Auger --- exec.c | 12 ++++++------ hw/arm/smmu-common.c | 4 ++-- hw/i386/intel_iommu.c | 6 +++--- hw/vfio/common.c | 12 ++++++------ hw/virtio/vhost.c | 12 ++++++------ include/exec/memory.h | 25 +++++++++++++++---------- memory.c | 10 +++++----- 7 files changed, 43 insertions(+), 38 deletions(-) diff --git a/exec.c b/exec.c index 6826c8337d..1411660289 100644 --- a/exec.c +++ b/exec.c @@ -683,12 +683,12 @@ static void tcg_register_iommu_notifier(CPUState *cpu, * just register interest in the whole thing, on the assumption * that iommu reconfiguration will be rare. */ - iommu_notifier_init(¬ifier->n, - tcg_iommu_unmap_notify, - IOMMU_NOTIFIER_UNMAP, - 0, - HWADDR_MAX, - iommu_idx); + iommu_iotlb_notifier_init(¬ifier->n, + tcg_iommu_unmap_notify, + IOMMU_NOTIFIER_UNMAP, + 0, + HWADDR_MAX, + iommu_idx); memory_region_register_iommu_notifier(notifier->mr, ¬ifier->n); } =20 diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c index 3f55cfd193..ad6ef2135b 100644 --- a/hw/arm/smmu-common.c +++ b/hw/arm/smmu-common.c @@ -391,9 +391,9 @@ static void smmu_unmap_notifier_range(IOMMUNotifier *n) IOMMUTLBEntry entry; =20 entry.target_as =3D &address_space_memory; - entry.iova =3D n->start; + entry.iova =3D n->iotlb_notifier.start; entry.perm =3D IOMMU_NONE; - entry.addr_mask =3D n->end - n->start; + entry.addr_mask =3D n->iotlb_notifier.end - n->iotlb_notifier.start; =20 memory_region_notify_one(n, &entry); } diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c index 0a8cd4e9cc..7acbd6b21e 100644 --- a/hw/i386/intel_iommu.c +++ b/hw/i386/intel_iommu.c @@ -2947,8 +2947,8 @@ static void vtd_address_space_unmap(VTDAddressSpace *= as, IOMMUNotifier *n) { IOMMUTLBEntry entry; hwaddr size; - hwaddr start =3D n->start; - hwaddr end =3D n->end; + hwaddr start =3D n->iotlb_notifier.start; + hwaddr end =3D n->iotlb_notifier.end; IntelIOMMUState *s =3D as->iommu_state; DMAMap map; =20 @@ -2984,7 +2984,7 @@ static void vtd_address_space_unmap(VTDAddressSpace *= as, IOMMUNotifier *n) =20 entry.target_as =3D &address_space_memory; /* Adjust iova for the size */ - entry.iova =3D n->start & ~(size - 1); + entry.iova =3D n->iotlb_notifier.start & ~(size - 1); /* This field is meaningless for unmap */ entry.translated_addr =3D 0; entry.perm =3D IOMMU_NONE; diff --git a/hw/vfio/common.c b/hw/vfio/common.c index 53ff7a6b39..b6673fcf49 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -527,11 +527,11 @@ static void vfio_listener_region_add(MemoryListener *= listener, llend =3D int128_sub(llend, int128_one()); iommu_idx =3D memory_region_iommu_attrs_to_index(iommu_mr, MEMTXATTRS_UNSPECIF= IED); - iommu_notifier_init(&giommu->n, vfio_iommu_map_notify, - IOMMU_NOTIFIER_ALL, - section->offset_within_region, - int128_get64(llend), - iommu_idx); + iommu_iotlb_notifier_init(&giommu->n, vfio_iommu_map_notify, + IOMMU_NOTIFIER_IOTLB_ALL, + section->offset_within_region, + int128_get64(llend), + iommu_idx); QLIST_INSERT_HEAD(&container->giommu_list, giommu, giommu_next); =20 memory_region_register_iommu_notifier(section->mr, &giommu->n); @@ -625,7 +625,7 @@ static void vfio_listener_region_del(MemoryListener *li= stener, =20 QLIST_FOREACH(giommu, &container->giommu_list, giommu_next) { if (MEMORY_REGION(giommu->iommu) =3D=3D section->mr && - giommu->n.start =3D=3D section->offset_within_region) { + giommu->n.iotlb_notifier.start =3D=3D section->offset_with= in_region) { memory_region_unregister_iommu_notifier(section->mr, &giommu->n); QLIST_REMOVE(giommu, giommu_next); diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index d4cb5894a8..c21b9b8be9 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -677,11 +677,11 @@ static void vhost_iommu_region_add(MemoryListener *li= stener, end =3D int128_sub(end, int128_one()); iommu_idx =3D memory_region_iommu_attrs_to_index(iommu_mr, MEMTXATTRS_UNSPECIFIED); - iommu_notifier_init(&iommu->n, vhost_iommu_unmap_notify, - IOMMU_NOTIFIER_UNMAP, - section->offset_within_region, - int128_get64(end), - iommu_idx); + iommu_iotlb_notifier_init(&iommu->n, vhost_iommu_unmap_notify, + IOMMU_NOTIFIER_UNMAP, + section->offset_within_region, + int128_get64(end), + iommu_idx); iommu->mr =3D section->mr; iommu->iommu_offset =3D section->offset_within_address_space - section->offset_within_region; @@ -704,7 +704,7 @@ static void vhost_iommu_region_del(MemoryListener *list= ener, =20 QLIST_FOREACH(iommu, &dev->iommu_list, iommu_next) { if (iommu->mr =3D=3D section->mr && - iommu->n.start =3D=3D section->offset_within_region) { + iommu->n.iotlb_notifier.start =3D=3D section->offset_within_re= gion) { memory_region_unregister_iommu_notifier(iommu->mr, &iommu->n); QLIST_REMOVE(iommu, iommu_next); diff --git a/include/exec/memory.h b/include/exec/memory.h index b6e59c139c..31fc859c6b 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -86,18 +86,22 @@ typedef enum { IOMMU_NOTIFIER_MAP =3D 0x2, } IOMMUNotifierFlag; =20 -#define IOMMU_NOTIFIER_ALL (IOMMU_NOTIFIER_MAP | IOMMU_NOTIFIER_UNMAP) +#define IOMMU_NOTIFIER_IOTLB_ALL (IOMMU_NOTIFIER_MAP | IOMMU_NOTIFIER_UNMA= P) =20 struct IOMMUNotifier; typedef void (*IOMMUNotify)(struct IOMMUNotifier *notifier, IOMMUTLBEntry *data); =20 -struct IOMMUNotifier { +typedef struct IOMMUIOLTBNotifier { IOMMUNotify notify; - IOMMUNotifierFlag notifier_flags; /* Notify for address space range start <=3D addr <=3D end */ hwaddr start; hwaddr end; +} IOMMUIOLTBNotifier; + +struct IOMMUNotifier { + IOMMUNotifierFlag notifier_flags; + IOMMUIOLTBNotifier iotlb_notifier; int iommu_idx; QLIST_ENTRY(IOMMUNotifier) node; }; @@ -126,15 +130,16 @@ typedef struct IOMMUNotifier IOMMUNotifier; /* RAM is a persistent kind memory */ #define RAM_PMEM (1 << 5) =20 -static inline void iommu_notifier_init(IOMMUNotifier *n, IOMMUNotify fn, - IOMMUNotifierFlag flags, - hwaddr start, hwaddr end, - int iommu_idx) +static inline void iommu_iotlb_notifier_init(IOMMUNotifier *n, IOMMUNotify= fn, + IOMMUNotifierFlag flags, + hwaddr start, hwaddr end, + int iommu_idx) { - n->notify =3D fn; + assert(flags & IOMMU_NOTIFIER_MAP || flags & IOMMU_NOTIFIER_UNMAP); n->notifier_flags =3D flags; - n->start =3D start; - n->end =3D end; + n->iotlb_notifier.notify =3D fn; + n->iotlb_notifier.start =3D start; + n->iotlb_notifier.end =3D end; n->iommu_idx =3D iommu_idx; } =20 diff --git a/memory.c b/memory.c index 9b73892768..b7e2e43b68 100644 --- a/memory.c +++ b/memory.c @@ -1800,7 +1800,7 @@ void memory_region_register_iommu_notifier(MemoryRegi= on *mr, /* We need to register for at least one bitfield */ iommu_mr =3D IOMMU_MEMORY_REGION(mr); assert(n->notifier_flags !=3D IOMMU_NOTIFIER_NONE); - assert(n->start <=3D n->end); + assert(n->iotlb_notifier.start <=3D n->iotlb_notifier.end); assert(n->iommu_idx >=3D 0 && n->iommu_idx < memory_region_iommu_num_indexes(iommu_mr)); =20 @@ -1836,7 +1836,7 @@ void memory_region_iommu_replay(IOMMUMemoryRegion *io= mmu_mr, IOMMUNotifier *n) for (addr =3D 0; addr < memory_region_size(mr); addr +=3D granularity)= { iotlb =3D imrc->translate(iommu_mr, addr, IOMMU_NONE, n->iommu_idx= ); if (iotlb.perm !=3D IOMMU_NONE) { - n->notify(n, &iotlb); + n->iotlb_notifier.notify(n, &iotlb); } =20 /* if (2^64 - MR size) < granularity, it's possible to get an @@ -1879,8 +1879,8 @@ void memory_region_notify_one(IOMMUNotifier *notifier, * Skip the notification if the notification does not overlap * with registered range. */ - if (notifier->start > entry->iova + entry->addr_mask || - notifier->end < entry->iova) { + if (notifier->iotlb_notifier.start > entry->iova + entry->addr_mask || + notifier->iotlb_notifier.end < entry->iova) { return; } =20 @@ -1891,7 +1891,7 @@ void memory_region_notify_one(IOMMUNotifier *notifier, } =20 if (notifier->notifier_flags & request_flags) { - notifier->notify(notifier, entry); + notifier->iotlb_notifier.notify(notifier, entry); } } =20 --=20 2.17.1