From: Shixiong Ou <[email protected]>

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

Signed-off-by: Shixiong Ou <[email protected]>
---
 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


Reply via email to