On 7/1/2019 8:24 PM, Alex Williamson wrote: > This allows udev to trigger rules when a parent device is registered > or unregistered from mdev. > > Signed-off-by: Alex Williamson <alex.williamson@xxxxxxxxxx> > --- > > v2: Don't remove the dev_info(), Kirti requested they stay and > removing them is only tangential to the goal of this change. > Thanks. > drivers/vfio/mdev/mdev_core.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/drivers/vfio/mdev/mdev_core.c b/drivers/vfio/mdev/mdev_core.c > index ae23151442cb..7fb268136c62 100644 > --- a/drivers/vfio/mdev/mdev_core.c > +++ b/drivers/vfio/mdev/mdev_core.c > @@ -146,6 +146,8 @@ int mdev_register_device(struct device *dev, const struct mdev_parent_ops *ops) > { > int ret; > struct mdev_parent *parent; > + char *env_string = "MDEV_STATE=registered"; > + char *envp[] = { env_string, NULL }; > > /* check for mandatory ops */ > if (!ops || !ops->create || !ops->remove || !ops->supported_type_groups) > @@ -197,6 +199,8 @@ int mdev_register_device(struct device *dev, const struct mdev_parent_ops *ops) > mutex_unlock(&parent_list_lock); > > dev_info(dev, "MDEV: Registered\n"); > + kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp); > + > return 0; > > add_dev_err: > @@ -220,6 +224,8 @@ EXPORT_SYMBOL(mdev_register_device); > void mdev_unregister_device(struct device *dev) > { > struct mdev_parent *parent; > + char *env_string = "MDEV_STATE=unregistered"; > + char *envp[] = { env_string, NULL }; > > mutex_lock(&parent_list_lock); > parent = __find_parent_device(dev); > @@ -243,6 +249,8 @@ void mdev_unregister_device(struct device *dev) > up_write(&parent->unreg_sem); > > mdev_put_parent(parent); > + > + kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp); mdev_put_parent() calls put_device(dev). If this is the last instance holding device, then on put_device(dev) dev would get freed. This event should be before mdev_put_parent() Thanks, Kirti > } > EXPORT_SYMBOL(mdev_unregister_device); > >