Re: [PATCH] virtio-net: fix the kzalloc/kfree mismatch problem

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




在 2021/5/24 上午10:06, Xuan Zhuo 写道:
On Mon, 24 May 2021 01:48:53 +0000, Guodeqing (A) <geffrey.guo@xxxxxxxxxx> wrote:

-----Original Message-----
From: Max Gurtovoy [mailto:mgurtovoy@xxxxxxxxxx]
Sent: Sunday, May 23, 2021 15:25
To: Guodeqing (A) <geffrey.guo@xxxxxxxxxx>; mst@xxxxxxxxxx
Cc: jasowang@xxxxxxxxxx; davem@xxxxxxxxxxxxx; kuba@xxxxxxxxxx;
virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx; netdev@xxxxxxxxxxxxxxx
Subject: Re: [PATCH] virtio-net: fix the kzalloc/kfree mismatch problem


On 5/22/2021 11:02 AM, guodeqing wrote:
If the virtio_net device does not suppurt the ctrl queue feature, the
vi->ctrl was not allocated, so there is no need to free it.
you don't need this check.

from kfree doc:

"If @objp is NULL, no operation is performed."

This is not a bug. I've set vi->ctrl to be NULL in case !vi->has_cvq.


   yes,  this is not a bug, the patch is just a optimization, because the vi->ctrl maybe
   be freed which  was not allocated, this may give people a misunderstanding.
   Thanks.

I think it may be enough to add a comment, and the code does not need to be
modified.

Thanks.


Or even just leave the current code as is. A lot of kernel codes was wrote under the assumption that kfree() should deal with NULL.

Thanks



Here I adjust the initialization sequence and the check of vi->has_cvq
to slove this problem.

Fixes: 	122b84a1267a ("virtio-net: don't allocate control_buf if not
supported")
Signed-off-by: guodeqing <geffrey.guo@xxxxxxxxxx>
---
   drivers/net/virtio_net.c | 20 ++++++++++----------
   1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index
9b6a4a875c55..894f894d3a29 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -2691,7 +2691,8 @@ static void virtnet_free_queues(struct
virtnet_info *vi)

   	kfree(vi->rq);
   	kfree(vi->sq);
-	kfree(vi->ctrl);
+	if (vi->has_cvq)
+		kfree(vi->ctrl);
   }

   static void _free_receive_bufs(struct virtnet_info *vi) @@ -2870,13
+2871,6 @@ static int virtnet_alloc_queues(struct virtnet_info *vi)
   {
   	int i;

-	if (vi->has_cvq) {
-		vi->ctrl = kzalloc(sizeof(*vi->ctrl), GFP_KERNEL);
-		if (!vi->ctrl)
-			goto err_ctrl;
-	} else {
-		vi->ctrl = NULL;
-	}
   	vi->sq = kcalloc(vi->max_queue_pairs, sizeof(*vi->sq), GFP_KERNEL);
   	if (!vi->sq)
   		goto err_sq;
@@ -2884,6 +2878,12 @@ static int virtnet_alloc_queues(struct
virtnet_info *vi)
   	if (!vi->rq)
   		goto err_rq;

+	if (vi->has_cvq) {
+		vi->ctrl = kzalloc(sizeof(*vi->ctrl), GFP_KERNEL);
+		if (!vi->ctrl)
+			goto err_ctrl;
+	}
+
   	INIT_DELAYED_WORK(&vi->refill, refill_work);
   	for (i = 0; i < vi->max_queue_pairs; i++) {
   		vi->rq[i].pages = NULL;
@@ -2902,11 +2902,11 @@ static int virtnet_alloc_queues(struct
virtnet_info *vi)

   	return 0;

+err_ctrl:
+	kfree(vi->rq);
   err_rq:
   	kfree(vi->sq);
   err_sq:
-	kfree(vi->ctrl);
-err_ctrl:
   	return -ENOMEM;
   }


_______________________________________________
Virtualization mailing list
Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx
https://lists.linuxfoundation.org/mailman/listinfo/virtualization




[Index of Archives]     [KVM Development]     [Libvirt Development]     [Libvirt Users]     [CentOS Virtualization]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux