mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	hyperv: Increase the buffer length for netvsc_channel_cb()
When the buffer is too small for a packet from VMBus, a bigger buffer will be allocated in netvsc_channel_cb() and retry reading the packet from VMBus. Increasing this buffer size will reduce the retry overhead. Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com> Reviewed-by: Dexuan Cui <decui@microsoft.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									c9d26423e5
								
							
						
					
					
						commit
						f90251c8a6
					
				
					 2 changed files with 16 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -591,7 +591,7 @@ struct nvsp_message {
 | 
			
		|||
 | 
			
		||||
#define NETVSC_RECEIVE_BUFFER_ID		0xcafe
 | 
			
		||||
 | 
			
		||||
#define NETVSC_PACKET_SIZE                      2048
 | 
			
		||||
#define NETVSC_PACKET_SIZE                      4096
 | 
			
		||||
 | 
			
		||||
#define VRSS_SEND_TAB_SIZE 16
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -642,7 +642,7 @@ struct netvsc_device {
 | 
			
		|||
	int ring_size;
 | 
			
		||||
 | 
			
		||||
	/* The primary channel callback buffer */
 | 
			
		||||
	unsigned char cb_buffer[NETVSC_PACKET_SIZE];
 | 
			
		||||
	unsigned char *cb_buffer;
 | 
			
		||||
	/* The sub channel callback buffer */
 | 
			
		||||
	unsigned char *sub_cb_buf;
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,6 +42,12 @@ static struct netvsc_device *alloc_net_device(struct hv_device *device)
 | 
			
		|||
	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;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	init_waitqueue_head(&net_device->wait_drain);
 | 
			
		||||
	net_device->start_remove = false;
 | 
			
		||||
	net_device->destroy = false;
 | 
			
		||||
| 
						 | 
				
			
			@ -52,6 +58,12 @@ static struct netvsc_device *alloc_net_device(struct hv_device *device)
 | 
			
		|||
	return net_device;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void free_netvsc_device(struct netvsc_device *nvdev)
 | 
			
		||||
{
 | 
			
		||||
	kfree(nvdev->cb_buffer);
 | 
			
		||||
	kfree(nvdev);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct netvsc_device *get_outbound_net_device(struct hv_device *device)
 | 
			
		||||
{
 | 
			
		||||
	struct netvsc_device *net_device;
 | 
			
		||||
| 
						 | 
				
			
			@ -551,7 +563,7 @@ int netvsc_device_remove(struct hv_device *device)
 | 
			
		|||
	if (net_device->sub_cb_buf)
 | 
			
		||||
		vfree(net_device->sub_cb_buf);
 | 
			
		||||
 | 
			
		||||
	kfree(net_device);
 | 
			
		||||
	free_netvsc_device(net_device);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1093,7 +1105,7 @@ int netvsc_device_add(struct hv_device *device, void *additional_info)
 | 
			
		|||
	vmbus_close(device->channel);
 | 
			
		||||
 | 
			
		||||
cleanup:
 | 
			
		||||
	kfree(net_device);
 | 
			
		||||
	free_netvsc_device(net_device);
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue