Skip to content

Commit 0e0348a

Browse files
paravmellanoxmstsirkin
authored andcommitted
vduse: Tie vduse mgmtdev and its device
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>
1 parent ace9252 commit 0e0348a

1 file changed

Lines changed: 37 additions & 23 deletions

File tree

drivers/vdpa/vdpa_user/vduse_dev.c

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1476,16 +1476,12 @@ static char *vduse_devnode(struct device *dev, umode_t *mode)
14761476
return kasprintf(GFP_KERNEL, "vduse/%s", dev_name(dev));
14771477
}
14781478

1479-
static void vduse_mgmtdev_release(struct device *dev)
1480-
{
1481-
}
1482-
1483-
static struct device vduse_mgmtdev = {
1484-
.init_name = "vduse",
1485-
.release = vduse_mgmtdev_release,
1479+
struct vduse_mgmt_dev {
1480+
struct vdpa_mgmt_dev mgmt_dev;
1481+
struct device dev;
14861482
};
14871483

1488-
static struct vdpa_mgmt_dev mgmt_dev;
1484+
static struct vduse_mgmt_dev *vduse_mgmt;
14891485

14901486
static int vduse_dev_init_vdpa(struct vduse_dev *dev, const char *name)
14911487
{
@@ -1510,7 +1506,7 @@ static int vduse_dev_init_vdpa(struct vduse_dev *dev, const char *name)
15101506
}
15111507
set_dma_ops(&vdev->vdpa.dev, &vduse_dev_dma_ops);
15121508
vdev->vdpa.dma_dev = &vdev->vdpa.dev;
1513-
vdev->vdpa.mdev = &mgmt_dev;
1509+
vdev->vdpa.mdev = &vduse_mgmt->mgmt_dev;
15141510

15151511
return 0;
15161512
}
@@ -1556,34 +1552,52 @@ static struct virtio_device_id id_table[] = {
15561552
{ 0 },
15571553
};
15581554

1559-
static struct vdpa_mgmt_dev mgmt_dev = {
1560-
.device = &vduse_mgmtdev,
1561-
.id_table = id_table,
1562-
.ops = &vdpa_dev_mgmtdev_ops,
1563-
};
1555+
static void vduse_mgmtdev_release(struct device *dev)
1556+
{
1557+
struct vduse_mgmt_dev *mgmt_dev;
1558+
1559+
mgmt_dev = container_of(dev, struct vduse_mgmt_dev, dev);
1560+
kfree(mgmt_dev);
1561+
}
15641562

15651563
static int vduse_mgmtdev_init(void)
15661564
{
15671565
int ret;
15681566

1569-
ret = device_register(&vduse_mgmtdev);
1570-
if (ret)
1567+
vduse_mgmt = kzalloc(sizeof(*vduse_mgmt), GFP_KERNEL);
1568+
if (!vduse_mgmt)
1569+
return -ENOMEM;
1570+
1571+
ret = dev_set_name(&vduse_mgmt->dev, "vduse");
1572+
if (ret) {
1573+
kfree(vduse_mgmt);
15711574
return ret;
1575+
}
15721576

1573-
ret = vdpa_mgmtdev_register(&mgmt_dev);
1577+
vduse_mgmt->dev.release = vduse_mgmtdev_release;
1578+
1579+
ret = device_register(&vduse_mgmt->dev);
15741580
if (ret)
1575-
goto err;
1581+
goto dev_reg_err;
15761582

1577-
return 0;
1578-
err:
1579-
device_unregister(&vduse_mgmtdev);
1583+
vduse_mgmt->mgmt_dev.id_table = id_table;
1584+
vduse_mgmt->mgmt_dev.ops = &vdpa_dev_mgmtdev_ops;
1585+
vduse_mgmt->mgmt_dev.device = &vduse_mgmt->dev;
1586+
ret = vdpa_mgmtdev_register(&vduse_mgmt->mgmt_dev);
1587+
if (ret)
1588+
device_unregister(&vduse_mgmt->dev);
1589+
1590+
return ret;
1591+
1592+
dev_reg_err:
1593+
put_device(&vduse_mgmt->dev);
15801594
return ret;
15811595
}
15821596

15831597
static void vduse_mgmtdev_exit(void)
15841598
{
1585-
vdpa_mgmtdev_unregister(&mgmt_dev);
1586-
device_unregister(&vduse_mgmtdev);
1599+
vdpa_mgmtdev_unregister(&vduse_mgmt->mgmt_dev);
1600+
device_unregister(&vduse_mgmt->dev);
15871601
}
15881602

15891603
static int vduse_init(void)

0 commit comments

Comments
 (0)