[PATCH 05/14] netvsc: remove no longer needed receive staging buffers

KY Srinivasan kys at microsoft.com
Sun Feb 5 23:40:56 UTC 2017



> -----Original Message-----
> From: Stephen Hemminger [mailto:stephen at networkplumber.org]
> Sent: Wednesday, February 1, 2017 8:29 AM
> To: KY Srinivasan <kys at microsoft.com>; gregkh at linuxfoundation.org
> Cc: devel at linuxdriverproject.org; virtualization at lists.linux-foundation.org;
> Stephen Hemminger <sthemmin at microsoft.com>
> Subject: [PATCH 05/14] netvsc: remove no longer needed receive staging
> buffers
> 
> Since commit aed8c164ca5199 ("Drivers: hv: ring_buffer: count on wrap
> around mappings") it is no longer necessary to handle ring wrapping
> by having a special receive buffer.
> 
> Signed-off-by: Stephen Hemminger <sthemmin at microsoft.com>
> ---
>  drivers/net/hyperv/hyperv_net.h   |  5 ---
>  drivers/net/hyperv/netvsc.c       | 83 ++++++---------------------------------
>  drivers/net/hyperv/rndis_filter.c | 11 ------
>  3 files changed, 11 insertions(+), 88 deletions(-)
> 
> diff --git a/drivers/net/hyperv/hyperv_net.h
> b/drivers/net/hyperv/hyperv_net.h
> index 3958adade7eb..cce70ceba6d5 100644
> --- a/drivers/net/hyperv/hyperv_net.h
> +++ b/drivers/net/hyperv/hyperv_net.h
> @@ -748,11 +748,6 @@ struct netvsc_device {
> 
>  	int ring_size;
> 
> -	/* The primary channel callback buffer */
> -	unsigned char *cb_buffer;
> -	/* The sub channel callback buffer */
> -	unsigned char *sub_cb_buf;
> -
>  	struct multi_send_data msd[VRSS_CHANNEL_MAX];
>  	u32 max_pkt; /* max number of pkt in one send, e.g. 8 */
>  	u32 pkt_align; /* alignment bytes, e.g. 8 */
> diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c
> index e326e68f9f6d..7487498b663c 100644
> --- a/drivers/net/hyperv/netvsc.c
> +++ b/drivers/net/hyperv/netvsc.c
> @@ -67,12 +67,6 @@ static struct netvsc_device *alloc_net_device(void)
>  	if (!net_device)
>  		return NULL;
> 
> -	net_device->cb_buffer = kzalloc(NETVSC_PACKET_SIZE,
> GFP_KERNEL);
> -	if (!net_device->cb_buffer) {
> -		kfree(net_device);
> -		return NULL;
> -	}
> -
>  	net_device->mrc[0].buf = vzalloc(NETVSC_RECVSLOT_MAX *
>  					 sizeof(struct recv_comp_data));
> 
> @@ -93,7 +87,6 @@ static void free_netvsc_device(struct netvsc_device
> *nvdev)
>  	for (i = 0; i < VRSS_CHANNEL_MAX; i++)
>  		vfree(nvdev->mrc[i].buf);
> 
> -	kfree(nvdev->cb_buffer);
>  	kfree(nvdev);
>  }
> 
> @@ -584,7 +577,6 @@ void netvsc_device_remove(struct hv_device
> *device)
>  	vmbus_close(device->channel);
> 
>  	/* Release all resources */
> -	vfree(net_device->sub_cb_buf);
>  	free_netvsc_device(net_device);
>  }
> 
> @@ -1256,16 +1248,11 @@ static void netvsc_process_raw_pkt(struct
> hv_device *device,
> 
>  void netvsc_channel_cb(void *context)
>  {
> -	int ret;
> -	struct vmbus_channel *channel = (struct vmbus_channel *)context;
> +	struct vmbus_channel *channel = context;
>  	u16 q_idx = channel->offermsg.offer.sub_channel_index;
>  	struct hv_device *device;
>  	struct netvsc_device *net_device;
> -	u32 bytes_recvd;
> -	u64 request_id;
>  	struct vmpacket_descriptor *desc;
> -	unsigned char *buffer;
> -	int bufferlen = NETVSC_PACKET_SIZE;
>  	struct net_device *ndev;
>  	bool need_to_commit = false;
> 
> @@ -1277,65 +1264,19 @@ void netvsc_channel_cb(void *context)
>  	net_device = get_inbound_net_device(device);
>  	if (!net_device)
>  		return;
> +
>  	ndev = hv_get_drvdata(device);
> -	buffer = get_per_channel_state(channel);
> -
> -	do {
> -		desc = get_next_pkt_raw(channel);
> -		if (desc != NULL) {
> -			netvsc_process_raw_pkt(device,
> -					       channel,
> -					       net_device,
> -					       ndev,
> -					       desc->trans_id,
> -					       desc);
> -
> -			put_pkt_raw(channel, desc);
> -			need_to_commit = true;
> -			continue;
> -		}
> -		if (need_to_commit) {
> -			need_to_commit = false;
> -			commit_rd_index(channel);
> -		}
> 
> -		ret = vmbus_recvpacket_raw(channel, buffer, bufferlen,
> -					   &bytes_recvd, &request_id);
> -		if (ret == 0) {
> -			if (bytes_recvd > 0) {
> -				desc = (struct vmpacket_descriptor *)buffer;
> -				netvsc_process_raw_pkt(device,
> -						       channel,
> -						       net_device,
> -						       ndev,
> -						       request_id,
> -						       desc);
> -			} else {
> -				/*
> -				 * We are done for this pass.
> -				 */
> -				break;
> -			}
> -
> -		} else if (ret == -ENOBUFS) {
> -			if (bufferlen > NETVSC_PACKET_SIZE)
> -				kfree(buffer);
> -			/* Handle large packet */
> -			buffer = kmalloc(bytes_recvd, GFP_ATOMIC);
> -			if (buffer == NULL) {
> -				/* Try again next time around */
> -				netdev_err(ndev,
> -					   "unable to allocate buffer of size "
> -					   "(%d)!!\n", bytes_recvd);
> -				break;
> -			}
> -
> -			bufferlen = bytes_recvd;
> -		}
> -	} while (1);
> +	while ((desc = get_next_pkt_raw(channel)) != NULL) {
> +		netvsc_process_raw_pkt(device, channel, net_device,
> +				       ndev, desc->trans_id, desc);
> 
> -	if (bufferlen > NETVSC_PACKET_SIZE)
> -		kfree(buffer);
> +		put_pkt_raw(channel, desc);
> +		need_to_commit = true;
> +	}
> +
> +	if (need_to_commit)
> +		commit_rd_index(channel);
> 
>  	netvsc_chk_recv_comp(net_device, channel, q_idx);
>  }
> @@ -1359,8 +1300,6 @@ int netvsc_device_add(struct hv_device *device,
> void *additional_info)
> 
>  	net_device->ring_size = ring_size;
> 
> -	set_per_channel_state(device->channel, net_device->cb_buffer);
> -
>  	/* Open the channel */
>  	ret = vmbus_open(device->channel, ring_size * PAGE_SIZE,
>  			 ring_size * PAGE_SIZE, NULL, 0,
> diff --git a/drivers/net/hyperv/rndis_filter.c
> b/drivers/net/hyperv/rndis_filter.c
> index 8d90904e0e49..113c7f4d1590 100644
> --- a/drivers/net/hyperv/rndis_filter.c
> +++ b/drivers/net/hyperv/rndis_filter.c
> @@ -948,9 +948,6 @@ static void netvsc_sc_open(struct vmbus_channel
> *new_sc)
>  	if (chn_index >= nvscdev->num_chn)
>  		return;
> 
> -	set_per_channel_state(new_sc, nvscdev->sub_cb_buf + (chn_index
> - 1) *
> -			      NETVSC_PACKET_SIZE);
> -
>  	nvscdev->mrc[chn_index].buf = vzalloc(NETVSC_RECVSLOT_MAX *
>  					      sizeof(struct recv_comp_data));
> 
> @@ -1099,14 +1096,6 @@ int rndis_filter_device_add(struct hv_device
> *dev,
>  	if (net_device->num_chn == 1)
>  		goto out;
> 
> -	net_device->sub_cb_buf = vzalloc((net_device->num_chn - 1) *
> -					 NETVSC_PACKET_SIZE);
> -	if (!net_device->sub_cb_buf) {
> -		net_device->num_chn = 1;
> -		dev_info(&dev->device, "No memory for subchannels.\n");
> -		goto out;
> -	}
> -
>  	vmbus_set_sc_create_callback(dev->channel, netvsc_sc_open);
> 
>  	init_packet = &net_device->channel_init_pkt;

Stephen,

This patch can go to the net-next tree and does not need to be part of this patch set.

Thanks,

K. Y
> --
> 2.11.0



More information about the devel mailing list