From: Liu Yi L <yi.l.liu@intel.com>
To: alex.williamson@redhat.com, kwankhede@nvidia.com
Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
kevin.tian@intel.com, joro@8bytes.org, peterx@redhat.com,
baolu.lu@linux.intel.com, Liu Yi L <yi.l.liu@intel.com>
Subject: [PATCH v4 12/12] samples: refine vfio-mdev-pci driver
Date: Tue, 7 Jan 2020 20:01:49 +0800 [thread overview]
Message-ID: <1578398509-26453-13-git-send-email-yi.l.liu@intel.com> (raw)
In-Reply-To: <1578398509-26453-1-git-send-email-yi.l.liu@intel.com>
From: Alex Williamson <alex.williamson@redhat.com>
This patch refines the implementation of original vfio-mdev-pci driver.
And the vfio-mdev-pci-type_name will be named per the following rule:
vmdev->attr.name = kasprintf(GFP_KERNEL,
"%04x:%04x:%04x:%04x:%06x:%02x",
pdev->vendor, pdev->device,
pdev->subsystem_vendor,
pdev->subsystem_device, pdev->class,
pdev->revision);
Before usage, check the /sys/bus/pci/devices/$bdf/mdev_supported_types/
to ensure the final mdev_supported_types.
Cc: Kevin Tian <kevin.tian@intel.com>
Cc: Lu Baolu <baolu.lu@linux.intel.com>
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Liu Yi L <yi.l.liu@intel.com>
---
samples/vfio-mdev-pci/vfio_mdev_pci.c | 123 ++++++++++++++++++++--------------
1 file changed, 73 insertions(+), 50 deletions(-)
diff --git a/samples/vfio-mdev-pci/vfio_mdev_pci.c b/samples/vfio-mdev-pci/vfio_mdev_pci.c
index b180356..0377b5b 100644
--- a/samples/vfio-mdev-pci/vfio_mdev_pci.c
+++ b/samples/vfio-mdev-pci/vfio_mdev_pci.c
@@ -64,18 +64,22 @@ MODULE_PARM_DESC(disable_idle_d3,
static struct pci_driver vfio_mdev_pci_driver;
-static ssize_t
-name_show(struct kobject *kobj, struct device *dev, char *buf)
-{
- return sprintf(buf, "%s-type1\n", dev_name(dev));
-}
-
-MDEV_TYPE_ATTR_RO(name);
+struct vfio_mdev_pci_device {
+ struct vfio_pci_device vdev;
+ struct mdev_parent_ops ops;
+ struct attribute_group *groups[2];
+ struct attribute_group attr;
+ atomic_t avail;
+};
static ssize_t
available_instances_show(struct kobject *kobj, struct device *dev, char *buf)
{
- return sprintf(buf, "%d\n", 1);
+ struct vfio_mdev_pci_device *vmdev;
+
+ vmdev = pci_get_drvdata(to_pci_dev(dev));
+
+ return sprintf(buf, "%d\n", atomic_read(&vmdev->avail));
}
MDEV_TYPE_ATTR_RO(available_instances);
@@ -89,64 +93,61 @@ static ssize_t device_api_show(struct kobject *kobj, struct device *dev,
MDEV_TYPE_ATTR_RO(device_api);
static struct attribute *vfio_mdev_pci_types_attrs[] = {
- &mdev_type_attr_name.attr,
&mdev_type_attr_device_api.attr,
&mdev_type_attr_available_instances.attr,
NULL,
};
-static struct attribute_group vfio_mdev_pci_type_group1 = {
- .name = "type1",
- .attrs = vfio_mdev_pci_types_attrs,
-};
-
-struct attribute_group *vfio_mdev_pci_type_groups[] = {
- &vfio_mdev_pci_type_group1,
- NULL,
-};
-
struct vfio_mdev_pci {
struct vfio_pci_device *vdev;
struct mdev_device *mdev;
- unsigned long handle;
};
static int vfio_mdev_pci_create(struct kobject *kobj, struct mdev_device *mdev)
{
struct device *pdev;
- struct vfio_pci_device *vdev;
+ struct vfio_mdev_pci_device *vmdev;
struct vfio_mdev_pci *pmdev;
int ret;
pdev = mdev_parent_dev(mdev);
- vdev = dev_get_drvdata(pdev);
+ vmdev = dev_get_drvdata(pdev);
+
+ if (atomic_dec_if_positive(&vmdev->avail) < 0)
+ return -ENOSPC;
+
pmdev = kzalloc(sizeof(struct vfio_mdev_pci), GFP_KERNEL);
- if (pmdev == NULL) {
- ret = -EBUSY;
- goto out;
+ if (!pmdev) {
+ atomic_inc(&vmdev->avail);
+ return -ENOMEM;
}
pmdev->mdev = mdev;
- pmdev->vdev = vdev;
+ pmdev->vdev = &vmdev->vdev;
mdev_set_drvdata(mdev, pmdev);
ret = mdev_set_iommu_device(mdev_dev(mdev), pdev);
if (ret) {
pr_info("%s, failed to config iommu isolation for mdev: %s on pf: %s\n",
__func__, dev_name(mdev_dev(mdev)), dev_name(pdev));
- goto out;
+ kfree(pmdev);
+ atomic_inc(&vmdev->avail);
+ return ret;
}
pr_info("%s, creation succeeded for mdev: %s\n", __func__,
dev_name(mdev_dev(mdev)));
-out:
- return ret;
+ return 0;
}
static int vfio_mdev_pci_remove(struct mdev_device *mdev)
{
struct vfio_mdev_pci *pmdev = mdev_get_drvdata(mdev);
+ struct vfio_mdev_pci_device *vmdev;
+
+ vmdev = container_of(pmdev->vdev, struct vfio_mdev_pci_device, vdev);
kfree(pmdev);
+ atomic_inc(&vmdev->avail);
pr_info("%s, succeeded for mdev: %s\n", __func__,
dev_name(mdev_dev(mdev)));
@@ -240,24 +241,12 @@ static ssize_t vfio_mdev_pci_write(struct mdev_device *mdev,
return vfio_pci_write(pmdev->vdev, (char __user *)buf, count, ppos);
}
-static const struct mdev_parent_ops vfio_mdev_pci_ops = {
- .supported_type_groups = vfio_mdev_pci_type_groups,
- .create = vfio_mdev_pci_create,
- .remove = vfio_mdev_pci_remove,
-
- .open = vfio_mdev_pci_open,
- .release = vfio_mdev_pci_release,
-
- .read = vfio_mdev_pci_read,
- .write = vfio_mdev_pci_write,
- .mmap = vfio_mdev_pci_mmap,
- .ioctl = vfio_mdev_pci_ioctl,
-};
-
static int vfio_mdev_pci_driver_probe(struct pci_dev *pdev,
const struct pci_device_id *id)
{
+ struct vfio_mdev_pci_device *vmdev;
struct vfio_pci_device *vdev;
+ const struct mdev_parent_ops *ops;
int ret;
if (pdev->hdr_type != PCI_HEADER_TYPE_NORMAL)
@@ -276,10 +265,38 @@ static int vfio_mdev_pci_driver_probe(struct pci_dev *pdev,
return -EBUSY;
}
- vdev = kzalloc(sizeof(*vdev), GFP_KERNEL);
- if (!vdev)
+ vmdev = kzalloc(sizeof(*vmdev), GFP_KERNEL);
+ if (!vmdev)
return -ENOMEM;
+ vmdev->attr.name = kasprintf(GFP_KERNEL,
+ "%04x:%04x:%04x:%04x:%06x:%02x",
+ pdev->vendor, pdev->device,
+ pdev->subsystem_vendor,
+ pdev->subsystem_device, pdev->class,
+ pdev->revision);
+ if (!vmdev->attr.name) {
+ kfree(vmdev);
+ return -ENOMEM;
+ }
+
+ atomic_set(&vmdev->avail, 1);
+
+ vmdev->attr.attrs = vfio_mdev_pci_types_attrs;
+ vmdev->groups[0] = &vmdev->attr;
+
+ vmdev->ops.supported_type_groups = vmdev->groups;
+ vmdev->ops.create = vfio_mdev_pci_create;
+ vmdev->ops.remove = vfio_mdev_pci_remove;
+ vmdev->ops.open = vfio_mdev_pci_open;
+ vmdev->ops.release = vfio_mdev_pci_release;
+ vmdev->ops.read = vfio_mdev_pci_read;
+ vmdev->ops.write = vfio_mdev_pci_write;
+ vmdev->ops.mmap = vfio_mdev_pci_mmap;
+ vmdev->ops.ioctl = vfio_mdev_pci_ioctl;
+ ops = &vmdev->ops;
+
+ vdev = &vmdev->vdev;
vdev->pdev = pdev;
vdev->irq_type = VFIO_PCI_NUM_IRQS;
mutex_init(&vdev->igate);
@@ -292,7 +309,7 @@ static int vfio_mdev_pci_driver_probe(struct pci_dev *pdev,
#endif
vdev->disable_idle_d3 = disable_idle_d3;
- pci_set_drvdata(pdev, vdev);
+ pci_set_drvdata(pdev, vmdev);
ret = vfio_pci_reflck_attach(vdev);
if (ret) {
@@ -323,7 +340,7 @@ static int vfio_mdev_pci_driver_probe(struct pci_dev *pdev,
vfio_pci_set_power_state(vdev, PCI_D3hot);
}
- ret = mdev_register_device(&pdev->dev, &vfio_mdev_pci_ops);
+ ret = mdev_register_device(&pdev->dev, ops);
if (ret)
pr_err("Cannot register mdev for device %s\n",
dev_name(&pdev->dev));
@@ -335,12 +352,17 @@ static int vfio_mdev_pci_driver_probe(struct pci_dev *pdev,
static void vfio_mdev_pci_driver_remove(struct pci_dev *pdev)
{
+ struct vfio_mdev_pci_device *vmdev;
struct vfio_pci_device *vdev;
- vdev = pci_get_drvdata(pdev);
- if (!vdev)
+ mdev_unregister_device(&pdev->dev);
+
+ vmdev = pci_get_drvdata(pdev);
+ if (!vmdev)
return;
+ vdev = &vmdev->vdev;
+
vfio_pci_reflck_put(vdev->reflck);
kfree(vdev->region);
@@ -358,7 +380,8 @@ static void vfio_mdev_pci_driver_remove(struct pci_dev *pdev)
VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM);
}
- kfree(vdev);
+ kfree(vmdev->attr.name);
+ kfree(vmdev);
}
static struct pci_driver vfio_mdev_pci_driver = {
--
2.7.4
prev parent reply other threads:[~2020-01-07 12:21 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-01-07 12:01 [PATCH v4 00/12] vfio_pci: wrap pci device as a mediated device Liu Yi L
2020-01-07 12:01 ` [PATCH v4 01/12] vfio_pci: refine user config reference in vfio-pci module Liu Yi L
2020-01-09 22:48 ` Alex Williamson
2020-01-16 12:19 ` Liu, Yi L
2020-01-07 12:01 ` [PATCH v4 02/12] vfio_pci: move vfio_pci_is_vga/vfio_vga_disabled to header file Liu Yi L
2020-01-15 10:43 ` Cornelia Huck
2020-01-16 12:46 ` Liu, Yi L
2020-01-07 12:01 ` [PATCH v4 03/12] vfio_pci: refine vfio_pci_driver reference in vfio_pci.c Liu Yi L
2020-01-09 22:48 ` Alex Williamson
2020-01-10 7:35 ` Liu, Yi L
2020-01-07 12:01 ` [PATCH v4 04/12] vfio_pci: make common functions be extern Liu Yi L
2020-01-15 10:56 ` Cornelia Huck
2020-01-16 12:48 ` Liu, Yi L
2020-01-07 12:01 ` [PATCH v4 05/12] vfio_pci: duplicate vfio_pci.c Liu Yi L
2020-01-15 11:03 ` Cornelia Huck
2020-01-15 15:12 ` Alex Williamson
2020-01-07 12:01 ` [PATCH v4 06/12] vfio_pci: shrink vfio_pci_common.c Liu Yi L
2020-01-07 12:01 ` [PATCH v4 07/12] vfio_pci: shrink vfio_pci.c Liu Yi L
2020-01-08 11:24 ` kbuild test robot
2020-01-09 22:48 ` Alex Williamson
2020-01-16 12:42 ` Liu, Yi L
2020-01-07 12:01 ` [PATCH v4 08/12] vfio_pci: duplicate vfio_pci_private.h to include/linux Liu Yi L
2020-01-07 12:01 ` [PATCH v4 09/12] vfio: split vfio_pci_private.h into two files Liu Yi L
2020-01-09 22:48 ` Alex Williamson
2020-01-16 11:59 ` Liu, Yi L
2020-01-07 12:01 ` [PATCH v4 10/12] vfio: build vfio_pci_common.c into a kernel module Liu Yi L
2020-01-07 12:01 ` [PATCH v4 11/12] samples: add vfio-mdev-pci driver Liu Yi L
2020-01-09 22:48 ` Alex Williamson
2020-01-16 12:33 ` Liu, Yi L
2020-01-16 21:24 ` Alex Williamson
2020-01-18 14:25 ` Liu, Yi L
2020-01-20 21:07 ` Alex Williamson
2020-01-21 7:43 ` Tian, Kevin
2020-01-21 8:43 ` Yan Zhao
2020-01-21 20:04 ` Alex Williamson
2020-01-21 21:54 ` Yan Zhao
2020-01-23 23:33 ` Alex Williamson
2020-01-31 2:26 ` Yan Zhao
2020-01-15 12:30 ` Cornelia Huck
2020-01-16 13:23 ` Liu, Yi L
2020-01-16 17:40 ` Cornelia Huck
2020-01-18 14:23 ` Liu, Yi L
2020-01-20 8:55 ` Cornelia Huck
2020-01-07 12:01 ` Liu Yi L [this message]
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=1578398509-26453-13-git-send-email-yi.l.liu@intel.com \
--to=yi.l.liu@intel.com \
--cc=alex.williamson@redhat.com \
--cc=baolu.lu@linux.intel.com \
--cc=joro@8bytes.org \
--cc=kevin.tian@intel.com \
--cc=kvm@vger.kernel.org \
--cc=kwankhede@nvidia.com \
--cc=linux-kernel@vger.kernel.org \
--cc=peterx@redhat.com \
/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).