[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2 09/12] vfio/ccw: Use vfio_[attach/detach]_device
From: |
Matthew Rosato |
Subject: |
Re: [PATCH v2 09/12] vfio/ccw: Use vfio_[attach/detach]_device |
Date: |
Wed, 27 Sep 2023 09:25:55 -0400 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.13.0 |
On 9/27/23 8:09 AM, Duan, Zhenzhong wrote:
>
>
>> -----Original Message-----
>> From: Eric Auger <eric.auger@redhat.com>
>> Sent: Wednesday, September 27, 2023 6:00 PM
>> Subject: Re: [PATCH v2 09/12] vfio/ccw: Use vfio_[attach/detach]_device
>>
>>
>>
>> On 9/26/23 13:32, Zhenzhong Duan wrote:
>>> From: Eric Auger <eric.auger@redhat.com>
>>>
>>> Let the vfio-ccw device use vfio_attach_device() and
>>> vfio_detach_device(), hence hiding the details of the used
>>> IOMMU backend.
>>>
>>> Also now all the devices have been migrated to use the new
>>> vfio_attach_device/vfio_detach_device API, let's turn the
>>> legacy functions into static functions, local to container.c.
>>>
>>> Signed-off-by: Eric Auger <eric.auger@redhat.com>
>>> Signed-off-by: Yi Liu <yi.l.liu@intel.com>
>>> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
>>> ---
>>> include/hw/vfio/vfio-common.h | 5 --
>>> hw/vfio/ccw.c | 115 ++++++++--------------------------
>>> hw/vfio/common.c | 10 +--
>>> 3 files changed, 30 insertions(+), 100 deletions(-)
>>>
>>> diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h
>>> index 12fbfbc37d..c486bdef2a 100644
>>> --- a/include/hw/vfio/vfio-common.h
>>> +++ b/include/hw/vfio/vfio-common.h
>>> @@ -202,7 +202,6 @@ typedef struct {
>>> hwaddr pages;
>>> } VFIOBitmap;
>>>
>>> -void vfio_put_base_device(VFIODevice *vbasedev);
>>> void vfio_disable_irqindex(VFIODevice *vbasedev, int index);
>>> void vfio_unmask_single_irqindex(VFIODevice *vbasedev, int index);
>>> void vfio_mask_single_irqindex(VFIODevice *vbasedev, int index);
>>> @@ -220,11 +219,7 @@ void vfio_region_unmap(VFIORegion *region);
>>> void vfio_region_exit(VFIORegion *region);
>>> void vfio_region_finalize(VFIORegion *region);
>>> void vfio_reset_handler(void *opaque);
>>> -VFIOGroup *vfio_get_group(int groupid, AddressSpace *as, Error **errp);
>>> -void vfio_put_group(VFIOGroup *group);
>>> struct vfio_device_info *vfio_get_device_info(int fd);
>>> -int vfio_get_device(VFIOGroup *group, const char *name,
>>> - VFIODevice *vbasedev, Error **errp);
>>> int vfio_attach_device(char *name, VFIODevice *vbasedev,
>>> AddressSpace *as, Error **errp);
>>> void vfio_detach_device(VFIODevice *vbasedev);
>>> diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c
>>> index 1e2fce83b0..6893a30ab1 100644
>>> --- a/hw/vfio/ccw.c
>>> +++ b/hw/vfio/ccw.c
>>> @@ -572,88 +572,14 @@ static void vfio_ccw_put_region(VFIOCCWDevice
>> *vcdev)
>>> g_free(vcdev->io_region);
>>> }
>>>
>>> -static void vfio_ccw_put_device(VFIOCCWDevice *vcdev)
>>> -{
>>> - g_free(vcdev->vdev.name);
>>> - vfio_put_base_device(&vcdev->vdev);
>>> -}
>>> -
>>> -static void vfio_ccw_get_device(VFIOGroup *group, VFIOCCWDevice *vcdev,
>>> - Error **errp)
>>> -{
>>> - S390CCWDevice *cdev = S390_CCW_DEVICE(vcdev);
>>> - char *name = g_strdup_printf("%x.%x.%04x", cdev->hostid.cssid,
>>> - cdev->hostid.ssid,
>>> - cdev->hostid.devid);
>> Digging into that few months later,
>>
>> new vfio_device_groupid uses
>>
>> + tmp = g_strdup_printf("%s/iommu_group", vbasedev->sysfsdev);
>>
>> which is set as a prop here
>> DEFINE_PROP_STRING("sysfsdev", VFIOCCWDevice, vdev.sysfsdev),
>> we need to double check if this matches, this is not obvious at first sight.
>> At least
>> if this is true this needs to be documented in the commit msg
>
> Good finding. Indeed, there is a gap here if we use a symbol link as sysfsdev.
> See s390_ccw_get_dev_info() for details. But if it's not a symbol link, I
> think
> they are same.
>
>>
>> then the subchannel name is
>> char *name = g_strdup_printf("%x.%x.%04x", cdev->hostid.cssid,
>> cdev->hostid.ssid,
>> cdev->hostid.devid);
>> QLIST_FOREACH(vbasedev, &group->device_list, next) {
>> if (strcmp(vbasedev->name, name) == 0) {
>> error_setg(errp, "vfio: subchannel %s has already been attached",
>> name);
>> goto out_err;
>> }
>> }
>>
>> while new code use
>> + QLIST_FOREACH(vbasedev_iter, &group->device_list, next) {
>> + if (strcmp(vbasedev_iter->name, vbasedev->name) == 0) {
>> + error_setg(errp, "device is already attached");
>> + vfio_put_group(group);
>> + return -EBUSY;
>> + }
>> + }
>>
>> We really need to double check the names, ie.
>> name, vbasedev->name. That's a mess and that's my bad.
>
> Thanks for catching, I think below change will make it same as original code:
>
> diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c
> index 6893a30ab1..a8ea0a6fa8 100644
> --- a/hw/vfio/ccw.c
> +++ b/hw/vfio/ccw.c
> @@ -580,6 +580,9 @@ static void vfio_ccw_realize(DeviceState *dev, Error
> **errp)
> VFIODevice *vbasedev = &vcdev->vdev;
> Error *err = NULL;
> int ret;
> + char *name = g_strdup_printf("%x.%x.%04x", cdev->hostid.cssid,
> + cdev->hostid.ssid,
> + cdev->hostid.devid);
>
> /* Call the class init function for subchannel. */
> if (cdc->realize) {
> @@ -591,7 +594,7 @@ static void vfio_ccw_realize(DeviceState *dev, Error
> **errp)
>
> vbasedev->ops = &vfio_ccw_ops;
> vbasedev->type = VFIO_DEVICE_TYPE_CCW;
> - vbasedev->name = g_strdup(cdev->mdevid);
> + vbasedev->name = name;
> vbasedev->dev = &vcdev->cdev.parent_obj.parent_obj;
>
> /*
> @@ -604,7 +607,7 @@ static void vfio_ccw_realize(DeviceState *dev, Error
> **errp)
> */
> vbasedev->ram_block_discard_allowed = true;
>
> - ret = vfio_attach_device(vbasedev->name, vbasedev,
> + ret = vfio_attach_device(cdev->mdevid, vbasedev,
> &address_space_memory, errp);
> if (ret) {
> goto out_attach_dev_err;
>
> Thanks
> Zhenzhong
I haven't tried this particular version of the patches yet (either Eric F. or I
will), but it looks like this change would re-introduce at least part of the
breakage I reported during the RFC?
https://lore.kernel.org/qemu-devel/6e04ab8f-dc84-e9c2-deea-2b6b31678b53@linux.ibm.com/
Thanks,
Matt
- RE: [PATCH v2 06/12] vfio/pci: Introduce vfio_[attach/detach]_device, (continued)
- [PATCH v2 08/12] vfio/ap: Use vfio_[attach/detach]_device, Zhenzhong Duan, 2023/09/26
- Re: [PATCH v2 08/12] vfio/ap: Use vfio_[attach/detach]_device, Eric Auger, 2023/09/27
- RE: [PATCH v2 08/12] vfio/ap: Use vfio_[attach/detach]_device, Duan, Zhenzhong, 2023/09/27
- Re: [PATCH v2 08/12] vfio/ap: Use vfio_[attach/detach]_device, Eric Auger, 2023/09/27
- RE: [PATCH v2 08/12] vfio/ap: Use vfio_[attach/detach]_device, Duan, Zhenzhong, 2023/09/27
- Re: [PATCH v2 08/12] vfio/ap: Use vfio_[attach/detach]_device, Eric Auger, 2023/09/27
[PATCH v2 09/12] vfio/ccw: Use vfio_[attach/detach]_device, Zhenzhong Duan, 2023/09/26
[PATCH v2 10/12] vfio/common: Move VFIO reset handler registration to a group agnostic function, Zhenzhong Duan, 2023/09/26
[PATCH v2 07/12] vfio/platform: Use vfio_[attach/detach]_device, Zhenzhong Duan, 2023/09/26
[PATCH v2 11/12] vfio/common: Introduce two kinds of VFIO device lists, Zhenzhong Duan, 2023/09/26
[PATCH v2 12/12] vfio/common: Move legacy VFIO backend code into separate container.c, Zhenzhong Duan, 2023/09/26