[PATCH] virtio_console: Convert to use devm funcs

From: oushixiong1025
Date: Tue Jan 28 2025 - 00:53:18 EST


From: Shixiong Ou <oushixiong@xxxxxxxxxx>

Convert to devm_* funcs so that no need to manual free in error path.

Signed-off-by: Shixiong Ou <oushixiong@xxxxxxxxxx>
---
drivers/char/virtio_console.c | 43 ++++++++++++++---------------------
1 file changed, 17 insertions(+), 26 deletions(-)

diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index c62b208b42f1..657cf15dad55 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -1811,15 +1811,17 @@ static int init_vqs(struct ports_device *portdev)
nr_ports = portdev->max_nr_ports;
nr_queues = use_multiport(portdev) ? (nr_ports + 1) * 2 : 2;

- vqs = kmalloc_array(nr_queues, sizeof(struct virtqueue *), GFP_KERNEL);
- vqs_info = kcalloc(nr_queues, sizeof(*vqs_info), GFP_KERNEL);
- portdev->in_vqs = kmalloc_array(nr_ports, sizeof(struct virtqueue *),
- GFP_KERNEL);
- portdev->out_vqs = kmalloc_array(nr_ports, sizeof(struct virtqueue *),
- GFP_KERNEL);
+ vqs = devm_kmalloc_array(&portdev->vdev->dev, nr_queues,
+ sizeof(struct virtqueue *), GFP_KERNEL);
+ vqs_info = devm_kcalloc(&portdev->vdev->dev, nr_queues,
+ sizeof(*vqs_info), GFP_KERNEL);
+ portdev->in_vqs = devm_kmalloc_array(&portdev->vdev->dev,
+ nr_ports, sizeof(struct virtqueue *), GFP_KERNEL);
+ portdev->out_vqs = devm_kmalloc_array(&portdev->vdev->dev,
+ nr_ports, sizeof(struct virtqueue *), GFP_KERNEL);
if (!vqs || !vqs_info || !portdev->in_vqs || !portdev->out_vqs) {
err = -ENOMEM;
- goto free;
+ return err;
}

/*
@@ -1850,7 +1852,7 @@ static int init_vqs(struct ports_device *portdev)
/* Find the queues. */
err = virtio_find_vqs(portdev->vdev, nr_queues, vqs, vqs_info, NULL);
if (err)
- goto free;
+ return err;

j = 0;
portdev->in_vqs[0] = vqs[0];
@@ -1866,18 +1868,10 @@ static int init_vqs(struct ports_device *portdev)
portdev->out_vqs[i] = vqs[j + 1];
}
}
- kfree(vqs_info);
- kfree(vqs);
+ devm_kfree(&portdev->vdev->dev, vqs_info);
+ devm_kfree(&portdev->vdev->dev, vqs);

return 0;
-
-free:
- kfree(portdev->out_vqs);
- kfree(portdev->in_vqs);
- kfree(vqs_info);
- kfree(vqs);
-
- return err;
}

static const struct file_operations portdev_fops = {
@@ -1897,8 +1891,8 @@ static void remove_vqs(struct ports_device *portdev)
cond_resched();
}
portdev->vdev->config->del_vqs(portdev->vdev);
- kfree(portdev->in_vqs);
- kfree(portdev->out_vqs);
+ devm_kfree(&portdev->vdev->dev, portdev->in_vqs);
+ devm_kfree(&portdev->vdev->dev, portdev->out_vqs);
}

static void virtcons_remove(struct virtio_device *vdev)
@@ -1941,7 +1935,6 @@ static void virtcons_remove(struct virtio_device *vdev)
* away.
*/
remove_vqs(portdev);
- kfree(portdev);
}

/*
@@ -1967,7 +1960,7 @@ static int virtcons_probe(struct virtio_device *vdev)
return -EINVAL;
}

- portdev = kmalloc(sizeof(*portdev), GFP_KERNEL);
+ portdev = devm_kmalloc(&vdev->dev, sizeof(*portdev), GFP_KERNEL);
if (!portdev) {
err = -ENOMEM;
goto fail;
@@ -1984,7 +1977,7 @@ static int virtcons_probe(struct virtio_device *vdev)
"Error %d registering chrdev for device %u\n",
portdev->chr_major, vdev->index);
err = portdev->chr_major;
- goto free;
+ goto fail;
}

multiport = false;
@@ -2001,7 +1994,7 @@ static int virtcons_probe(struct virtio_device *vdev)
"Invalidate max_nr_ports %d",
portdev->max_nr_ports);
err = -EINVAL;
- goto free;
+ goto fail;
}
multiport = true;
}
@@ -2060,8 +2053,6 @@ static int virtcons_probe(struct virtio_device *vdev)

free_chrdev:
unregister_chrdev(portdev->chr_major, "virtio-portsdev");
-free:
- kfree(portdev);
fail:
return err;
}
--
2.43.0