From: Alexey Kardashevskiy <aik@ozlabs.ru>
To: David Gibson <david@gibson.dropbear.id.au>,
alex.williamson@redhat.com, gwshan@linux.vnet.ibm.com
Cc: lvivier@redhat.com, pbonzini@redhat.com, thuth@redhat.com,
qemu-ppc@nongnu.org, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [RFC PATCH 01/10] vfio: Remove unneeded union from VFIOContainer
Date: Fri, 18 Sep 2015 16:15:27 +1000 [thread overview]
Message-ID: <55FBABFF.5000002@ozlabs.ru> (raw)
In-Reply-To: <1442495357-26547-2-git-send-email-david@gibson.dropbear.id.au>
On 09/17/2015 11:09 PM, David Gibson wrote:
> Currently the VFIOContainer iommu_data field contains a union with
> different information for different host iommu types. However:
> * It only actually contains information for the x86-like "Type1" iommu
> * Because we have a common listener the Type1 fields are actually used
> on all IOMMU types, including the SPAPR TCE type as well
> * There's no tag in the VFIOContainer to tell you which union member is
> valid anyway.
>
> In fact we now have a general structure for the listener which is unlikely
> to ever need per-iommu-type information, so this patch removes the union.
>
> In a similar way we can unify the setup of the vfio memory listener in
> vfio_connect_container() that is currently split across a switch on iommu
> type, but is effectively the same in both cases.
>
> The iommu_data.release pointer was only needed as a cleanup function
> which would handle potentially different data in the union. With the
> union gone, it too can be removed.
>
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> ---
> hw/vfio/common.c | 51 +++++++++++++++++--------------------------
> include/hw/vfio/vfio-common.h | 14 +++---------
> 2 files changed, 23 insertions(+), 42 deletions(-)
>
> diff --git a/hw/vfio/common.c b/hw/vfio/common.c
> index 6d21311..e3152f6 100644
> --- a/hw/vfio/common.c
> +++ b/hw/vfio/common.c
> @@ -316,7 +316,7 @@ static void vfio_listener_region_add(MemoryListener *listener,
> MemoryRegionSection *section)
> {
> VFIOContainer *container = container_of(listener, VFIOContainer,
> - iommu_data.type1.listener);
> + iommu_data.listener);
> hwaddr iova, end;
> Int128 llend;
> void *vaddr;
> @@ -406,9 +406,9 @@ static void vfio_listener_region_add(MemoryListener *listener,
> * can gracefully fail. Runtime, there's not much we can do other
> * than throw a hardware error.
> */
> - if (!container->iommu_data.type1.initialized) {
> - if (!container->iommu_data.type1.error) {
> - container->iommu_data.type1.error = ret;
> + if (!container->iommu_data.initialized) {
> + if (!container->iommu_data.error) {
> + container->iommu_data.error = ret;
> }
> } else {
> hw_error("vfio: DMA mapping failed, unable to continue");
> @@ -420,7 +420,7 @@ static void vfio_listener_region_del(MemoryListener *listener,
> MemoryRegionSection *section)
> {
> VFIOContainer *container = container_of(listener, VFIOContainer,
> - iommu_data.type1.listener);
> + iommu_data.listener);
> hwaddr iova, end;
> int ret;
>
> @@ -485,7 +485,7 @@ static const MemoryListener vfio_memory_listener = {
>
> static void vfio_listener_release(VFIOContainer *container)
> {
> - memory_listener_unregister(&container->iommu_data.type1.listener);
> + memory_listener_unregister(&container->iommu_data.listener);
> }
>
> int vfio_mmap_region(Object *obj, VFIORegion *region,
> @@ -683,21 +683,6 @@ static int vfio_connect_container(VFIOGroup *group, AddressSpace *as)
> ret = -errno;
> goto free_container_exit;
> }
> -
> - container->iommu_data.type1.listener = vfio_memory_listener;
> - container->iommu_data.release = vfio_listener_release;
> -
> - memory_listener_register(&container->iommu_data.type1.listener,
> - container->space->as);
> -
> - if (container->iommu_data.type1.error) {
> - ret = container->iommu_data.type1.error;
> - error_report("vfio: memory listener initialization failed for container");
> - goto listener_release_exit;
> - }
> -
> - container->iommu_data.type1.initialized = true;
> -
> } else if (ioctl(fd, VFIO_CHECK_EXTENSION, VFIO_SPAPR_TCE_IOMMU)) {
> ret = ioctl(group->fd, VFIO_GROUP_SET_CONTAINER, &fd);
> if (ret) {
> @@ -723,19 +708,25 @@ static int vfio_connect_container(VFIOGroup *group, AddressSpace *as)
> ret = -errno;
> goto free_container_exit;
> }
> -
> - container->iommu_data.type1.listener = vfio_memory_listener;
> - container->iommu_data.release = vfio_listener_release;
> -
> - memory_listener_register(&container->iommu_data.type1.listener,
> - container->space->as);
> -
> } else {
> error_report("vfio: No available IOMMU models");
> ret = -EINVAL;
> goto free_container_exit;
> }
>
> + container->iommu_data.listener = vfio_memory_listener;
> +
> + memory_listener_register(&container->iommu_data.listener,
> + container->space->as);
> +
> + if (container->iommu_data.error) {
> + ret = container->iommu_data.error;
> + error_report("vfio: memory listener initialization failed for container");
> + goto listener_release_exit;
> + }
> +
> + container->iommu_data.initialized = true;
> +
> QLIST_INIT(&container->group_list);
> QLIST_INSERT_HEAD(&space->containers, container, next);
>
> @@ -774,9 +765,7 @@ static void vfio_disconnect_container(VFIOGroup *group)
> VFIOAddressSpace *space = container->space;
> VFIOGuestIOMMU *giommu, *tmp;
>
> - if (container->iommu_data.release) {
> - container->iommu_data.release(container);
> - }
> + vfio_listener_release(container);
> QLIST_REMOVE(container, next);
>
> QLIST_FOREACH_SAFE(giommu, &container->giommu_list, giommu_next, tmp) {
> diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h
> index 59a321d..aff18cd 100644
> --- a/include/hw/vfio/vfio-common.h
> +++ b/include/hw/vfio/vfio-common.h
> @@ -64,21 +64,13 @@ typedef struct VFIOAddressSpace {
>
> struct VFIOGroup;
>
> -typedef struct VFIOType1 {
> - MemoryListener listener;
> - int error;
> - bool initialized;
> -} VFIOType1;
> -
> typedef struct VFIOContainer {
> VFIOAddressSpace *space;
> int fd; /* /dev/vfio/vfio, empowered by the attached groups */
> struct {
> - /* enable abstraction to support various iommu backends */
> - union {
> - VFIOType1 type1;
> - };
> - void (*release)(struct VFIOContainer *);
> + MemoryListener listener;
> + int error;
> + bool initialized;
> } iommu_data;
The only difference to my patch - "[RFC PATCH qemu 2/4] vfio: Generalize
IOMMU memory listener" - is that you keep iommu_data struct which was
supposed to have an union for type1/spapr/etc IOMMU data but this is gone.
What is its purpose now?
> QLIST_HEAD(, VFIOGuestIOMMU) giommu_list;
> QLIST_HEAD(, VFIOGroup) group_list;
>
--
Alexey
next prev parent reply other threads:[~2015-09-18 6:15 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-17 13:09 [Qemu-devel] [RFC PATCH 00/10] pseries: Allow VFIO devices on spapr-pci-host-bridge David Gibson
2015-09-17 13:09 ` [Qemu-devel] [RFC PATCH 01/10] vfio: Remove unneeded union from VFIOContainer David Gibson
2015-09-18 6:15 ` Alexey Kardashevskiy [this message]
2015-09-23 10:31 ` Thomas Huth
2015-09-23 23:14 ` David Gibson
2015-09-23 13:18 ` Laurent Vivier
2015-09-17 13:09 ` [Qemu-devel] [RFC PATCH 02/10] vfio: Generalize vfio_listener_region_add failure path David Gibson
2015-09-23 9:13 ` Thomas Huth
2015-09-23 13:31 ` Laurent Vivier
2015-09-17 13:09 ` [Qemu-devel] [RFC PATCH 03/10] vfio: Check guest IOVA ranges against host IOMMU capabilities David Gibson
2015-09-18 6:38 ` Alexey Kardashevskiy
2015-09-23 10:10 ` Thomas Huth
2015-09-23 11:07 ` David Gibson
2015-09-23 23:43 ` David Gibson
2015-09-23 14:26 ` Laurent Vivier
2015-09-17 13:09 ` [Qemu-devel] [RFC PATCH 04/10] vfio: Record host IOMMU's available IO page sizes David Gibson
2015-09-23 10:29 ` Thomas Huth
2015-09-23 14:30 ` Laurent Vivier
2015-09-17 13:09 ` [Qemu-devel] [RFC PATCH 05/10] memory: Allow replay of IOMMU mapping notifications David Gibson
2015-09-23 10:40 ` Thomas Huth
2015-09-23 16:35 ` Laurent Vivier
2015-09-23 23:47 ` David Gibson
2015-09-23 17:04 ` Laurent Vivier
2015-09-23 23:50 ` David Gibson
2015-09-24 7:09 ` Laurent Vivier
2015-09-17 13:09 ` [Qemu-devel] [RFC PATCH 06/10] vfio: Allow hotplug of containers onto existing guest IOMMU mappings David Gibson
2015-09-17 16:54 ` Alex Williamson
2015-09-17 23:31 ` David Gibson
2015-09-23 11:02 ` Thomas Huth
2015-09-23 23:50 ` David Gibson
2015-09-23 18:44 ` Laurent Vivier
2015-09-17 13:09 ` [Qemu-devel] [RFC PATCH 07/10] spapr_pci: Allow PCI host bridge DMA window to be configured David Gibson
2015-09-23 11:08 ` Thomas Huth
2015-09-23 23:56 ` David Gibson
2015-09-23 18:55 ` Laurent Vivier
2015-09-23 23:54 ` David Gibson
2015-09-24 6:59 ` Laurent Vivier
2015-10-03 0:25 ` Alexey Kardashevskiy
2015-10-05 14:13 ` Paolo Bonzini
2015-10-06 3:25 ` David Gibson
2015-10-06 4:18 ` David Gibson
2015-09-17 13:09 ` [Qemu-devel] [RFC PATCH 08/10] spapr_iommu: Rename vfio_accel parameter David Gibson
2015-09-17 16:54 ` Alex Williamson
2015-09-17 23:34 ` David Gibson
2015-09-17 13:09 ` [Qemu-devel] [RFC PATCH 09/10] spapr_iommu: Provide a function to switch a TCE table to allowing VFIO David Gibson
2015-09-17 16:54 ` Alex Williamson
2015-09-23 11:24 ` Thomas Huth
2015-09-24 0:35 ` David Gibson
2015-09-17 13:09 ` [Qemu-devel] [RFC PATCH 10/10] spapr_pci: Allow VFIO devices to work on the normal PCI host bridge David Gibson
2015-09-17 16:54 ` [Qemu-devel] [RFC PATCH 00/10] pseries: Allow VFIO devices on spapr-pci-host-bridge Alex Williamson
2015-09-23 11:26 ` Thomas Huth
2015-09-23 16:46 ` Laurent Vivier
2015-09-24 1:02 ` David Gibson
2015-09-24 7:02 ` Laurent Vivier
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=55FBABFF.5000002@ozlabs.ru \
--to=aik@ozlabs.ru \
--cc=alex.williamson@redhat.com \
--cc=david@gibson.dropbear.id.au \
--cc=gwshan@linux.vnet.ibm.com \
--cc=lvivier@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=thuth@redhat.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: 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).