mirror of https://gitee.com/openkylin/linux.git
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:
parent
f2ceab0baf
commit
0b307ebd68
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -1271,16 +1263,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;
|
||||
|
||||
|
@ -1292,65 +1279,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);
|
||||
while ((desc = get_next_pkt_raw(channel)) != 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);
|
||||
}
|
||||
put_pkt_raw(channel, desc);
|
||||
need_to_commit = true;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
if (bufferlen > NETVSC_PACKET_SIZE)
|
||||
kfree(buffer);
|
||||
if (need_to_commit)
|
||||
commit_rd_index(channel);
|
||||
|
||||
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;
|
||||
|
||||
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,
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue