netvsc: remove no longer needed receive staging buffers

The ring buffer mapping now handles the wraparound case
inside get_next_pkt_raw. Therefore it is not necessary to have an
additional special receive staging buffer.

See commit 1562edaed8c164ca5199 ("Drivers: hv: ring_buffer: count on
wrap around mappings")

Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
stephen hemminger 2017-01-24 13:05:58 -08:00 committed by David S. Miller
parent f2ceab0baf
commit 0b307ebd68
3 changed files with 10 additions and 87 deletions

View File

@ -748,11 +748,6 @@ struct netvsc_device {
int ring_size; 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]; struct multi_send_data msd[VRSS_CHANNEL_MAX];
u32 max_pkt; /* max number of pkt in one send, e.g. 8 */ u32 max_pkt; /* max number of pkt in one send, e.g. 8 */
u32 pkt_align; /* alignment bytes, e.g. 8 */ u32 pkt_align; /* alignment bytes, e.g. 8 */

View File

@ -67,12 +67,6 @@ static struct netvsc_device *alloc_net_device(void)
if (!net_device) if (!net_device)
return NULL; 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 * net_device->mrc[0].buf = vzalloc(NETVSC_RECVSLOT_MAX *
sizeof(struct recv_comp_data)); 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++) for (i = 0; i < VRSS_CHANNEL_MAX; i++)
vfree(nvdev->mrc[i].buf); vfree(nvdev->mrc[i].buf);
kfree(nvdev->cb_buffer);
kfree(nvdev); kfree(nvdev);
} }
@ -584,7 +577,6 @@ void netvsc_device_remove(struct hv_device *device)
vmbus_close(device->channel); vmbus_close(device->channel);
/* Release all resources */ /* Release all resources */
vfree(net_device->sub_cb_buf);
free_netvsc_device(net_device); free_netvsc_device(net_device);
} }
@ -1271,16 +1263,11 @@ static void netvsc_process_raw_pkt(struct hv_device *device,
void netvsc_channel_cb(void *context) void netvsc_channel_cb(void *context)
{ {
int ret; struct vmbus_channel *channel = context;
struct vmbus_channel *channel = (struct vmbus_channel *)context;
u16 q_idx = channel->offermsg.offer.sub_channel_index; u16 q_idx = channel->offermsg.offer.sub_channel_index;
struct hv_device *device; struct hv_device *device;
struct netvsc_device *net_device; struct netvsc_device *net_device;
u32 bytes_recvd;
u64 request_id;
struct vmpacket_descriptor *desc; struct vmpacket_descriptor *desc;
unsigned char *buffer;
int bufferlen = NETVSC_PACKET_SIZE;
struct net_device *ndev; struct net_device *ndev;
bool need_to_commit = false; bool need_to_commit = false;
@ -1292,65 +1279,19 @@ void netvsc_channel_cb(void *context)
net_device = get_inbound_net_device(device); net_device = get_inbound_net_device(device);
if (!net_device) if (!net_device)
return; return;
ndev = hv_get_drvdata(device); ndev = hv_get_drvdata(device);
buffer = get_per_channel_state(channel);
do { while ((desc = get_next_pkt_raw(channel)) != NULL) {
desc = get_next_pkt_raw(channel); netvsc_process_raw_pkt(device, channel, net_device,
if (desc != NULL) { ndev, desc->trans_id, desc);
netvsc_process_raw_pkt(device,
channel,
net_device,
ndev,
desc->trans_id,
desc);
put_pkt_raw(channel, desc); put_pkt_raw(channel, desc);
need_to_commit = true; need_to_commit = true;
continue; }
}
if (need_to_commit) {
need_to_commit = false;
commit_rd_index(channel);
}
ret = vmbus_recvpacket_raw(channel, buffer, bufferlen, if (need_to_commit)
&bytes_recvd, &request_id); commit_rd_index(channel);
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);
if (bufferlen > NETVSC_PACKET_SIZE)
kfree(buffer);
netvsc_chk_recv_comp(net_device, channel, q_idx); netvsc_chk_recv_comp(net_device, channel, q_idx);
} }
@ -1374,8 +1315,6 @@ int netvsc_device_add(struct hv_device *device, void *additional_info)
net_device->ring_size = ring_size; net_device->ring_size = ring_size;
set_per_channel_state(device->channel, net_device->cb_buffer);
/* Open the channel */ /* Open the channel */
ret = vmbus_open(device->channel, ring_size * PAGE_SIZE, ret = vmbus_open(device->channel, ring_size * PAGE_SIZE,
ring_size * PAGE_SIZE, NULL, 0, ring_size * PAGE_SIZE, NULL, 0,

View File

@ -948,9 +948,6 @@ static void netvsc_sc_open(struct vmbus_channel *new_sc)
if (chn_index >= nvscdev->num_chn) if (chn_index >= nvscdev->num_chn)
return; 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 * nvscdev->mrc[chn_index].buf = vzalloc(NETVSC_RECVSLOT_MAX *
sizeof(struct recv_comp_data)); sizeof(struct recv_comp_data));
@ -1099,14 +1096,6 @@ int rndis_filter_device_add(struct hv_device *dev,
if (net_device->num_chn == 1) if (net_device->num_chn == 1)
goto out; 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); vmbus_set_sc_create_callback(dev->channel, netvsc_sc_open);
init_packet = &net_device->channel_init_pkt; init_packet = &net_device->channel_init_pkt;