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.loba...@intel.com>
---
 drivers/net/ethernet/intel/iavf/iavf_txrx.c | 12 +++++------
 drivers/net/ethernet/intel/iavf/iavf_txrx.h | 22 +++------------------
 2 files changed, 9 insertions(+), 25 deletions(-)

diff --git a/drivers/net/ethernet/intel/iavf/iavf_txrx.c 
b/drivers/net/ethernet/intel/iavf/iavf_txrx.c
index 665ee1feb877..62f976d322ab 100644
--- a/drivers/net/ethernet/intel/iavf/iavf_txrx.c
+++ b/drivers/net/ethernet/intel/iavf/iavf_txrx.c
@@ -184,7 +184,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;
                        }
@@ -193,7 +193,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;
                }
        }
@@ -319,7 +319,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 */
@@ -674,7 +674,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:
@@ -1494,8 +1494,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 */
diff --git a/drivers/net/ethernet/intel/iavf/iavf_txrx.h 
b/drivers/net/ethernet/intel/iavf/iavf_txrx.h
index e01777531635..ed559fa6f214 100644
--- a/drivers/net/ethernet/intel/iavf/iavf_txrx.h
+++ b/drivers/net/ethernet/intel/iavf/iavf_txrx.h
@@ -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 */
 
-- 
2.43.0

_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan

Reply via email to