From: Eric Auger <eric.auger@redhat.com> To: eric.auger.pro@gmail.com, eric.auger@redhat.com, qemu-devel@nongnu.org, qemu-arm@nongnu.org, peter.maydell@linaro.org Cc: alex.williamson@redhat.com, mst@redhat.com, jean-philippe.brucker@arm.com, peterx@redhat.com, yi.l.liu@intel.com, vincent.stehle@arm.com Subject: [Qemu-devel] [RFC v3 01/27] hw/arm/smmuv3: Remove SMMUNotifierNode Date: Fri, 12 Apr 2019 12:03:28 +0200 [thread overview] Message-ID: <20190412100354.6409-2-eric.auger@redhat.com> (raw) In-Reply-To: <20190412100354.6409-1-eric.auger@redhat.com> The SMMUNotifierNode struct is not necessary and brings extra complexity so let's remove it. We now directly track the SMMUDevices which have registered IOMMU MR notifiers. This is inspired from the same transformation on intel-iommu done in commit b4a4ba0d68f50f218ee3957b6638dbee32a5eeef ("intel-iommu: remove IntelIOMMUNotifierNode") Signed-off-by: Eric Auger <eric.auger@redhat.com> --- hw/arm/smmu-common.c | 6 +++--- hw/arm/smmuv3.c | 28 +++++++--------------------- include/hw/arm/smmu-common.h | 8 ++------ 3 files changed, 12 insertions(+), 30 deletions(-) diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c index bbf4b8721a..e94be6db6c 100644 --- a/hw/arm/smmu-common.c +++ b/hw/arm/smmu-common.c @@ -412,10 +412,10 @@ inline void smmu_inv_notifiers_mr(IOMMUMemoryRegion *mr) /* Unmap all notifiers of all mr's */ void smmu_inv_notifiers_all(SMMUState *s) { - SMMUNotifierNode *node; + SMMUDevice *sdev; - QLIST_FOREACH(node, &s->notifiers_list, next) { - smmu_inv_notifiers_mr(&node->sdev->iommu); + QLIST_FOREACH(sdev, &s->devices_with_notifiers, next) { + smmu_inv_notifiers_mr(&sdev->iommu); } } diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c index 8c4e99fecc..fd8ec7860e 100644 --- a/hw/arm/smmuv3.c +++ b/hw/arm/smmuv3.c @@ -828,10 +828,10 @@ static void smmuv3_notify_iova(IOMMUMemoryRegion *mr, /* invalidate an asid/iova tuple in all mr's */ static void smmuv3_inv_notifiers_iova(SMMUState *s, int asid, dma_addr_t iova) { - SMMUNotifierNode *node; + SMMUDevice *sdev; - QLIST_FOREACH(node, &s->notifiers_list, next) { - IOMMUMemoryRegion *mr = &node->sdev->iommu; + QLIST_FOREACH(sdev, &s->devices_with_notifiers, next) { + IOMMUMemoryRegion *mr = &sdev->iommu; IOMMUNotifier *n; trace_smmuv3_inv_notifiers_iova(mr->parent_obj.name, asid, iova); @@ -1472,8 +1472,6 @@ static void smmuv3_notify_flag_changed(IOMMUMemoryRegion *iommu, SMMUDevice *sdev = container_of(iommu, SMMUDevice, iommu); SMMUv3State *s3 = sdev->smmu; SMMUState *s = &(s3->smmu_state); - SMMUNotifierNode *node = NULL; - SMMUNotifierNode *next_node = NULL; if (new & IOMMU_NOTIFIER_MAP) { int bus_num = pci_bus_num(sdev->bus); @@ -1485,22 +1483,10 @@ static void smmuv3_notify_flag_changed(IOMMUMemoryRegion *iommu, if (old == IOMMU_NOTIFIER_NONE) { trace_smmuv3_notify_flag_add(iommu->parent_obj.name); - node = g_malloc0(sizeof(*node)); - node->sdev = sdev; - QLIST_INSERT_HEAD(&s->notifiers_list, node, next); - return; - } - - /* update notifier node with new flags */ - QLIST_FOREACH_SAFE(node, &s->notifiers_list, next, next_node) { - if (node->sdev == sdev) { - if (new == IOMMU_NOTIFIER_NONE) { - trace_smmuv3_notify_flag_del(iommu->parent_obj.name); - QLIST_REMOVE(node, next); - g_free(node); - } - return; - } + QLIST_INSERT_HEAD(&s->devices_with_notifiers, sdev, next); + } else if (new == IOMMU_NOTIFIER_NONE) { + trace_smmuv3_notify_flag_del(iommu->parent_obj.name); + QLIST_REMOVE(sdev, next); } } diff --git a/include/hw/arm/smmu-common.h b/include/hw/arm/smmu-common.h index b07cadd0ef..2c7fbf4202 100644 --- a/include/hw/arm/smmu-common.h +++ b/include/hw/arm/smmu-common.h @@ -80,13 +80,9 @@ typedef struct SMMUDevice { AddressSpace as; uint32_t cfg_cache_hits; uint32_t cfg_cache_misses; + QLIST_ENTRY(SMMUDevice) next; } SMMUDevice; -typedef struct SMMUNotifierNode { - SMMUDevice *sdev; - QLIST_ENTRY(SMMUNotifierNode) next; -} SMMUNotifierNode; - typedef struct SMMUPciBus { PCIBus *bus; SMMUDevice *pbdev[0]; /* Parent array is sparse, so dynamically alloc */ @@ -108,7 +104,7 @@ typedef struct SMMUState { GHashTable *iotlb; SMMUPciBus *smmu_pcibus_by_bus_num[SMMU_PCI_BUS_MAX]; PCIBus *pci_bus; - QLIST_HEAD(, SMMUNotifierNode) notifiers_list; + QLIST_HEAD(, SMMUDevice) devices_with_notifiers; uint8_t bus_num; PCIBus *primary_bus; } SMMUState; -- 2.20.1
WARNING: multiple messages have this Message-ID (diff)
From: Eric Auger <eric.auger@redhat.com> To: eric.auger.pro@gmail.com, eric.auger@redhat.com, qemu-devel@nongnu.org, qemu-arm@nongnu.org, peter.maydell@linaro.org Cc: yi.l.liu@intel.com, mst@redhat.com, jean-philippe.brucker@arm.com, peterx@redhat.com, alex.williamson@redhat.com, vincent.stehle@arm.com Subject: [Qemu-devel] [RFC v3 01/27] hw/arm/smmuv3: Remove SMMUNotifierNode Date: Fri, 12 Apr 2019 12:03:28 +0200 [thread overview] Message-ID: <20190412100354.6409-2-eric.auger@redhat.com> (raw) Message-ID: <20190412100328.o1LDafiXY4BHMCMSOEDXjsCon1kc5LVSOU-ZjoHPqt8@z> (raw) In-Reply-To: <20190412100354.6409-1-eric.auger@redhat.com> The SMMUNotifierNode struct is not necessary and brings extra complexity so let's remove it. We now directly track the SMMUDevices which have registered IOMMU MR notifiers. This is inspired from the same transformation on intel-iommu done in commit b4a4ba0d68f50f218ee3957b6638dbee32a5eeef ("intel-iommu: remove IntelIOMMUNotifierNode") Signed-off-by: Eric Auger <eric.auger@redhat.com> --- hw/arm/smmu-common.c | 6 +++--- hw/arm/smmuv3.c | 28 +++++++--------------------- include/hw/arm/smmu-common.h | 8 ++------ 3 files changed, 12 insertions(+), 30 deletions(-) diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c index bbf4b8721a..e94be6db6c 100644 --- a/hw/arm/smmu-common.c +++ b/hw/arm/smmu-common.c @@ -412,10 +412,10 @@ inline void smmu_inv_notifiers_mr(IOMMUMemoryRegion *mr) /* Unmap all notifiers of all mr's */ void smmu_inv_notifiers_all(SMMUState *s) { - SMMUNotifierNode *node; + SMMUDevice *sdev; - QLIST_FOREACH(node, &s->notifiers_list, next) { - smmu_inv_notifiers_mr(&node->sdev->iommu); + QLIST_FOREACH(sdev, &s->devices_with_notifiers, next) { + smmu_inv_notifiers_mr(&sdev->iommu); } } diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c index 8c4e99fecc..fd8ec7860e 100644 --- a/hw/arm/smmuv3.c +++ b/hw/arm/smmuv3.c @@ -828,10 +828,10 @@ static void smmuv3_notify_iova(IOMMUMemoryRegion *mr, /* invalidate an asid/iova tuple in all mr's */ static void smmuv3_inv_notifiers_iova(SMMUState *s, int asid, dma_addr_t iova) { - SMMUNotifierNode *node; + SMMUDevice *sdev; - QLIST_FOREACH(node, &s->notifiers_list, next) { - IOMMUMemoryRegion *mr = &node->sdev->iommu; + QLIST_FOREACH(sdev, &s->devices_with_notifiers, next) { + IOMMUMemoryRegion *mr = &sdev->iommu; IOMMUNotifier *n; trace_smmuv3_inv_notifiers_iova(mr->parent_obj.name, asid, iova); @@ -1472,8 +1472,6 @@ static void smmuv3_notify_flag_changed(IOMMUMemoryRegion *iommu, SMMUDevice *sdev = container_of(iommu, SMMUDevice, iommu); SMMUv3State *s3 = sdev->smmu; SMMUState *s = &(s3->smmu_state); - SMMUNotifierNode *node = NULL; - SMMUNotifierNode *next_node = NULL; if (new & IOMMU_NOTIFIER_MAP) { int bus_num = pci_bus_num(sdev->bus); @@ -1485,22 +1483,10 @@ static void smmuv3_notify_flag_changed(IOMMUMemoryRegion *iommu, if (old == IOMMU_NOTIFIER_NONE) { trace_smmuv3_notify_flag_add(iommu->parent_obj.name); - node = g_malloc0(sizeof(*node)); - node->sdev = sdev; - QLIST_INSERT_HEAD(&s->notifiers_list, node, next); - return; - } - - /* update notifier node with new flags */ - QLIST_FOREACH_SAFE(node, &s->notifiers_list, next, next_node) { - if (node->sdev == sdev) { - if (new == IOMMU_NOTIFIER_NONE) { - trace_smmuv3_notify_flag_del(iommu->parent_obj.name); - QLIST_REMOVE(node, next); - g_free(node); - } - return; - } + QLIST_INSERT_HEAD(&s->devices_with_notifiers, sdev, next); + } else if (new == IOMMU_NOTIFIER_NONE) { + trace_smmuv3_notify_flag_del(iommu->parent_obj.name); + QLIST_REMOVE(sdev, next); } } diff --git a/include/hw/arm/smmu-common.h b/include/hw/arm/smmu-common.h index b07cadd0ef..2c7fbf4202 100644 --- a/include/hw/arm/smmu-common.h +++ b/include/hw/arm/smmu-common.h @@ -80,13 +80,9 @@ typedef struct SMMUDevice { AddressSpace as; uint32_t cfg_cache_hits; uint32_t cfg_cache_misses; + QLIST_ENTRY(SMMUDevice) next; } SMMUDevice; -typedef struct SMMUNotifierNode { - SMMUDevice *sdev; - QLIST_ENTRY(SMMUNotifierNode) next; -} SMMUNotifierNode; - typedef struct SMMUPciBus { PCIBus *bus; SMMUDevice *pbdev[0]; /* Parent array is sparse, so dynamically alloc */ @@ -108,7 +104,7 @@ typedef struct SMMUState { GHashTable *iotlb; SMMUPciBus *smmu_pcibus_by_bus_num[SMMU_PCI_BUS_MAX]; PCIBus *pci_bus; - QLIST_HEAD(, SMMUNotifierNode) notifiers_list; + QLIST_HEAD(, SMMUDevice) devices_with_notifiers; uint8_t bus_num; PCIBus *primary_bus; } SMMUState; -- 2.20.1
next prev parent reply other threads:[~2019-04-12 10:04 UTC|newest] Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-04-12 10:03 [Qemu-devel] [RFC v3 00/27] vSMMUv3/pSMMUv3 2 stage VFIO integration Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` Eric Auger [this message] 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 01/27] hw/arm/smmuv3: Remove SMMUNotifierNode Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 02/27] vfio/common: Introduce vfio_set_irq_signaling helper Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 03/27] update-linux-headers: Import iommu.h Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 04/27] header update against 5.1-rc3 and IOMMU/VFIO nested stage APIs Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 05/27] memory: add IOMMU_ATTR_VFIO_NESTED IOMMU memory region attribute Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 06/27] memory: add IOMMU_ATTR_MSI_TRANSLATE " Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 07/27] hw/arm/smmuv3: Advertise VFIO_NESTED and MSI_TRANSLATE attributes Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 08/27] hw/vfio/common: Force nested if iommu requires it Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 09/27] memory: Prepare for different kinds of IOMMU MR notifiers Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 10/27] memory: Add IOMMUConfigNotifier Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 11/27] memory: Add arch_id and leaf fields in IOTLBEntry Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 12/27] hw/arm/smmuv3: Store the PASID table GPA in the translation config Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 13/27] hw/arm/smmuv3: Implement dummy replay Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 14/27] hw/arm/smmuv3: Fill the IOTLBEntry arch_id on NH_VA invalidation Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 15/27] hw/arm/smmuv3: Fill the IOTLBEntry leaf field " Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 16/27] hw/arm/smmuv3: Notify on config changes Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 17/27] hw/vfio/common: Introduce vfio_alloc_guest_iommu helper Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 18/27] hw/vfio/common: Introduce hostwin_from_range helper Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 19/27] hw/vfio/common: Introduce helpers to DMA map/unap a RAM section Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 20/27] hw/vfio/common: Setup nested stage mappings Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 21/27] hw/vfio/common: Register a MAP notifier for MSI binding Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 22/27] vfio-pci: Expose MSI stage 1 bindings to the host Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 23/27] memory: Introduce IOMMU Memory Region inject_faults API Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 24/27] hw/arm/smmuv3: Implement fault injection Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 25/27] vfio-pci: register handler for iommu fault Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 26/27] vfio-pci: Set up fault regions Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:03 ` [Qemu-devel] [RFC v3 27/27] vfio-pci: Implement the DMA fault handler Eric Auger 2019-04-12 10:03 ` Eric Auger 2019-04-12 10:46 ` [Qemu-devel] [RFC v3 00/27] vSMMUv3/pSMMUv3 2 stage VFIO integration no-reply 2019-04-12 10:46 ` no-reply
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=20190412100354.6409-2-eric.auger@redhat.com \ --to=eric.auger@redhat.com \ --cc=alex.williamson@redhat.com \ --cc=eric.auger.pro@gmail.com \ --cc=jean-philippe.brucker@arm.com \ --cc=mst@redhat.com \ --cc=peter.maydell@linaro.org \ --cc=peterx@redhat.com \ --cc=qemu-arm@nongnu.org \ --cc=qemu-devel@nongnu.org \ --cc=vincent.stehle@arm.com \ --cc=yi.l.liu@intel.com \ /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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.