mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
vfio/mdev: Remove vfio_mdev.c
Now that all mdev drivers directly create their own mdev_device driver and directly register with the vfio core's vfio_device_ops this is all dead code. Delete vfio_mdev.c and the mdev_parent_ops members that are connected to it. Signed-off-by: Jason Gunthorpe <jgg@nvidia.com> Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Zhi Wang <zhi.a.wang@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20220411141403.86980-31-hch@lst.de Reviewed-by: Kirti Wankhede <kwankhede@nvidia.com> Reviewed-by: Zhi Wang <zhi.a.wang@intel.com>
This commit is contained in:
parent
cba619cb0d
commit
6c7f98b334
@ -138,9 +138,6 @@ The structures in the mdev_parent_ops structure are as follows:
|
|||||||
* supported_config: attributes to define supported configurations
|
* supported_config: attributes to define supported configurations
|
||||||
* device_driver: device driver to bind for mediated device instances
|
* device_driver: device driver to bind for mediated device instances
|
||||||
|
|
||||||
The mdev_parent_ops also still has various functions pointers. Theses exist
|
|
||||||
for historical reasons only and shall not be used for new drivers.
|
|
||||||
|
|
||||||
When a driver wants to add the GUID creation sysfs to an existing device it has
|
When a driver wants to add the GUID creation sysfs to an existing device it has
|
||||||
probe'd to then it should call::
|
probe'd to then it should call::
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0-only
|
# SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
|
||||||
mdev-y := mdev_core.o mdev_sysfs.o mdev_driver.o vfio_mdev.o
|
mdev-y := mdev_core.o mdev_sysfs.o mdev_driver.o
|
||||||
|
|
||||||
obj-$(CONFIG_VFIO_MDEV) += mdev.o
|
obj-$(CONFIG_VFIO_MDEV) += mdev.o
|
||||||
|
@ -89,17 +89,10 @@ void mdev_release_parent(struct kref *kref)
|
|||||||
static void mdev_device_remove_common(struct mdev_device *mdev)
|
static void mdev_device_remove_common(struct mdev_device *mdev)
|
||||||
{
|
{
|
||||||
struct mdev_parent *parent = mdev->type->parent;
|
struct mdev_parent *parent = mdev->type->parent;
|
||||||
int ret;
|
|
||||||
|
|
||||||
mdev_remove_sysfs_files(mdev);
|
mdev_remove_sysfs_files(mdev);
|
||||||
device_del(&mdev->dev);
|
device_del(&mdev->dev);
|
||||||
lockdep_assert_held(&parent->unreg_sem);
|
lockdep_assert_held(&parent->unreg_sem);
|
||||||
if (parent->ops->remove) {
|
|
||||||
ret = parent->ops->remove(mdev);
|
|
||||||
if (ret)
|
|
||||||
dev_err(&mdev->dev, "Remove failed: err=%d\n", ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Balances with device_initialize() */
|
/* Balances with device_initialize() */
|
||||||
put_device(&mdev->dev);
|
put_device(&mdev->dev);
|
||||||
}
|
}
|
||||||
@ -131,7 +124,7 @@ int mdev_register_device(struct device *dev, const struct mdev_parent_ops *ops)
|
|||||||
/* check for mandatory ops */
|
/* check for mandatory ops */
|
||||||
if (!ops || !ops->supported_type_groups)
|
if (!ops || !ops->supported_type_groups)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (!ops->device_driver && (!ops->create || !ops->remove))
|
if (!ops->device_driver)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
dev = get_device(dev);
|
dev = get_device(dev);
|
||||||
@ -297,18 +290,10 @@ int mdev_device_create(struct mdev_type *type, const guid_t *uuid)
|
|||||||
goto out_put_device;
|
goto out_put_device;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parent->ops->create) {
|
|
||||||
ret = parent->ops->create(mdev);
|
|
||||||
if (ret)
|
|
||||||
goto out_unlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = device_add(&mdev->dev);
|
ret = device_add(&mdev->dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out_remove;
|
goto out_unlock;
|
||||||
|
|
||||||
if (!drv)
|
|
||||||
drv = &vfio_mdev_driver;
|
|
||||||
ret = device_driver_attach(&drv->driver, &mdev->dev);
|
ret = device_driver_attach(&drv->driver, &mdev->dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out_del;
|
goto out_del;
|
||||||
@ -325,9 +310,6 @@ int mdev_device_create(struct mdev_type *type, const guid_t *uuid)
|
|||||||
|
|
||||||
out_del:
|
out_del:
|
||||||
device_del(&mdev->dev);
|
device_del(&mdev->dev);
|
||||||
out_remove:
|
|
||||||
if (parent->ops->remove)
|
|
||||||
parent->ops->remove(mdev);
|
|
||||||
out_unlock:
|
out_unlock:
|
||||||
up_read(&parent->unreg_sem);
|
up_read(&parent->unreg_sem);
|
||||||
out_put_device:
|
out_put_device:
|
||||||
@ -370,28 +352,14 @@ int mdev_device_remove(struct mdev_device *mdev)
|
|||||||
|
|
||||||
static int __init mdev_init(void)
|
static int __init mdev_init(void)
|
||||||
{
|
{
|
||||||
int rc;
|
return bus_register(&mdev_bus_type);
|
||||||
|
|
||||||
rc = mdev_bus_register();
|
|
||||||
if (rc)
|
|
||||||
return rc;
|
|
||||||
rc = mdev_register_driver(&vfio_mdev_driver);
|
|
||||||
if (rc)
|
|
||||||
goto err_bus;
|
|
||||||
return 0;
|
|
||||||
err_bus:
|
|
||||||
mdev_bus_unregister();
|
|
||||||
return rc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit mdev_exit(void)
|
static void __exit mdev_exit(void)
|
||||||
{
|
{
|
||||||
mdev_unregister_driver(&vfio_mdev_driver);
|
|
||||||
|
|
||||||
if (mdev_bus_compat_class)
|
if (mdev_bus_compat_class)
|
||||||
class_compat_unregister(mdev_bus_compat_class);
|
class_compat_unregister(mdev_bus_compat_class);
|
||||||
|
bus_unregister(&mdev_bus_type);
|
||||||
mdev_bus_unregister();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
subsys_initcall(mdev_init)
|
subsys_initcall(mdev_init)
|
||||||
|
@ -74,13 +74,3 @@ void mdev_unregister_driver(struct mdev_driver *drv)
|
|||||||
driver_unregister(&drv->driver);
|
driver_unregister(&drv->driver);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(mdev_unregister_driver);
|
EXPORT_SYMBOL(mdev_unregister_driver);
|
||||||
|
|
||||||
int mdev_bus_register(void)
|
|
||||||
{
|
|
||||||
return bus_register(&mdev_bus_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
void mdev_bus_unregister(void)
|
|
||||||
{
|
|
||||||
bus_unregister(&mdev_bus_type);
|
|
||||||
}
|
|
||||||
|
@ -37,8 +37,6 @@ struct mdev_type {
|
|||||||
#define to_mdev_type(_kobj) \
|
#define to_mdev_type(_kobj) \
|
||||||
container_of(_kobj, struct mdev_type, kobj)
|
container_of(_kobj, struct mdev_type, kobj)
|
||||||
|
|
||||||
extern struct mdev_driver vfio_mdev_driver;
|
|
||||||
|
|
||||||
int parent_create_sysfs_files(struct mdev_parent *parent);
|
int parent_create_sysfs_files(struct mdev_parent *parent);
|
||||||
void parent_remove_sysfs_files(struct mdev_parent *parent);
|
void parent_remove_sysfs_files(struct mdev_parent *parent);
|
||||||
|
|
||||||
|
@ -1,152 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
|
||||||
/*
|
|
||||||
* VFIO based driver for Mediated device
|
|
||||||
*
|
|
||||||
* Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
|
|
||||||
* Author: Neo Jia <cjia@nvidia.com>
|
|
||||||
* Kirti Wankhede <kwankhede@nvidia.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/module.h>
|
|
||||||
#include <linux/device.h>
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/slab.h>
|
|
||||||
#include <linux/vfio.h>
|
|
||||||
#include <linux/mdev.h>
|
|
||||||
|
|
||||||
#include "mdev_private.h"
|
|
||||||
|
|
||||||
static int vfio_mdev_open_device(struct vfio_device *core_vdev)
|
|
||||||
{
|
|
||||||
struct mdev_device *mdev = to_mdev_device(core_vdev->dev);
|
|
||||||
struct mdev_parent *parent = mdev->type->parent;
|
|
||||||
|
|
||||||
if (unlikely(!parent->ops->open_device))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return parent->ops->open_device(mdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vfio_mdev_close_device(struct vfio_device *core_vdev)
|
|
||||||
{
|
|
||||||
struct mdev_device *mdev = to_mdev_device(core_vdev->dev);
|
|
||||||
struct mdev_parent *parent = mdev->type->parent;
|
|
||||||
|
|
||||||
if (likely(parent->ops->close_device))
|
|
||||||
parent->ops->close_device(mdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
static long vfio_mdev_unlocked_ioctl(struct vfio_device *core_vdev,
|
|
||||||
unsigned int cmd, unsigned long arg)
|
|
||||||
{
|
|
||||||
struct mdev_device *mdev = to_mdev_device(core_vdev->dev);
|
|
||||||
struct mdev_parent *parent = mdev->type->parent;
|
|
||||||
|
|
||||||
if (unlikely(!parent->ops->ioctl))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return parent->ops->ioctl(mdev, cmd, arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t vfio_mdev_read(struct vfio_device *core_vdev, char __user *buf,
|
|
||||||
size_t count, loff_t *ppos)
|
|
||||||
{
|
|
||||||
struct mdev_device *mdev = to_mdev_device(core_vdev->dev);
|
|
||||||
struct mdev_parent *parent = mdev->type->parent;
|
|
||||||
|
|
||||||
if (unlikely(!parent->ops->read))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
return parent->ops->read(mdev, buf, count, ppos);
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t vfio_mdev_write(struct vfio_device *core_vdev,
|
|
||||||
const char __user *buf, size_t count,
|
|
||||||
loff_t *ppos)
|
|
||||||
{
|
|
||||||
struct mdev_device *mdev = to_mdev_device(core_vdev->dev);
|
|
||||||
struct mdev_parent *parent = mdev->type->parent;
|
|
||||||
|
|
||||||
if (unlikely(!parent->ops->write))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
return parent->ops->write(mdev, buf, count, ppos);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int vfio_mdev_mmap(struct vfio_device *core_vdev,
|
|
||||||
struct vm_area_struct *vma)
|
|
||||||
{
|
|
||||||
struct mdev_device *mdev = to_mdev_device(core_vdev->dev);
|
|
||||||
struct mdev_parent *parent = mdev->type->parent;
|
|
||||||
|
|
||||||
if (unlikely(!parent->ops->mmap))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
return parent->ops->mmap(mdev, vma);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vfio_mdev_request(struct vfio_device *core_vdev, unsigned int count)
|
|
||||||
{
|
|
||||||
struct mdev_device *mdev = to_mdev_device(core_vdev->dev);
|
|
||||||
struct mdev_parent *parent = mdev->type->parent;
|
|
||||||
|
|
||||||
if (parent->ops->request)
|
|
||||||
parent->ops->request(mdev, count);
|
|
||||||
else if (count == 0)
|
|
||||||
dev_notice(mdev_dev(mdev),
|
|
||||||
"No mdev vendor driver request callback support, blocked until released by user\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct vfio_device_ops vfio_mdev_dev_ops = {
|
|
||||||
.name = "vfio-mdev",
|
|
||||||
.open_device = vfio_mdev_open_device,
|
|
||||||
.close_device = vfio_mdev_close_device,
|
|
||||||
.ioctl = vfio_mdev_unlocked_ioctl,
|
|
||||||
.read = vfio_mdev_read,
|
|
||||||
.write = vfio_mdev_write,
|
|
||||||
.mmap = vfio_mdev_mmap,
|
|
||||||
.request = vfio_mdev_request,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int vfio_mdev_probe(struct mdev_device *mdev)
|
|
||||||
{
|
|
||||||
struct vfio_device *vdev;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
vdev = kzalloc(sizeof(*vdev), GFP_KERNEL);
|
|
||||||
if (!vdev)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
vfio_init_group_dev(vdev, &mdev->dev, &vfio_mdev_dev_ops);
|
|
||||||
ret = vfio_register_emulated_iommu_dev(vdev);
|
|
||||||
if (ret)
|
|
||||||
goto out_uninit;
|
|
||||||
|
|
||||||
dev_set_drvdata(&mdev->dev, vdev);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
out_uninit:
|
|
||||||
vfio_uninit_group_dev(vdev);
|
|
||||||
kfree(vdev);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vfio_mdev_remove(struct mdev_device *mdev)
|
|
||||||
{
|
|
||||||
struct vfio_device *vdev = dev_get_drvdata(&mdev->dev);
|
|
||||||
|
|
||||||
vfio_unregister_group_dev(vdev);
|
|
||||||
vfio_uninit_group_dev(vdev);
|
|
||||||
kfree(vdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct mdev_driver vfio_mdev_driver = {
|
|
||||||
.driver = {
|
|
||||||
.name = "vfio_mdev",
|
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.mod_name = KBUILD_MODNAME,
|
|
||||||
},
|
|
||||||
.probe = vfio_mdev_probe,
|
|
||||||
.remove = vfio_mdev_remove,
|
|
||||||
};
|
|
@ -40,40 +40,7 @@ struct device *mtype_get_parent_dev(struct mdev_type *mtype);
|
|||||||
* @mdev_attr_groups: Attributes of the mediated device.
|
* @mdev_attr_groups: Attributes of the mediated device.
|
||||||
* @supported_type_groups: Attributes to define supported types. It is mandatory
|
* @supported_type_groups: Attributes to define supported types. It is mandatory
|
||||||
* to provide supported types.
|
* to provide supported types.
|
||||||
* @create: Called to allocate basic resources in parent device's
|
*
|
||||||
* driver for a particular mediated device. It is
|
|
||||||
* mandatory to provide create ops.
|
|
||||||
* @mdev: mdev_device structure on of mediated device
|
|
||||||
* that is being created
|
|
||||||
* Returns integer: success (0) or error (< 0)
|
|
||||||
* @remove: Called to free resources in parent device's driver for
|
|
||||||
* a mediated device. It is mandatory to provide 'remove'
|
|
||||||
* ops.
|
|
||||||
* @mdev: mdev_device device structure which is being
|
|
||||||
* destroyed
|
|
||||||
* Returns integer: success (0) or error (< 0)
|
|
||||||
* @read: Read emulation callback
|
|
||||||
* @mdev: mediated device structure
|
|
||||||
* @buf: read buffer
|
|
||||||
* @count: number of bytes to read
|
|
||||||
* @ppos: address.
|
|
||||||
* Retuns number on bytes read on success or error.
|
|
||||||
* @write: Write emulation callback
|
|
||||||
* @mdev: mediated device structure
|
|
||||||
* @buf: write buffer
|
|
||||||
* @count: number of bytes to be written
|
|
||||||
* @ppos: address.
|
|
||||||
* Retuns number on bytes written on success or error.
|
|
||||||
* @ioctl: IOCTL callback
|
|
||||||
* @mdev: mediated device structure
|
|
||||||
* @cmd: ioctl command
|
|
||||||
* @arg: arguments to ioctl
|
|
||||||
* @mmap: mmap callback
|
|
||||||
* @mdev: mediated device structure
|
|
||||||
* @vma: vma structure
|
|
||||||
* @request: request callback to release device
|
|
||||||
* @mdev: mediated device structure
|
|
||||||
* @count: request sequence number
|
|
||||||
* Parent device that support mediated device should be registered with mdev
|
* Parent device that support mediated device should be registered with mdev
|
||||||
* module with mdev_parent_ops structure.
|
* module with mdev_parent_ops structure.
|
||||||
**/
|
**/
|
||||||
@ -83,19 +50,6 @@ struct mdev_parent_ops {
|
|||||||
const struct attribute_group **dev_attr_groups;
|
const struct attribute_group **dev_attr_groups;
|
||||||
const struct attribute_group **mdev_attr_groups;
|
const struct attribute_group **mdev_attr_groups;
|
||||||
struct attribute_group **supported_type_groups;
|
struct attribute_group **supported_type_groups;
|
||||||
|
|
||||||
int (*create)(struct mdev_device *mdev);
|
|
||||||
int (*remove)(struct mdev_device *mdev);
|
|
||||||
int (*open_device)(struct mdev_device *mdev);
|
|
||||||
void (*close_device)(struct mdev_device *mdev);
|
|
||||||
ssize_t (*read)(struct mdev_device *mdev, char __user *buf,
|
|
||||||
size_t count, loff_t *ppos);
|
|
||||||
ssize_t (*write)(struct mdev_device *mdev, const char __user *buf,
|
|
||||||
size_t count, loff_t *ppos);
|
|
||||||
long (*ioctl)(struct mdev_device *mdev, unsigned int cmd,
|
|
||||||
unsigned long arg);
|
|
||||||
int (*mmap)(struct mdev_device *mdev, struct vm_area_struct *vma);
|
|
||||||
void (*request)(struct mdev_device *mdev, unsigned int count);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* interface for exporting mdev supported type attributes */
|
/* interface for exporting mdev supported type attributes */
|
||||||
|
Loading…
Reference in New Issue
Block a user