Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 047e0030 authored by Alexander Duyck's avatar Alexander Duyck Committed by David S. Miller
Browse files

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: default avatarAlexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 678b77e2
Loading
Loading
Loading
Loading
+29 −17
Original line number Diff line number Diff line
@@ -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,8 +151,25 @@ struct igb_rx_queue_stats {
	u64 drops;
};

struct igb_ring {
struct igb_q_vector {
	struct igb_adapter *adapter; /* backlink */
	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 */
@@ -161,13 +180,9 @@ struct igb_ring {
	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;
+5 −3
Original line number Diff line number Diff line
@@ -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;
}
+500 −372

File changed.

Preview size limit exceeded, changes collapsed.