vduse: Tie vduse mgmtdev and its device
[ Upstream commit 0e0348ac3f0a6e6606f1aa5acb1803ada913aa3d ] vduse devices are not backed by any real devices such as PCI. Hence it doesn't have any parent device linked to it. Kernel driver model in [1] suggests to avoid an empty device release callback. Hence tie the mgmtdevice object's life cycle to an allocate dummy struct device instead of static one. [1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/core-api/kobject.rst?h=v5.18-rc7#n284 Signed-off-by: Parav Pandit <parav@nvidia.com> Message-Id: <20220613195223.473966-1-parav@nvidia.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Xie Yongji <xieyongji@bytedance.com> Acked-by: Jason Wang <jasowang@redhat.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
b34dbeb2b0
commit
65d7a723fd
@@ -1466,16 +1466,12 @@ static char *vduse_devnode(struct device *dev, umode_t *mode)
|
|||||||
return kasprintf(GFP_KERNEL, "vduse/%s", dev_name(dev));
|
return kasprintf(GFP_KERNEL, "vduse/%s", dev_name(dev));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vduse_mgmtdev_release(struct device *dev)
|
struct vduse_mgmt_dev {
|
||||||
{
|
struct vdpa_mgmt_dev mgmt_dev;
|
||||||
}
|
struct device dev;
|
||||||
|
|
||||||
static struct device vduse_mgmtdev = {
|
|
||||||
.init_name = "vduse",
|
|
||||||
.release = vduse_mgmtdev_release,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct vdpa_mgmt_dev mgmt_dev;
|
static struct vduse_mgmt_dev *vduse_mgmt;
|
||||||
|
|
||||||
static int vduse_dev_init_vdpa(struct vduse_dev *dev, const char *name)
|
static int vduse_dev_init_vdpa(struct vduse_dev *dev, const char *name)
|
||||||
{
|
{
|
||||||
@@ -1500,7 +1496,7 @@ static int vduse_dev_init_vdpa(struct vduse_dev *dev, const char *name)
|
|||||||
}
|
}
|
||||||
set_dma_ops(&vdev->vdpa.dev, &vduse_dev_dma_ops);
|
set_dma_ops(&vdev->vdpa.dev, &vduse_dev_dma_ops);
|
||||||
vdev->vdpa.dma_dev = &vdev->vdpa.dev;
|
vdev->vdpa.dma_dev = &vdev->vdpa.dev;
|
||||||
vdev->vdpa.mdev = &mgmt_dev;
|
vdev->vdpa.mdev = &vduse_mgmt->mgmt_dev;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1545,34 +1541,52 @@ static struct virtio_device_id id_table[] = {
|
|||||||
{ 0 },
|
{ 0 },
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct vdpa_mgmt_dev mgmt_dev = {
|
static void vduse_mgmtdev_release(struct device *dev)
|
||||||
.device = &vduse_mgmtdev,
|
{
|
||||||
.id_table = id_table,
|
struct vduse_mgmt_dev *mgmt_dev;
|
||||||
.ops = &vdpa_dev_mgmtdev_ops,
|
|
||||||
};
|
mgmt_dev = container_of(dev, struct vduse_mgmt_dev, dev);
|
||||||
|
kfree(mgmt_dev);
|
||||||
|
}
|
||||||
|
|
||||||
static int vduse_mgmtdev_init(void)
|
static int vduse_mgmtdev_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = device_register(&vduse_mgmtdev);
|
vduse_mgmt = kzalloc(sizeof(*vduse_mgmt), GFP_KERNEL);
|
||||||
|
if (!vduse_mgmt)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
ret = dev_set_name(&vduse_mgmt->dev, "vduse");
|
||||||
|
if (ret) {
|
||||||
|
kfree(vduse_mgmt);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
vduse_mgmt->dev.release = vduse_mgmtdev_release;
|
||||||
|
|
||||||
|
ret = device_register(&vduse_mgmt->dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
goto dev_reg_err;
|
||||||
|
|
||||||
|
vduse_mgmt->mgmt_dev.id_table = id_table;
|
||||||
|
vduse_mgmt->mgmt_dev.ops = &vdpa_dev_mgmtdev_ops;
|
||||||
|
vduse_mgmt->mgmt_dev.device = &vduse_mgmt->dev;
|
||||||
|
ret = vdpa_mgmtdev_register(&vduse_mgmt->mgmt_dev);
|
||||||
|
if (ret)
|
||||||
|
device_unregister(&vduse_mgmt->dev);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = vdpa_mgmtdev_register(&mgmt_dev);
|
dev_reg_err:
|
||||||
if (ret)
|
put_device(&vduse_mgmt->dev);
|
||||||
goto err;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
err:
|
|
||||||
device_unregister(&vduse_mgmtdev);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vduse_mgmtdev_exit(void)
|
static void vduse_mgmtdev_exit(void)
|
||||||
{
|
{
|
||||||
vdpa_mgmtdev_unregister(&mgmt_dev);
|
vdpa_mgmtdev_unregister(&vduse_mgmt->mgmt_dev);
|
||||||
device_unregister(&vduse_mgmtdev);
|
device_unregister(&vduse_mgmt->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vduse_init(void)
|
static int vduse_init(void)
|
||||||
|
|||||||
Reference in New Issue
Block a user