Skip to content

Commit 0063e8b

Browse files
weiping zhangmstsirkin
weiping zhang
authored andcommitted
virtio_vop: don't kfree device on register failure
As mentioned at drivers/base/core.c: /* * NOTE: _Never_ directly free @dev after calling this function, even * if it returned an error! Always use put_device() to give up the * reference initialized in this function instead. */ so we don't free vdev until vdev->vdev.dev.release be called. Signed-off-by: weiping zhang <[email protected]> Reviewed-by: Cornelia Huck <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]>
1 parent 33635bd commit 0063e8b

File tree

1 file changed

+13
-7
lines changed

1 file changed

+13
-7
lines changed

drivers/misc/mic/vop/vop_main.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -452,10 +452,12 @@ static irqreturn_t vop_virtio_intr_handler(int irq, void *data)
452452

453453
static void vop_virtio_release_dev(struct device *_d)
454454
{
455-
/*
456-
* No need for a release method similar to virtio PCI.
457-
* Provide an empty one to avoid getting a warning from core.
458-
*/
455+
struct virtio_device *vdev =
456+
container_of(_d, struct virtio_device, dev);
457+
struct _vop_vdev *vop_vdev =
458+
container_of(vdev, struct _vop_vdev, vdev);
459+
460+
kfree(vop_vdev);
459461
}
460462

461463
/*
@@ -466,7 +468,7 @@ static int _vop_add_device(struct mic_device_desc __iomem *d,
466468
unsigned int offset, struct vop_device *vpdev,
467469
int dnode)
468470
{
469-
struct _vop_vdev *vdev;
471+
struct _vop_vdev *vdev, *reg_dev = NULL;
470472
int ret;
471473
u8 type = ioread8(&d->type);
472474

@@ -497,6 +499,7 @@ static int _vop_add_device(struct mic_device_desc __iomem *d,
497499
vdev->c2h_vdev_db = ioread8(&vdev->dc->c2h_vdev_db);
498500

499501
ret = register_virtio_device(&vdev->vdev);
502+
reg_dev = vdev;
500503
if (ret) {
501504
dev_err(_vop_dev(vdev),
502505
"Failed to register vop device %u type %u\n",
@@ -512,7 +515,10 @@ static int _vop_add_device(struct mic_device_desc __iomem *d,
512515
free_irq:
513516
vpdev->hw_ops->free_irq(vpdev, vdev->virtio_cookie, vdev);
514517
kfree:
515-
kfree(vdev);
518+
if (reg_dev)
519+
put_device(&vdev->vdev.dev);
520+
else
521+
kfree(vdev);
516522
return ret;
517523
}
518524

@@ -568,7 +574,7 @@ static int _vop_remove_device(struct mic_device_desc __iomem *d,
568574
iowrite8(-1, &dc->h2c_vdev_db);
569575
if (status & VIRTIO_CONFIG_S_DRIVER_OK)
570576
wait_for_completion(&vdev->reset_done);
571-
kfree(vdev);
577+
put_device(&vdev->vdev.dev);
572578
iowrite8(1, &dc->guest_ack);
573579
dev_dbg(&vpdev->dev, "%s %d guest_ack %d\n",
574580
__func__, __LINE__, ioread8(&dc->guest_ack));

0 commit comments

Comments
 (0)