mirror of
https://github.com/torvalds/linux.git
synced 2024-12-22 10:56:40 +00:00
igb: add new data structure for handling interrupts and NAPI
Add a new igb_q_vector data structure to handle interrupts and NAPI. This helps to abstract the rings away from the adapter struct. In addition it allows for a bit of consolidation since a tx and rx ring can share a q_vector. Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
678b77e265
commit
047e0030f1
@ -55,6 +55,8 @@ struct igb_adapter;
|
||||
#define IGB_DEFAULT_ITR 3 /* dynamic */
|
||||
#define IGB_MAX_ITR_USECS 10000
|
||||
#define IGB_MIN_ITR_USECS 10
|
||||
#define NON_Q_VECTORS 1
|
||||
#define MAX_Q_VECTORS 8
|
||||
|
||||
/* Transmit and receive queues */
|
||||
#define IGB_MAX_RX_QUEUES (adapter->vfs_allocated_count ? \
|
||||
@ -149,25 +151,38 @@ struct igb_rx_queue_stats {
|
||||
u64 drops;
|
||||
};
|
||||
|
||||
struct igb_ring {
|
||||
struct igb_q_vector {
|
||||
struct igb_adapter *adapter; /* backlink */
|
||||
void *desc; /* descriptor ring memory */
|
||||
dma_addr_t dma; /* phys address of the ring */
|
||||
unsigned int size; /* length of desc. ring in bytes */
|
||||
unsigned int count; /* number of desc. in the ring */
|
||||
struct igb_ring *rx_ring;
|
||||
struct igb_ring *tx_ring;
|
||||
struct napi_struct napi;
|
||||
|
||||
u32 eims_value;
|
||||
u16 cpu;
|
||||
|
||||
u16 itr_val;
|
||||
u8 set_itr;
|
||||
u8 itr_shift;
|
||||
void __iomem *itr_register;
|
||||
|
||||
char name[IFNAMSIZ + 9];
|
||||
};
|
||||
|
||||
struct igb_ring {
|
||||
struct igb_q_vector *q_vector; /* backlink to q_vector */
|
||||
void *desc; /* descriptor ring memory */
|
||||
dma_addr_t dma; /* phys address of the ring */
|
||||
unsigned int size; /* length of desc. ring in bytes */
|
||||
unsigned int count; /* number of desc. in the ring */
|
||||
u16 next_to_use;
|
||||
u16 next_to_clean;
|
||||
u16 head;
|
||||
u16 tail;
|
||||
struct igb_buffer *buffer_info; /* array of buffer info structs */
|
||||
|
||||
u32 eims_value;
|
||||
u32 itr_val;
|
||||
u16 itr_register;
|
||||
u16 cpu;
|
||||
u8 queue_index;
|
||||
u8 reg_idx;
|
||||
|
||||
u16 queue_index;
|
||||
u16 reg_idx;
|
||||
unsigned int total_bytes;
|
||||
unsigned int total_packets;
|
||||
|
||||
@ -181,13 +196,8 @@ struct igb_ring {
|
||||
struct {
|
||||
struct igb_rx_queue_stats rx_stats;
|
||||
u64 rx_queue_drops;
|
||||
struct napi_struct napi;
|
||||
int set_itr;
|
||||
struct igb_ring *buddy;
|
||||
};
|
||||
};
|
||||
|
||||
char name[IFNAMSIZ + 5];
|
||||
};
|
||||
|
||||
#define E1000_RX_DESC_ADV(R, i) \
|
||||
@ -254,7 +264,6 @@ struct igb_adapter {
|
||||
|
||||
/* OS defined structs */
|
||||
struct net_device *netdev;
|
||||
struct napi_struct napi;
|
||||
struct pci_dev *pdev;
|
||||
struct cyclecounter cycles;
|
||||
struct timecounter clock;
|
||||
@ -272,6 +281,9 @@ struct igb_adapter {
|
||||
struct igb_ring test_rx_ring;
|
||||
|
||||
int msg_enable;
|
||||
|
||||
unsigned int num_q_vectors;
|
||||
struct igb_q_vector *q_vector[MAX_Q_VECTORS];
|
||||
struct msix_entry *msix_entries;
|
||||
u32 eims_enable_mask;
|
||||
u32 eims_other;
|
||||
|
@ -1907,7 +1907,6 @@ static int igb_set_coalesce(struct net_device *netdev,
|
||||
struct ethtool_coalesce *ec)
|
||||
{
|
||||
struct igb_adapter *adapter = netdev_priv(netdev);
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
int i;
|
||||
|
||||
if ((ec->rx_coalesce_usecs > IGB_MAX_ITR_USECS) ||
|
||||
@ -1925,8 +1924,11 @@ static int igb_set_coalesce(struct net_device *netdev,
|
||||
adapter->itr = adapter->itr_setting;
|
||||
}
|
||||
|
||||
for (i = 0; i < adapter->num_rx_queues; i++)
|
||||
wr32(adapter->rx_ring[i].itr_register, adapter->itr);
|
||||
for (i = 0; i < adapter->num_q_vectors; i++) {
|
||||
struct igb_q_vector *q_vector = adapter->q_vector[i];
|
||||
q_vector->itr_val = adapter->itr;
|
||||
q_vector->set_itr = 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user