linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
From: Alexey Kardashevskiy <aik@ozlabs.ru>
To: linuxppc-dev@lists.ozlabs.org
Cc: Alexey Kardashevskiy <aik@ozlabs.ru>,
	Alex Williamson <alex.williamson@redhat.com>,
	David Gibson <david@gibson.dropbear.id.au>,
	Paul Mackerras <paulus@samba.org>,
	kvm-ppc@vger.kernel.org, kvm@vger.kernel.org
Subject: [PATCH kernel v2 09/11] vfio iommu: Add helpers to (un)register blocking notifiers per group
Date: Sun, 18 Dec 2016 12:28:58 +1100	[thread overview]
Message-ID: <20161218012900.18142-10-aik@ozlabs.ru> (raw)
In-Reply-To: <20161218012900.18142-1-aik@ozlabs.ru>

c086de81 "vfio iommu: Add blocking notifier to notify DMA_UNMAP" added
notifiers to a VFIO group. However even though the code underneath
uses groups, the API takes device struct pointers.

This adds helpers which do the same thing but take IOMMU groups instead.

This adds vfio_iommu_group_set_kvm() which is a wrapper on top of
vfio_group_set_kvm() but also takes an iommu_group.

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
---
 include/linux/vfio.h |  6 +++++
 drivers/vfio/vfio.c  | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 82 insertions(+)

diff --git a/include/linux/vfio.h b/include/linux/vfio.h
index edf9b2cad277..8a3488ba4732 100644
--- a/include/linux/vfio.h
+++ b/include/linux/vfio.h
@@ -127,9 +127,15 @@ extern int vfio_register_notifier(struct device *dev,
 extern int vfio_unregister_notifier(struct device *dev,
 				    enum vfio_notify_type type,
 				    struct notifier_block *nb);
+extern int vfio_iommu_group_register_notifier(struct iommu_group *grp,
+		enum vfio_notify_type type, unsigned long *events,
+		struct notifier_block *nb);
+extern int vfio_iommu_group_unregister_notifier(struct iommu_group *grp,
+		enum vfio_notify_type type, struct notifier_block *nb);
 
 struct kvm;
 extern void vfio_group_set_kvm(struct vfio_group *group, struct kvm *kvm);
+extern void vfio_iommu_group_set_kvm(struct iommu_group *grp, struct kvm *kvm);
 
 /*
  * Sub-module helpers
diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c
index 9901c4671e2f..6b9a98508939 100644
--- a/drivers/vfio/vfio.c
+++ b/drivers/vfio/vfio.c
@@ -2077,6 +2077,23 @@ void vfio_group_set_kvm(struct vfio_group *group, struct kvm *kvm)
 }
 EXPORT_SYMBOL_GPL(vfio_group_set_kvm);
 
+void vfio_iommu_group_set_kvm(struct iommu_group *grp, struct kvm *kvm)
+{
+	struct vfio_group *group;
+
+	if (!grp)
+		return;
+
+	group = vfio_group_get_from_iommu(grp);
+	if (!group)
+		return;
+
+	vfio_group_set_kvm(group, kvm);
+
+	vfio_group_put(group);
+}
+EXPORT_SYMBOL_GPL(vfio_iommu_group_set_kvm);
+
 static int vfio_register_group_notifier(struct vfio_group *group,
 					unsigned long *events,
 					struct notifier_block *nb)
@@ -2197,6 +2214,65 @@ int vfio_unregister_notifier(struct device *dev, enum vfio_notify_type type,
 }
 EXPORT_SYMBOL(vfio_unregister_notifier);
 
+int vfio_iommu_group_register_notifier(struct iommu_group *iommugroup,
+		enum vfio_notify_type type,
+		unsigned long *events, struct notifier_block *nb)
+{
+	struct vfio_group *group;
+	int ret;
+
+	if (!iommugroup || !nb || !events || (*events == 0))
+		return -EINVAL;
+
+	group = vfio_group_get_from_iommu(iommugroup);
+	if (!group)
+		return -ENODEV;
+
+	switch (type) {
+	case VFIO_IOMMU_NOTIFY:
+		ret = vfio_register_iommu_notifier(group, events, nb);
+		break;
+	case VFIO_GROUP_NOTIFY:
+		ret = vfio_register_group_notifier(group, events, nb);
+		break;
+	default:
+		ret = -EINVAL;
+	}
+
+	vfio_group_put(group);
+	return ret;
+}
+EXPORT_SYMBOL(vfio_iommu_group_register_notifier);
+
+int vfio_iommu_group_unregister_notifier(struct iommu_group *grp,
+		enum vfio_notify_type type, struct notifier_block *nb)
+{
+	struct vfio_group *group;
+	int ret;
+
+	if (!grp || !nb)
+		return -EINVAL;
+
+	group = vfio_group_get_from_iommu(grp);
+	if (!group)
+		return -ENODEV;
+
+	switch (type) {
+	case VFIO_IOMMU_NOTIFY:
+		ret = vfio_unregister_iommu_notifier(group, nb);
+		break;
+	case VFIO_GROUP_NOTIFY:
+		ret = vfio_unregister_group_notifier(group, nb);
+		break;
+	default:
+		ret = -EINVAL;
+	}
+
+	vfio_group_put(group);
+	return ret;
+}
+EXPORT_SYMBOL(vfio_iommu_group_unregister_notifier);
+
 /**
  * Module/class support
  */
-- 
2.11.0

  parent reply	other threads:[~2016-12-18  1:29 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-18  1:28 [PATCH kernel v2 00/11] powerpc/kvm/vfio: Enable in-kernel acceleration Alexey Kardashevskiy
2016-12-18  1:28 ` [PATCH kernel v2 01/11] KVM: PPC: Reserve KVM_CAP_SPAPR_TCE_VFIO capability number Alexey Kardashevskiy
2016-12-18  1:28 ` [PATCH kernel v2 02/11] powerpc/iommu: Cleanup iommu_table disposal Alexey Kardashevskiy
2016-12-18  1:28 ` [PATCH kernel v2 03/11] powerpc/vfio_spapr_tce: Add reference counting to iommu_table Alexey Kardashevskiy
2016-12-18  1:28 ` [PATCH kernel v2 04/11] powerpc/mmu: Add real mode support for IOMMU preregistered memory Alexey Kardashevskiy
2016-12-18  1:28 ` [PATCH kernel v2 05/11] KVM: PPC: Use preregistered memory API to access TCE list Alexey Kardashevskiy
2016-12-21  4:08   ` David Gibson
2016-12-21  8:57     ` Alexey Kardashevskiy
2017-01-11  6:35       ` Alexey Kardashevskiy
2017-01-12  5:49         ` David Gibson
2016-12-18  1:28 ` [PATCH kernel v2 06/11] powerpc/powernv/iommu: Add real mode version of iommu_table_ops::exchange() Alexey Kardashevskiy
2016-12-18  1:28 ` [PATCH kernel v2 07/11] KVM: PPC: Enable IOMMU_API for KVM_BOOK3S_64 permanently Alexey Kardashevskiy
2016-12-18  1:28 ` [PATCH kernel v2 08/11] KVM: PPC: Pass kvm* to kvmppc_find_table() Alexey Kardashevskiy
2016-12-18  1:28 ` Alexey Kardashevskiy [this message]
2016-12-21  6:04   ` [PATCH kernel v2 09/11] vfio iommu: Add helpers to (un)register blocking notifiers per group David Gibson
2016-12-22  1:25     ` Alexey Kardashevskiy
2016-12-18  1:28 ` [PATCH kernel v2 10/11] vfio: Check for unregistered notifiers when group is actually released Alexey Kardashevskiy
2016-12-19 10:41   ` Jike Song
2016-12-19 16:28     ` Alex Williamson
2016-12-19 22:41       ` Alexey Kardashevskiy
2016-12-18  1:29 ` [PATCH kernel v2 11/11] KVM: PPC: Add in-kernel acceleration for VFIO Alexey Kardashevskiy
2016-12-20  6:52   ` [PATCH kernel v3] " Alexey Kardashevskiy
2017-01-12  5:04     ` David Gibson
2017-01-12  8:09       ` Alexey Kardashevskiy
2017-01-12 23:53         ` David Gibson
2017-01-13  2:23           ` Alexey Kardashevskiy
2017-01-13  2:38             ` David Gibson

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=20161218012900.18142-10-aik@ozlabs.ru \
    --to=aik@ozlabs.ru \
    --cc=alex.williamson@redhat.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=kvm-ppc@vger.kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=paulus@samba.org \
    /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).