
Hi, I solve this problem by sending a CHANGE event to userspace after creating the symbol link like sriov driver. diff --git a/drivers/vfio/mdev/mdev_core.c b/drivers/vfio/mdev/mdev_core.c index 1269910..a23f1d7 100644 --- a/drivers/vfio/mdev/mdev_core.c +++ b/drivers/vfio/mdev/mdev_core.c @@ -351,6 +351,8 @@ int mdev_device_create(struct kobject *kobj, struct device *dev, uuid_le uuid) goto create_failed; } + kobject_uevent(&(mdev->dev.kobj), KOBJ_CHANGE); + mdev->type_kobj = kobj; dev_dbg(&mdev->dev, "MDEV: created\n"); Is this patch ok? Thanks, Zongyong Wu
-----Original Message----- From: Erik Skultety [mailto:eskultet@redhat.com] Sent: Thursday, February 01, 2018 4:09 PM To: Wuzongyong (Euler Dept) <cordius.wu@huawei.com> Cc: Alex Williamson <alex.williamson@redhat.com>; libvir-list@redhat.com; weijinfen <weijinfen@huawei.com> Subject: Re: [libvirt][Question] nodedev-list --cap return nothing after creating a mdev
Hi,
I meet a problem that libvirt handle new mediated devices wrongly. Command `virsh nodedev-list -cap mdev` return none after I create a mdev, and the root cause I found is:
// kernel code int mdev_device_create(struct kobject *kobj, struct device *dev, uuid_le uuid) { ... ret = device_register(&mdev->dev); // send udev event here --- 1 if (ret) { put_device(&mdev->dev); goto create_err; }
ret = mdev_device_create_ops(kobj, mdev); if (ret) goto create_failed;
ret = mdev_create_sysfs_files(&mdev->dev, type); // create mdev_type symbol link here --- 2 if (ret) { mdev_device_remove_ops(mdev, true); goto create_failed; }
mdev->type_kobj = kobj; dev_dbg(&mdev->dev, "MDEV: created\n"); ... }
At point 1, kernel send a udev event(add). If libvirt receive this event and handle it before kernel code reach point 2, libvirt just fail to resolve link such as '/sys/devices/pci0000:80/0000:80:02.0/0000:81:00.0/36b79575-ada8-4406- 893d-8cfd8d10a984/mdev_type' because the link haven't been created yet. Then libvirt thinks this devices doesn't exsit and stop tracking info of this device. Finally, command `vish nodedev-list -cap` return nothing though the device exist at host indeed.
To make it easy to reproduce this problem, I just add a `udelay(1)` before point 2 by kprobe.
So I think maybe we should add 'kobject_uevent(..., KOBJ_ADD)' after
On Thu, Feb 01, 2018 at 07:19:45AM +0000, Wuzongyong (Euler Dept) wrote: point 2 instead of point 1 ?
Or is there any other method to solve this problem?
Hi, just a note, we worked around this in upstream libvirt already.
Thanks for the pointer though, I'd also be interested in possible solutions in kernel.
Erik