Commit 16de5970 authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'ibmvnic-performance-improvements-and-other-updates'

Thomas Falcon says:

====================
ibmvnic: Performance improvements and other updates

The first three patches utilize a hypervisor call allowing multiple
TX and RX buffer replenishment descriptors to be sent in one operation,
which significantly reduces hypervisor call overhead. The xmit_more
and Byte Queue Limit API's are leveraged to provide this support
for TX descriptors.

The subsequent two patches remove superfluous code and members in
TX completion handling function and TX buffer structure, respectively,
and remove unused routines.

Finally, four patches which ensure that device queue memory is
cache-line aligned, resolving slowdowns observed in PCI traces,
as well as optimize the driver's NAPI polling function and
to RX buffer replenishment are provided by Dwip Banerjee.

This series provides significant performance improvements, allowing
the driver to fully utilize 100Gb NIC's.
====================

Link: https://lore.kernel.org/r/1605748345-32062-1-git-send-email-tlfalcon@linux.ibm.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents c9003783 41ed0a00
This diff is collapsed.
...@@ -31,6 +31,8 @@ ...@@ -31,6 +31,8 @@
#define IBMVNIC_BUFFS_PER_POOL 100 #define IBMVNIC_BUFFS_PER_POOL 100
#define IBMVNIC_MAX_QUEUES 16 #define IBMVNIC_MAX_QUEUES 16
#define IBMVNIC_MAX_QUEUE_SZ 4096 #define IBMVNIC_MAX_QUEUE_SZ 4096
#define IBMVNIC_MAX_IND_DESCS 128
#define IBMVNIC_IND_ARR_SZ (IBMVNIC_MAX_IND_DESCS * 32)
#define IBMVNIC_TSO_BUF_SZ 65536 #define IBMVNIC_TSO_BUF_SZ 65536
#define IBMVNIC_TSO_BUFS 64 #define IBMVNIC_TSO_BUFS 64
...@@ -224,8 +226,6 @@ struct ibmvnic_tx_comp_desc { ...@@ -224,8 +226,6 @@ struct ibmvnic_tx_comp_desc {
#define IBMVNIC_TCP_CHKSUM 0x20 #define IBMVNIC_TCP_CHKSUM 0x20
#define IBMVNIC_UDP_CHKSUM 0x08 #define IBMVNIC_UDP_CHKSUM 0x08
#define IBMVNIC_MAX_FRAGS_PER_CRQ 3
struct ibmvnic_tx_desc { struct ibmvnic_tx_desc {
u8 first; u8 first;
u8 type; u8 type;
...@@ -861,6 +861,12 @@ union sub_crq { ...@@ -861,6 +861,12 @@ union sub_crq {
struct ibmvnic_rx_buff_add_desc rx_add; struct ibmvnic_rx_buff_add_desc rx_add;
}; };
struct ibmvnic_ind_xmit_queue {
union sub_crq *indir_arr;
dma_addr_t indir_dma;
int index;
};
struct ibmvnic_sub_crq_queue { struct ibmvnic_sub_crq_queue {
union sub_crq *msgs; union sub_crq *msgs;
int size, cur; int size, cur;
...@@ -873,10 +879,11 @@ struct ibmvnic_sub_crq_queue { ...@@ -873,10 +879,11 @@ struct ibmvnic_sub_crq_queue {
spinlock_t lock; spinlock_t lock;
struct sk_buff *rx_skb_top; struct sk_buff *rx_skb_top;
struct ibmvnic_adapter *adapter; struct ibmvnic_adapter *adapter;
struct ibmvnic_ind_xmit_queue ind_buf;
atomic_t used; atomic_t used;
char name[32]; char name[32];
u64 handle; u64 handle;
}; } ____cacheline_aligned;
struct ibmvnic_long_term_buff { struct ibmvnic_long_term_buff {
unsigned char *buff; unsigned char *buff;
...@@ -887,14 +894,8 @@ struct ibmvnic_long_term_buff { ...@@ -887,14 +894,8 @@ struct ibmvnic_long_term_buff {
struct ibmvnic_tx_buff { struct ibmvnic_tx_buff {
struct sk_buff *skb; struct sk_buff *skb;
dma_addr_t data_dma[IBMVNIC_MAX_FRAGS_PER_CRQ];
unsigned int data_len[IBMVNIC_MAX_FRAGS_PER_CRQ];
int index; int index;
int pool_index; int pool_index;
bool last_frag;
union sub_crq indir_arr[6];
u8 hdr_data[140];
dma_addr_t indir_dma;
int num_entries; int num_entries;
}; };
...@@ -906,7 +907,7 @@ struct ibmvnic_tx_pool { ...@@ -906,7 +907,7 @@ struct ibmvnic_tx_pool {
struct ibmvnic_long_term_buff long_term_buff; struct ibmvnic_long_term_buff long_term_buff;
int num_buffers; int num_buffers;
int buf_size; int buf_size;
}; } ____cacheline_aligned;
struct ibmvnic_rx_buff { struct ibmvnic_rx_buff {
struct sk_buff *skb; struct sk_buff *skb;
...@@ -927,7 +928,7 @@ struct ibmvnic_rx_pool { ...@@ -927,7 +928,7 @@ struct ibmvnic_rx_pool {
int next_alloc; int next_alloc;
int active; int active;
struct ibmvnic_long_term_buff long_term_buff; struct ibmvnic_long_term_buff long_term_buff;
}; } ____cacheline_aligned;
struct ibmvnic_vpd { struct ibmvnic_vpd {
unsigned char *buff; unsigned char *buff;
...@@ -1014,8 +1015,8 @@ struct ibmvnic_adapter { ...@@ -1014,8 +1015,8 @@ struct ibmvnic_adapter {
atomic_t running_cap_crqs; atomic_t running_cap_crqs;
bool wait_capability; bool wait_capability;
struct ibmvnic_sub_crq_queue **tx_scrq; struct ibmvnic_sub_crq_queue **tx_scrq ____cacheline_aligned;
struct ibmvnic_sub_crq_queue **rx_scrq; struct ibmvnic_sub_crq_queue **rx_scrq ____cacheline_aligned;
/* rx structs */ /* rx structs */
struct napi_struct *napi; struct napi_struct *napi;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment