> -----Original Message----- > From: Stephen Hemminger [mailto:step...@networkplumber.org] > Sent: Wednesday, February 1, 2017 8:29 AM > To: KY Srinivasan <k...@microsoft.com>; gre...@linuxfoundation.org > Cc: de...@linuxdriverproject.org; virtualization@lists.linux-foundation.org; > Stephen Hemminger <sthem...@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 <sthem...@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 _______________________________________________ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/virtualization