From: Matthew Rosato <mjrosato@linux.ibm.com>
To: "Cédric Le Goater" <clg@redhat.com>,
"Eric Auger" <eric.auger@redhat.com>,
eric.auger.pro@gmail.com, qemu-devel@nongnu.org,
zhenzhong.duan@intel.com, alex.williamson@redhat.com,
jgg@nvidia.com, nicolinc@nvidia.com, joao.m.martins@oracle.com,
peterx@redhat.com, kevin.tian@intel.com, yi.l.liu@intel.com,
yi.y.sun@intel.com, chao.p.peng@intel.com
Subject: Re: [PATCH v3 09/15] vfio/ap: Use vfio_[attach/detach]_device
Date: Tue, 3 Oct 2023 19:08:27 -0400 [thread overview]
Message-ID: <606cfdd1-5ff1-b789-02c6-9a9237694f30@linux.ibm.com> (raw)
In-Reply-To: <952d6ce5-8523-0337-8bb9-ba45b728172e@redhat.com>
On 10/3/23 11:25 AM, Cédric Le Goater wrote:
> On 10/3/23 12:14, Eric Auger wrote:
>> Let the vfio-ap device use vfio_attach_device() and
>> vfio_detach_device(), hence hiding the details of the used
>> IOMMU backend.
>>
>> We take the opportunity to use g_path_get_basename() which
>> is prefered, as suggested by
>> 3e015d815b ("use g_path_get_basename instead of basename")
>>
>> 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>
>>
>> ---
>>
>> v2 -> v3:
>> - Mention g_path_get_basename in commit message and properly free
>> vbasedev->name, call vfio_detach_device
>> ---
>> hw/vfio/ap.c | 70 ++++++++++------------------------------------------
>> 1 file changed, 13 insertions(+), 57 deletions(-)
>>
>> diff --git a/hw/vfio/ap.c b/hw/vfio/ap.c
>> index 6e21d1da5a..d0b587b3b1 100644
>> --- a/hw/vfio/ap.c
>> +++ b/hw/vfio/ap.c
>> @@ -53,40 +53,6 @@ struct VFIODeviceOps vfio_ap_ops = {
>> .vfio_compute_needs_reset = vfio_ap_compute_needs_reset,
>> };
>> -static void vfio_ap_put_device(VFIOAPDevice *vapdev)
>> -{
>> - g_free(vapdev->vdev.name);
>> - vfio_put_base_device(&vapdev->vdev);
>> -}
>> -
>> -static VFIOGroup *vfio_ap_get_group(VFIOAPDevice *vapdev, Error **errp)
>> -{
>> - GError *gerror = NULL;
>> - char *symlink, *group_path;
>> - int groupid;
>> -
>> - symlink = g_strdup_printf("%s/iommu_group", vapdev->vdev.sysfsdev);
>> - group_path = g_file_read_link(symlink, &gerror);
>> - g_free(symlink);
>> -
>> - if (!group_path) {
>> - error_setg(errp, "%s: no iommu_group found for %s: %s",
>> - TYPE_VFIO_AP_DEVICE, vapdev->vdev.sysfsdev, gerror->message);
>> - g_error_free(gerror);
>> - return NULL;
>> - }
>> -
>> - if (sscanf(basename(group_path), "%d", &groupid) != 1) {
>> - error_setg(errp, "vfio: failed to read %s", group_path);
>> - g_free(group_path);
>> - return NULL;
>> - }
>> -
>> - g_free(group_path);
>> -
>> - return vfio_get_group(groupid, &address_space_memory, errp);
>> -}
>> -
>> static void vfio_ap_req_notifier_handler(void *opaque)
>> {
>> VFIOAPDevice *vapdev = opaque;
>> @@ -189,22 +155,15 @@ static void vfio_ap_unregister_irq_notifier(VFIOAPDevice *vapdev,
>> static void vfio_ap_realize(DeviceState *dev, Error **errp)
>> {
>> int ret;
>> - char *mdevid;
>> Error *err = NULL;
>> - VFIOGroup *vfio_group;
>> APDevice *apdev = AP_DEVICE(dev);
>> VFIOAPDevice *vapdev = VFIO_AP_DEVICE(apdev);
>> + VFIODevice *vbasedev = &vapdev->vdev;
>> - vfio_group = vfio_ap_get_group(vapdev, errp);
>> - if (!vfio_group) {
>> - return;
>> - }
>> -
>> - vapdev->vdev.ops = &vfio_ap_ops;
>> - vapdev->vdev.type = VFIO_DEVICE_TYPE_AP;
>> - mdevid = basename(vapdev->vdev.sysfsdev);
>> - vapdev->vdev.name = g_strdup_printf("%s", mdevid);
>> - vapdev->vdev.dev = dev;
>> + vbasedev->name = g_path_get_basename(vbasedev->sysfsdev);
>> + vbasedev->ops = &vfio_ap_ops;
>> + vbasedev->type = VFIO_DEVICE_TYPE_AP;
>> + vbasedev->dev = dev;
>> /*
>> * vfio-ap devices operate in a way compatible with discarding of
>> @@ -214,9 +173,11 @@ static void vfio_ap_realize(DeviceState *dev, Error **errp)
>> */
>> vapdev->vdev.ram_block_discard_allowed = true;
>> - ret = vfio_get_device(vfio_group, mdevid, &vapdev->vdev, errp);
>> + ret = vfio_attach_device(vbasedev->name, vbasedev,
>> + &address_space_memory, errp);
>> if (ret) {
>> - goto out_get_dev_err;
>> + g_free(vbasedev->name);
>> + return;
>> }
>> vfio_ap_register_irq_notifier(vapdev, VFIO_AP_REQ_IRQ_INDEX, &err);
>> @@ -225,25 +186,20 @@ static void vfio_ap_realize(DeviceState *dev, Error **errp)
>> * Report this error, but do not make it a failing condition.
>> * Lack of this IRQ in the host does not prevent normal operation.
>> */
>> + vfio_detach_device(vbasedev);
>> error_report_err(err);
>> + g_free(vbasedev->name);
This patch overall looks good to me and passes basic tests with vfio-ap devices. But I note that this addition of detach+free here runs counter to what the comment block above it states and prior behavior (where we did not goto out_get_dev_err for this case and expect the realize to complete successfully despite this error).
In this error case, we only report the local 'err' contents and nothing is propagated into 'errp' -- which means that to the caller dc->realize() should be viewed as successful (errp is NULL) and so we should be able to assume a subsequent dc->unrealize() will do this g_free+detach later.
>> }
>> -
>> - return;
>> -
>> -out_get_dev_err:
>> - vfio_ap_put_device(vapdev);
>> - vfio_put_group(vfio_group);
>> }
>
>
> To be consistent with vfio_(pci)_realize(), I would introduce the same
> failure path at the end the routine :
>
> out_detach:
> vfio_detach_device(vbasedev);
> error:
> error_prepend(errp, VFIO_MSG_PREFIX, vbasedev->name);
> g_free(vbasedev->name);
So based on my comment above, I think you'd only need the 'error:' case now, but otherwise adding this error_prepend seems reasonable to me too.
Thanks,
Matt
>
>
> and add the VFIO_MSG_PREFIX while we are at it.
>
> This is minor, so :
>
> Reviewed-by: Cédric Le Goater <clg@redhat.com>
>
> Thanks,
>
> C.
>
>
>
>> static void vfio_ap_unrealize(DeviceState *dev)
>> {
>> APDevice *apdev = AP_DEVICE(dev);
>> VFIOAPDevice *vapdev = VFIO_AP_DEVICE(apdev);
>> - VFIOGroup *group = vapdev->vdev.group;
>> vfio_ap_unregister_irq_notifier(vapdev, VFIO_AP_REQ_IRQ_INDEX);
>> - vfio_ap_put_device(vapdev);
>> - vfio_put_group(group);
>> + vfio_detach_device(&vapdev->vdev);
>> + g_free(vapdev->vdev.name);
>> }
>> static Property vfio_ap_properties[] = {
>
next prev parent reply other threads:[~2023-10-03 23:08 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-03 10:13 [PATCH v3 00/15] Prerequisite changes for IOMMUFD support Eric Auger
2023-10-03 10:13 ` [PATCH v3 01/15] scripts/update-linux-headers: Add iommufd.h Eric Auger
2023-10-03 13:50 ` Cédric Le Goater
2023-10-03 14:09 ` Eric Auger
2023-10-03 10:13 ` [PATCH v3 02/15] linux-headers: " Eric Auger
2023-10-03 10:14 ` [PATCH v3 03/15] vfio/common: Move IOMMU agnostic helpers to a separate file Eric Auger
2023-10-04 5:35 ` Cédric Le Goater
2023-10-03 10:14 ` [PATCH v3 04/15] vfio/common: Propagate KVM_SET_DEVICE_ATTR error if any Eric Auger
2023-10-03 14:53 ` Cédric Le Goater
2023-10-04 9:44 ` Eric Auger
2023-10-03 10:14 ` [PATCH v3 05/15] vfio/common: Introduce vfio_container_add|del_section_window() Eric Auger
2023-10-03 10:14 ` [PATCH v3 06/15] vfio/common: Extract out vfio_kvm_device_[add/del]_fd Eric Auger
2023-10-03 10:14 ` [PATCH v3 07/15] vfio/pci: Introduce vfio_[attach/detach]_device Eric Auger
2023-10-03 15:14 ` Cédric Le Goater
2023-10-03 10:14 ` [PATCH v3 08/15] vfio/platform: Use vfio_[attach/detach]_device Eric Auger
2023-10-03 15:15 ` Cédric Le Goater
2023-10-03 10:14 ` [PATCH v3 09/15] vfio/ap: " Eric Auger
2023-10-03 15:25 ` Cédric Le Goater
2023-10-03 23:08 ` Matthew Rosato [this message]
2023-10-04 9:55 ` Eric Auger
2023-10-04 9:58 ` Eric Auger
2023-10-04 13:41 ` Matthew Rosato
2023-10-04 13:48 ` Eric Auger
2023-10-03 10:14 ` [PATCH v3 10/15] vfio/ccw: " Eric Auger
2023-10-03 15:45 ` Cédric Le Goater
2023-10-04 12:30 ` Eric Auger
2023-10-03 23:01 ` Matthew Rosato
2023-10-04 12:32 ` Eric Auger
2023-10-03 10:14 ` [PATCH v3 11/15] vfio/common: Move VFIO reset handler registration to a group agnostic function Eric Auger
2023-10-03 15:46 ` Cédric Le Goater
2023-10-03 10:14 ` [PATCH v3 12/15] vfio/common: Introduce a per container device list Eric Auger
2023-10-03 15:52 ` Cédric Le Goater
2023-10-03 10:14 ` [PATCH v3 13/15] vfio/common: Store the parent container in VFIODevice Eric Auger
2023-10-03 15:59 ` Cédric Le Goater
2023-10-04 13:03 ` Eric Auger
2023-10-04 16:55 ` Cédric Le Goater
2023-10-04 17:00 ` Eric Auger
2023-10-03 10:14 ` [PATCH v3 14/15] vfio/common: Introduce a global VFIODevice list Eric Auger
2023-10-03 15:56 ` Cédric Le Goater
2023-10-04 13:54 ` Eric Auger
2023-10-03 10:14 ` [PATCH v3 15/15] vfio/common: Move legacy VFIO backend code into separate container.c Eric Auger
2023-10-03 16:08 ` Cédric Le Goater
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=606cfdd1-5ff1-b789-02c6-9a9237694f30@linux.ibm.com \
--to=mjrosato@linux.ibm.com \
--cc=alex.williamson@redhat.com \
--cc=chao.p.peng@intel.com \
--cc=clg@redhat.com \
--cc=eric.auger.pro@gmail.com \
--cc=eric.auger@redhat.com \
--cc=jgg@nvidia.com \
--cc=joao.m.martins@oracle.com \
--cc=kevin.tian@intel.com \
--cc=nicolinc@nvidia.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=yi.l.liu@intel.com \
--cc=yi.y.sun@intel.com \
--cc=zhenzhong.duan@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: 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).