netvsc: optimize receive completions
Optimize how receive completion ring are managed.
* Allocate only as many slots as needed for all buffers from host
* Allocate before setting up sub channel for better error detection
* Don't need to keep copy of initial receive section message
* Precompute the watermark for when receive flushing is needed
* Replace division with conditional test
* Replace atomic per-device variable with per-channel check.
* Handle corner case where receive completion send
fails if ring buffer to host is full.
Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
02b6de01af
commit
7426b1a518
@@ -186,6 +186,7 @@ struct net_device_context;
|
||||
|
||||
struct netvsc_device *netvsc_device_add(struct hv_device *device,
|
||||
const struct netvsc_device_info *info);
|
||||
int netvsc_alloc_recv_comp_ring(struct netvsc_device *net_device, u32 q_idx);
|
||||
void netvsc_device_remove(struct hv_device *device);
|
||||
int netvsc_send(struct net_device_context *ndc,
|
||||
struct hv_netvsc_packet *packet,
|
||||
@@ -657,13 +658,10 @@ struct recv_comp_data {
|
||||
u32 status;
|
||||
};
|
||||
|
||||
/* Netvsc Receive Slots Max */
|
||||
#define NETVSC_RECVSLOT_MAX (NETVSC_RECEIVE_BUFFER_SIZE / ETH_DATA_LEN + 1)
|
||||
|
||||
struct multi_recv_comp {
|
||||
void *buf; /* queued receive completions */
|
||||
u32 first; /* first data entry */
|
||||
u32 next; /* next entry for writing */
|
||||
struct recv_comp_data *slots;
|
||||
u32 first; /* first data entry */
|
||||
u32 next; /* next entry for writing */
|
||||
};
|
||||
|
||||
struct netvsc_stats {
|
||||
@@ -750,7 +748,7 @@ struct netvsc_device {
|
||||
u32 recv_buf_size;
|
||||
u32 recv_buf_gpadl_handle;
|
||||
u32 recv_section_cnt;
|
||||
struct nvsp_1_receive_buffer_section *recv_section;
|
||||
u32 recv_completion_cnt;
|
||||
|
||||
/* Send buffer allocated by us */
|
||||
void *send_buf;
|
||||
@@ -778,8 +776,6 @@ struct netvsc_device {
|
||||
u32 max_pkt; /* max number of pkt in one send, e.g. 8 */
|
||||
u32 pkt_align; /* alignment bytes, e.g. 8 */
|
||||
|
||||
atomic_t num_outstanding_recvs;
|
||||
|
||||
atomic_t open_cnt;
|
||||
|
||||
struct netvsc_channel chan_table[VRSS_CHANNEL_MAX];
|
||||
|
||||
Reference in New Issue
Block a user