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

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

 



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.

> > >
> > > 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