Message ID | 20240719120501.81279-2-joao.m.martins@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | hw/iommufd: IOMMUFD Dirty Tracking | expand |
On 7/19/24 14:04, Joao Martins wrote: > In preparation to skip initialization of the HostIOMMUDevice for mdev, > extract the checks that validate if a device is an mdev into helpers. > > A vfio_device_is_mdev() is created, and subsystems consult VFIODevice::mdev > to check if it's mdev or not. > > Signed-off-by: Joao Martins <joao.m.martins@oracle.com> Reviewed-by: Cédric Le Goater <clg@redhat.com> Thanks, C. > --- > include/hw/vfio/vfio-common.h | 2 ++ > hw/vfio/helpers.c | 14 ++++++++++++++ > hw/vfio/pci.c | 12 +++--------- > 3 files changed, 19 insertions(+), 9 deletions(-) > > diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h > index e8ddf92bb185..98acae8c1c97 100644 > --- a/include/hw/vfio/vfio-common.h > +++ b/include/hw/vfio/vfio-common.h > @@ -116,6 +116,7 @@ typedef struct VFIODevice { > DeviceState *dev; > int fd; > int type; > + bool mdev; > bool reset_works; > bool needs_reset; > bool no_mmap; > @@ -231,6 +232,7 @@ void vfio_region_exit(VFIORegion *region); > void vfio_region_finalize(VFIORegion *region); > void vfio_reset_handler(void *opaque); > struct vfio_device_info *vfio_get_device_info(int fd); > +bool vfio_device_is_mdev(VFIODevice *vbasedev); > bool vfio_attach_device(char *name, VFIODevice *vbasedev, > AddressSpace *as, Error **errp); > void vfio_detach_device(VFIODevice *vbasedev); > diff --git a/hw/vfio/helpers.c b/hw/vfio/helpers.c > index b14edd46edc9..7e23e9080c9d 100644 > --- a/hw/vfio/helpers.c > +++ b/hw/vfio/helpers.c > @@ -675,3 +675,17 @@ int vfio_device_get_aw_bits(VFIODevice *vdev) > > return HOST_IOMMU_DEVICE_CAP_AW_BITS_MAX; > } > + > +bool vfio_device_is_mdev(VFIODevice *vbasedev) > +{ > + g_autofree char *subsys = NULL; > + g_autofree char *tmp = NULL; > + > + if (!vbasedev->sysfsdev) { > + return false; > + } > + > + tmp = g_strdup_printf("%s/subsystem", vbasedev->sysfsdev); > + subsys = realpath(tmp, NULL); > + return subsys && (strcmp(subsys, "/sys/bus/mdev") == 0); > +} > diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c > index e03d9f3ba546..b34e91468a53 100644 > --- a/hw/vfio/pci.c > +++ b/hw/vfio/pci.c > @@ -2963,12 +2963,9 @@ static void vfio_realize(PCIDevice *pdev, Error **errp) > ERRP_GUARD(); > VFIOPCIDevice *vdev = VFIO_PCI(pdev); > VFIODevice *vbasedev = &vdev->vbasedev; > - char *subsys; > int i, ret; > - bool is_mdev; > char uuid[UUID_STR_LEN]; > g_autofree char *name = NULL; > - g_autofree char *tmp = NULL; > > if (vbasedev->fd < 0 && !vbasedev->sysfsdev) { > if (!(~vdev->host.domain || ~vdev->host.bus || > @@ -2997,14 +2994,11 @@ static void vfio_realize(PCIDevice *pdev, Error **errp) > * stays in sync with the active working set of the guest driver. Prevent > * the x-balloon-allowed option unless this is minimally an mdev device. > */ > - tmp = g_strdup_printf("%s/subsystem", vbasedev->sysfsdev); > - subsys = realpath(tmp, NULL); > - is_mdev = subsys && (strcmp(subsys, "/sys/bus/mdev") == 0); > - free(subsys); > + vbasedev->mdev = vfio_device_is_mdev(vbasedev); > > - trace_vfio_mdev(vbasedev->name, is_mdev); > + trace_vfio_mdev(vbasedev->name, vbasedev->mdev); > > - if (vbasedev->ram_block_discard_allowed && !is_mdev) { > + if (vbasedev->ram_block_discard_allowed && !vbasedev->mdev) { > error_setg(errp, "x-balloon-allowed only potentially compatible " > "with mdev devices"); > goto error;
>-----Original Message----- >From: Joao Martins <joao.m.martins@oracle.com> >Sent: Friday, July 19, 2024 8:05 PM >To: qemu-devel@nongnu.org >Cc: Liu, Yi L <yi.l.liu@intel.com>; Eric Auger <eric.auger@redhat.com>; Duan, >Zhenzhong <zhenzhong.duan@intel.com>; Alex Williamson ><alex.williamson@redhat.com>; Cedric Le Goater <clg@redhat.com>; Jason >Gunthorpe <jgg@nvidia.com>; Avihai Horon <avihaih@nvidia.com>; Joao >Martins <joao.m.martins@oracle.com> >Subject: [PATCH v5 01/13] vfio/pci: Extract mdev check into an helper > >In preparation to skip initialization of the HostIOMMUDevice for mdev, >extract the checks that validate if a device is an mdev into helpers. > >A vfio_device_is_mdev() is created, and subsystems consult >VFIODevice::mdev >to check if it's mdev or not. > >Signed-off-by: Joao Martins <joao.m.martins@oracle.com> Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com> Thanks Zhenzhong >--- > include/hw/vfio/vfio-common.h | 2 ++ > hw/vfio/helpers.c | 14 ++++++++++++++ > hw/vfio/pci.c | 12 +++--------- > 3 files changed, 19 insertions(+), 9 deletions(-) > >diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio- >common.h >index e8ddf92bb185..98acae8c1c97 100644 >--- a/include/hw/vfio/vfio-common.h >+++ b/include/hw/vfio/vfio-common.h >@@ -116,6 +116,7 @@ typedef struct VFIODevice { > DeviceState *dev; > int fd; > int type; >+ bool mdev; > bool reset_works; > bool needs_reset; > bool no_mmap; >@@ -231,6 +232,7 @@ void vfio_region_exit(VFIORegion *region); > void vfio_region_finalize(VFIORegion *region); > void vfio_reset_handler(void *opaque); > struct vfio_device_info *vfio_get_device_info(int fd); >+bool vfio_device_is_mdev(VFIODevice *vbasedev); > bool vfio_attach_device(char *name, VFIODevice *vbasedev, > AddressSpace *as, Error **errp); > void vfio_detach_device(VFIODevice *vbasedev); >diff --git a/hw/vfio/helpers.c b/hw/vfio/helpers.c >index b14edd46edc9..7e23e9080c9d 100644 >--- a/hw/vfio/helpers.c >+++ b/hw/vfio/helpers.c >@@ -675,3 +675,17 @@ int vfio_device_get_aw_bits(VFIODevice *vdev) > > return HOST_IOMMU_DEVICE_CAP_AW_BITS_MAX; > } >+ >+bool vfio_device_is_mdev(VFIODevice *vbasedev) >+{ >+ g_autofree char *subsys = NULL; >+ g_autofree char *tmp = NULL; >+ >+ if (!vbasedev->sysfsdev) { >+ return false; >+ } >+ >+ tmp = g_strdup_printf("%s/subsystem", vbasedev->sysfsdev); >+ subsys = realpath(tmp, NULL); >+ return subsys && (strcmp(subsys, "/sys/bus/mdev") == 0); >+} >diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c >index e03d9f3ba546..b34e91468a53 100644 >--- a/hw/vfio/pci.c >+++ b/hw/vfio/pci.c >@@ -2963,12 +2963,9 @@ static void vfio_realize(PCIDevice *pdev, Error >**errp) > ERRP_GUARD(); > VFIOPCIDevice *vdev = VFIO_PCI(pdev); > VFIODevice *vbasedev = &vdev->vbasedev; >- char *subsys; > int i, ret; >- bool is_mdev; > char uuid[UUID_STR_LEN]; > g_autofree char *name = NULL; >- g_autofree char *tmp = NULL; > > if (vbasedev->fd < 0 && !vbasedev->sysfsdev) { > if (!(~vdev->host.domain || ~vdev->host.bus || >@@ -2997,14 +2994,11 @@ static void vfio_realize(PCIDevice *pdev, Error >**errp) > * stays in sync with the active working set of the guest driver. Prevent > * the x-balloon-allowed option unless this is minimally an mdev device. > */ >- tmp = g_strdup_printf("%s/subsystem", vbasedev->sysfsdev); >- subsys = realpath(tmp, NULL); >- is_mdev = subsys && (strcmp(subsys, "/sys/bus/mdev") == 0); >- free(subsys); >+ vbasedev->mdev = vfio_device_is_mdev(vbasedev); > >- trace_vfio_mdev(vbasedev->name, is_mdev); >+ trace_vfio_mdev(vbasedev->name, vbasedev->mdev); > >- if (vbasedev->ram_block_discard_allowed && !is_mdev) { >+ if (vbasedev->ram_block_discard_allowed && !vbasedev->mdev) { > error_setg(errp, "x-balloon-allowed only potentially compatible " > "with mdev devices"); > goto error; >-- >2.17.2
On 7/19/24 14:04, Joao Martins wrote: > In preparation to skip initialization of the HostIOMMUDevice for mdev, > extract the checks that validate if a device is an mdev into helpers. > > A vfio_device_is_mdev() is created, and subsystems consult VFIODevice::mdev > to check if it's mdev or not. > > Signed-off-by: Joao Martins <joao.m.martins@oracle.com> Reviewed-by: Eric Auger <eric.auger@redhat.com> Eric > --- > include/hw/vfio/vfio-common.h | 2 ++ > hw/vfio/helpers.c | 14 ++++++++++++++ > hw/vfio/pci.c | 12 +++--------- > 3 files changed, 19 insertions(+), 9 deletions(-) > > diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h > index e8ddf92bb185..98acae8c1c97 100644 > --- a/include/hw/vfio/vfio-common.h > +++ b/include/hw/vfio/vfio-common.h > @@ -116,6 +116,7 @@ typedef struct VFIODevice { > DeviceState *dev; > int fd; > int type; > + bool mdev; > bool reset_works; > bool needs_reset; > bool no_mmap; > @@ -231,6 +232,7 @@ void vfio_region_exit(VFIORegion *region); > void vfio_region_finalize(VFIORegion *region); > void vfio_reset_handler(void *opaque); > struct vfio_device_info *vfio_get_device_info(int fd); > +bool vfio_device_is_mdev(VFIODevice *vbasedev); > bool vfio_attach_device(char *name, VFIODevice *vbasedev, > AddressSpace *as, Error **errp); > void vfio_detach_device(VFIODevice *vbasedev); > diff --git a/hw/vfio/helpers.c b/hw/vfio/helpers.c > index b14edd46edc9..7e23e9080c9d 100644 > --- a/hw/vfio/helpers.c > +++ b/hw/vfio/helpers.c > @@ -675,3 +675,17 @@ int vfio_device_get_aw_bits(VFIODevice *vdev) > > return HOST_IOMMU_DEVICE_CAP_AW_BITS_MAX; > } > + > +bool vfio_device_is_mdev(VFIODevice *vbasedev) > +{ > + g_autofree char *subsys = NULL; > + g_autofree char *tmp = NULL; > + > + if (!vbasedev->sysfsdev) { > + return false; > + } > + > + tmp = g_strdup_printf("%s/subsystem", vbasedev->sysfsdev); > + subsys = realpath(tmp, NULL); > + return subsys && (strcmp(subsys, "/sys/bus/mdev") == 0); > +} > diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c > index e03d9f3ba546..b34e91468a53 100644 > --- a/hw/vfio/pci.c > +++ b/hw/vfio/pci.c > @@ -2963,12 +2963,9 @@ static void vfio_realize(PCIDevice *pdev, Error **errp) > ERRP_GUARD(); > VFIOPCIDevice *vdev = VFIO_PCI(pdev); > VFIODevice *vbasedev = &vdev->vbasedev; > - char *subsys; > int i, ret; > - bool is_mdev; > char uuid[UUID_STR_LEN]; > g_autofree char *name = NULL; > - g_autofree char *tmp = NULL; > > if (vbasedev->fd < 0 && !vbasedev->sysfsdev) { > if (!(~vdev->host.domain || ~vdev->host.bus || > @@ -2997,14 +2994,11 @@ static void vfio_realize(PCIDevice *pdev, Error **errp) > * stays in sync with the active working set of the guest driver. Prevent > * the x-balloon-allowed option unless this is minimally an mdev device. > */ > - tmp = g_strdup_printf("%s/subsystem", vbasedev->sysfsdev); > - subsys = realpath(tmp, NULL); > - is_mdev = subsys && (strcmp(subsys, "/sys/bus/mdev") == 0); > - free(subsys); > + vbasedev->mdev = vfio_device_is_mdev(vbasedev); > > - trace_vfio_mdev(vbasedev->name, is_mdev); > + trace_vfio_mdev(vbasedev->name, vbasedev->mdev); > > - if (vbasedev->ram_block_discard_allowed && !is_mdev) { > + if (vbasedev->ram_block_discard_allowed && !vbasedev->mdev) { > error_setg(errp, "x-balloon-allowed only potentially compatible " > "with mdev devices"); > goto error;
diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h index e8ddf92bb185..98acae8c1c97 100644 --- a/include/hw/vfio/vfio-common.h +++ b/include/hw/vfio/vfio-common.h @@ -116,6 +116,7 @@ typedef struct VFIODevice { DeviceState *dev; int fd; int type; + bool mdev; bool reset_works; bool needs_reset; bool no_mmap; @@ -231,6 +232,7 @@ void vfio_region_exit(VFIORegion *region); void vfio_region_finalize(VFIORegion *region); void vfio_reset_handler(void *opaque); struct vfio_device_info *vfio_get_device_info(int fd); +bool vfio_device_is_mdev(VFIODevice *vbasedev); bool vfio_attach_device(char *name, VFIODevice *vbasedev, AddressSpace *as, Error **errp); void vfio_detach_device(VFIODevice *vbasedev); diff --git a/hw/vfio/helpers.c b/hw/vfio/helpers.c index b14edd46edc9..7e23e9080c9d 100644 --- a/hw/vfio/helpers.c +++ b/hw/vfio/helpers.c @@ -675,3 +675,17 @@ int vfio_device_get_aw_bits(VFIODevice *vdev) return HOST_IOMMU_DEVICE_CAP_AW_BITS_MAX; } + +bool vfio_device_is_mdev(VFIODevice *vbasedev) +{ + g_autofree char *subsys = NULL; + g_autofree char *tmp = NULL; + + if (!vbasedev->sysfsdev) { + return false; + } + + tmp = g_strdup_printf("%s/subsystem", vbasedev->sysfsdev); + subsys = realpath(tmp, NULL); + return subsys && (strcmp(subsys, "/sys/bus/mdev") == 0); +} diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index e03d9f3ba546..b34e91468a53 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -2963,12 +2963,9 @@ static void vfio_realize(PCIDevice *pdev, Error **errp) ERRP_GUARD(); VFIOPCIDevice *vdev = VFIO_PCI(pdev); VFIODevice *vbasedev = &vdev->vbasedev; - char *subsys; int i, ret; - bool is_mdev; char uuid[UUID_STR_LEN]; g_autofree char *name = NULL; - g_autofree char *tmp = NULL; if (vbasedev->fd < 0 && !vbasedev->sysfsdev) { if (!(~vdev->host.domain || ~vdev->host.bus || @@ -2997,14 +2994,11 @@ static void vfio_realize(PCIDevice *pdev, Error **errp) * stays in sync with the active working set of the guest driver. Prevent * the x-balloon-allowed option unless this is minimally an mdev device. */ - tmp = g_strdup_printf("%s/subsystem", vbasedev->sysfsdev); - subsys = realpath(tmp, NULL); - is_mdev = subsys && (strcmp(subsys, "/sys/bus/mdev") == 0); - free(subsys); + vbasedev->mdev = vfio_device_is_mdev(vbasedev); - trace_vfio_mdev(vbasedev->name, is_mdev); + trace_vfio_mdev(vbasedev->name, vbasedev->mdev); - if (vbasedev->ram_block_discard_allowed && !is_mdev) { + if (vbasedev->ram_block_discard_allowed && !vbasedev->mdev) { error_setg(errp, "x-balloon-allowed only potentially compatible " "with mdev devices"); goto error;
In preparation to skip initialization of the HostIOMMUDevice for mdev, extract the checks that validate if a device is an mdev into helpers. A vfio_device_is_mdev() is created, and subsystems consult VFIODevice::mdev to check if it's mdev or not. Signed-off-by: Joao Martins <joao.m.martins@oracle.com> --- include/hw/vfio/vfio-common.h | 2 ++ hw/vfio/helpers.c | 14 ++++++++++++++ hw/vfio/pci.c | 12 +++--------- 3 files changed, 19 insertions(+), 9 deletions(-)