lkml.org 
[lkml]   [2016]   [Nov]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH v11 12/22] vfio: Add notifier callback to parent's ops structure of mdev
On Sat, 5 Nov 2016 02:40:46 +0530
Kirti Wankhede <kwankhede@nvidia.com> wrote:

> Add a notifier calback to parent's ops structure of mdev device so that per
> device notifer for vfio module is registered through vfio_mdev module.
>
> Signed-off-by: Kirti Wankhede <kwankhede@nvidia.com>
> Signed-off-by: Neo Jia <cjia@nvidia.com>
> Change-Id: Iafa6f1721aecdd6e50eb93b153b5621e6d29b637
> ---
> drivers/vfio/mdev/vfio_mdev.c | 19 +++++++++++++++++++
> include/linux/mdev.h | 9 +++++++++
> 2 files changed, 28 insertions(+)
>
> diff --git a/drivers/vfio/mdev/vfio_mdev.c b/drivers/vfio/mdev/vfio_mdev.c
> index bb534d19e321..2b7c24aa9e46 100644
> --- a/drivers/vfio/mdev/vfio_mdev.c
> +++ b/drivers/vfio/mdev/vfio_mdev.c
> @@ -24,6 +24,15 @@
> #define DRIVER_AUTHOR "NVIDIA Corporation"
> #define DRIVER_DESC "VFIO based driver for Mediated device"
>
> +static int vfio_mdev_notifier(struct notifier_block *nb, unsigned long action,
> + void *data)
> +{
> + struct mdev_device *mdev = container_of(nb, struct mdev_device, nb);
> + struct parent_device *parent = mdev->parent;
> +
> + return parent->ops->notifier(mdev, action, data);
> +}
> +
> static int vfio_mdev_open(void *device_data)
> {
> struct mdev_device *mdev = device_data;
> @@ -40,6 +49,11 @@ static int vfio_mdev_open(void *device_data)
> if (ret)
> module_put(THIS_MODULE);
>
> + if (likely(parent->ops->notifier)) {
> + mdev->nb.notifier_call = vfio_mdev_notifier;
> + if (vfio_register_notifier(&mdev->dev, &mdev->nb))
> + pr_err("Failed to register notifier for mdev\n");
> + }
> return ret;
> }
>
> @@ -48,6 +62,11 @@ static void vfio_mdev_release(void *device_data)
> struct mdev_device *mdev = device_data;
> struct parent_device *parent = mdev->parent;
>
> + if (likely(parent->ops->notifier)) {
> + if (vfio_unregister_notifier(&mdev->dev, &mdev->nb))
> + pr_err("Failed to unregister notifier for mdev\n");
> + }
> +

Ok, I guess this is sufficient to automatically handle the unregister
at the mdev layer. No need for my comments on the previous other
than the ordering of when the callback is called. Thanks,

Alex

> if (likely(parent->ops->release))
> parent->ops->release(mdev);
>
> diff --git a/include/linux/mdev.h b/include/linux/mdev.h
> index 0352febc1944..2999ef0ddaed 100644
> --- a/include/linux/mdev.h
> +++ b/include/linux/mdev.h
> @@ -37,6 +37,7 @@ struct mdev_device {
> struct kref ref;
> struct list_head next;
> struct kobject *type_kobj;
> + struct notifier_block nb;
> };
>
>
> @@ -84,6 +85,12 @@ struct mdev_device {
> * @cmd: mediated device structure
> * @arg: mediated device structure
> * @mmap: mmap callback
> + * @mdev: mediated device structure
> + * @vma: vma structure
> + * @notifer: Notifier callback
> + * @mdev: mediated device structure
> + * @action: Action for which notifier is called
> + * @data: Data associated with the notifier
> * Parent device that support mediated device should be registered with mdev
> * module with parent_ops structure.
> **/
> @@ -105,6 +112,8 @@ struct parent_ops {
> ssize_t (*ioctl)(struct mdev_device *mdev, unsigned int cmd,
> unsigned long arg);
> int (*mmap)(struct mdev_device *mdev, struct vm_area_struct *vma);
> + int (*notifier)(struct mdev_device *mdev, unsigned long action,
> + void *data);
> };
>
> /* interface for exporting mdev supported type attributes */

\
 
 \ /
  Last update: 2016-11-08 00:51    [W:0.706 / U:0.896 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site