mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-06 05:06:29 +00:00
iavf: pack iavf_ring more efficiently
Before replacing the Rx buffer management with libie, clean up &iavf_ring a bit. There are several fields not used anywhere in the code -- simply remove them. Move ::tail up to remove a hole. Replace ::arm_wb boolean with 1-bit flag in ::flags to free 1 more byte. Finally, move ::prev_pkt_ctr out of &iavf_tx_queue_stats -- it doesn't belong there (used for Tx stall detection). Place it next to the stats on the ring itself to fill the 4-byte slot. The result: no holes and all the hot fields fit into the first 64-byte cacheline. Signed-off-by: Alexander Lobakin <aleksander.lobakin@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
parent
e6c91556b9
commit
97cadd3d3c
@ -185,7 +185,7 @@ void iavf_detect_recover_hung(struct iavf_vsi *vsi)
|
||||
* pending work.
|
||||
*/
|
||||
packets = tx_ring->stats.packets & INT_MAX;
|
||||
if (tx_ring->tx_stats.prev_pkt_ctr == packets) {
|
||||
if (tx_ring->prev_pkt_ctr == packets) {
|
||||
iavf_force_wb(vsi, tx_ring->q_vector);
|
||||
continue;
|
||||
}
|
||||
@ -194,7 +194,7 @@ void iavf_detect_recover_hung(struct iavf_vsi *vsi)
|
||||
* to iavf_get_tx_pending()
|
||||
*/
|
||||
smp_rmb();
|
||||
tx_ring->tx_stats.prev_pkt_ctr =
|
||||
tx_ring->prev_pkt_ctr =
|
||||
iavf_get_tx_pending(tx_ring, true) ? packets : -1;
|
||||
}
|
||||
}
|
||||
@ -320,7 +320,7 @@ static bool iavf_clean_tx_irq(struct iavf_vsi *vsi,
|
||||
((j / WB_STRIDE) == 0) && (j > 0) &&
|
||||
!test_bit(__IAVF_VSI_DOWN, vsi->state) &&
|
||||
(IAVF_DESC_UNUSED(tx_ring) != tx_ring->count))
|
||||
tx_ring->arm_wb = true;
|
||||
tx_ring->flags |= IAVF_TXR_FLAGS_ARM_WB;
|
||||
}
|
||||
|
||||
/* notify netdev of completed buffers */
|
||||
@ -675,7 +675,7 @@ int iavf_setup_tx_descriptors(struct iavf_ring *tx_ring)
|
||||
|
||||
tx_ring->next_to_use = 0;
|
||||
tx_ring->next_to_clean = 0;
|
||||
tx_ring->tx_stats.prev_pkt_ctr = -1;
|
||||
tx_ring->prev_pkt_ctr = -1;
|
||||
return 0;
|
||||
|
||||
err:
|
||||
@ -1491,8 +1491,8 @@ int iavf_napi_poll(struct napi_struct *napi, int budget)
|
||||
clean_complete = false;
|
||||
continue;
|
||||
}
|
||||
arm_wb |= ring->arm_wb;
|
||||
ring->arm_wb = false;
|
||||
arm_wb |= !!(ring->flags & IAVF_TXR_FLAGS_ARM_WB);
|
||||
ring->flags &= ~IAVF_TXR_FLAGS_ARM_WB;
|
||||
}
|
||||
|
||||
/* Handle case where we are called by netpoll with a budget of 0 */
|
||||
|
@ -227,7 +227,6 @@ struct iavf_tx_queue_stats {
|
||||
u64 tx_done_old;
|
||||
u64 tx_linearize;
|
||||
u64 tx_force_wb;
|
||||
int prev_pkt_ctr;
|
||||
u64 tx_lost_interrupt;
|
||||
};
|
||||
|
||||
@ -237,12 +236,6 @@ struct iavf_rx_queue_stats {
|
||||
u64 alloc_buff_failed;
|
||||
};
|
||||
|
||||
enum iavf_ring_state_t {
|
||||
__IAVF_TX_FDIR_INIT_DONE,
|
||||
__IAVF_TX_XPS_INIT_DONE,
|
||||
__IAVF_RING_STATE_NBITS /* must be last */
|
||||
};
|
||||
|
||||
/* some useful defines for virtchannel interface, which
|
||||
* is the only remaining user of header split
|
||||
*/
|
||||
@ -264,10 +257,8 @@ struct iavf_ring {
|
||||
struct iavf_tx_buffer *tx_bi;
|
||||
struct iavf_rx_buffer *rx_bi;
|
||||
};
|
||||
DECLARE_BITMAP(state, __IAVF_RING_STATE_NBITS);
|
||||
u16 queue_index; /* Queue number of ring */
|
||||
u8 dcb_tc; /* Traffic class of ring */
|
||||
u8 __iomem *tail;
|
||||
u16 queue_index; /* Queue number of ring */
|
||||
|
||||
/* high bit set means dynamic, use accessors routines to read/write.
|
||||
* hardware only supports 2us resolution for the ITR registers.
|
||||
@ -277,22 +268,14 @@ struct iavf_ring {
|
||||
u16 itr_setting;
|
||||
|
||||
u16 count; /* Number of descriptors */
|
||||
u16 reg_idx; /* HW register index of the ring */
|
||||
|
||||
/* used in interrupt processing */
|
||||
u16 next_to_use;
|
||||
u16 next_to_clean;
|
||||
|
||||
u8 atr_sample_rate;
|
||||
u8 atr_count;
|
||||
|
||||
bool ring_active; /* is ring online or not */
|
||||
bool arm_wb; /* do something to arm write back */
|
||||
u8 packet_stride;
|
||||
|
||||
u16 flags;
|
||||
#define IAVF_TXR_FLAGS_WB_ON_ITR BIT(0)
|
||||
/* BIT(1) is free, was IAVF_RXR_FLAGS_BUILD_SKB_ENABLED */
|
||||
#define IAVF_TXR_FLAGS_ARM_WB BIT(1)
|
||||
/* BIT(2) is free */
|
||||
#define IAVF_TXRX_FLAGS_VLAN_TAG_LOC_L2TAG1 BIT(3)
|
||||
#define IAVF_TXR_FLAGS_VLAN_TAG_LOC_L2TAG2 BIT(4)
|
||||
@ -306,6 +289,7 @@ struct iavf_ring {
|
||||
struct iavf_rx_queue_stats rx_stats;
|
||||
};
|
||||
|
||||
int prev_pkt_ctr; /* For Tx stall detection */
|
||||
unsigned int size; /* length of descriptor ring in bytes */
|
||||
dma_addr_t dma; /* physical address of ring */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user