Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752582AbcKGXvY (ORCPT ); Mon, 7 Nov 2016 18:51:24 -0500 Received: from mx1.redhat.com ([209.132.183.28]:52108 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750926AbcKGXvW (ORCPT ); Mon, 7 Nov 2016 18:51:22 -0500 Date: Mon, 7 Nov 2016 16:51:19 -0700 From: Alex Williamson To: Kirti Wankhede Cc: , , , , , , , , Subject: Re: [PATCH v11 12/22] vfio: Add notifier callback to parent's ops structure of mdev Message-ID: <20161107165119.3d064f9d@t450s.home> In-Reply-To: <1478293856-8191-13-git-send-email-kwankhede@nvidia.com> References: <1478293856-8191-1-git-send-email-kwankhede@nvidia.com> <1478293856-8191-13-git-send-email-kwankhede@nvidia.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Mon, 07 Nov 2016 23:51:21 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3450 Lines: 99 On Sat, 5 Nov 2016 02:40:46 +0530 Kirti Wankhede 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 > Signed-off-by: Neo Jia > 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 */