octeon_ep: remove atomic variable usage in Tx data path
authorShinas Rasheed <srasheed@marvell.com>
Tue, 14 Nov 2023 13:45:35 +0000 (05:45 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 16 Nov 2023 21:55:05 +0000 (21:55 +0000)
Replace atomic variable "instr_pending" which represents number of
posted tx instructions pending completion, with host_write_idx and
flush_index variables in the xmit and completion processing respectively.

Signed-off-by: Shinas Rasheed <srasheed@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/marvell/octeon_ep/octep_config.h
drivers/net/ethernet/marvell/octeon_ep/octep_main.c
drivers/net/ethernet/marvell/octeon_ep/octep_main.h
drivers/net/ethernet/marvell/octeon_ep/octep_tx.c
drivers/net/ethernet/marvell/octeon_ep/octep_tx.h

index ed8b1ace56b9457c7f7e6fc81e2ecf68feddd69d..91cfa19c65b9b92f081a36454c8c1322065e44a7 100644 (file)
@@ -13,6 +13,7 @@
 #define OCTEP_64BYTE_INSTR  64
 
 /* Tx Queue: maximum descriptors per ring */
+/* This needs to be a power of 2 */
 #define OCTEP_IQ_MAX_DESCRIPTORS    1024
 /* Minimum input (Tx) requests to be enqueued to ring doorbell */
 #define OCTEP_DB_MIN                8
index 2d1bcdc589f301ba46cd31df154f004ff79b732d..974a34be9ffaa680d050e45cdee1b2abe4da523d 100644 (file)
@@ -777,7 +777,7 @@ static int octep_stop(struct net_device *netdev)
  */
 static inline int octep_iq_full_check(struct octep_iq *iq)
 {
-       if (likely((iq->max_count - atomic_read(&iq->instr_pending)) >=
+       if (likely((IQ_INSTR_SPACE(iq)) >
                   OCTEP_WAKE_QUEUE_THRESHOLD))
                return 0;
 
@@ -794,7 +794,7 @@ static inline int octep_iq_full_check(struct octep_iq *iq)
        /* check again and restart the queue, in case NAPI has just freed
         * enough Tx ring entries.
         */
-       if (unlikely((iq->max_count - atomic_read(&iq->instr_pending)) >=
+       if (unlikely(IQ_INSTR_SPACE(iq) >
                     OCTEP_WAKE_QUEUE_THRESHOLD)) {
                netif_start_subqueue(iq->netdev, iq->q_no);
                iq->stats.restart_cnt++;
@@ -903,12 +903,9 @@ static netdev_tx_t octep_start_xmit(struct sk_buff *skb,
        __netdev_tx_sent_queue(iq->netdev_q, skb->len, xmit_more);
 
        skb_tx_timestamp(skb);
-       atomic_inc(&iq->instr_pending);
        iq->fill_cnt++;
        wi++;
-       if (wi == iq->max_count)
-               wi = 0;
-       iq->host_write_index = wi;
+       iq->host_write_index = wi & iq->ring_size_mask;
 
        /* octep_iq_full_check stops the queue and returns
         * true if so, in case the queue has become full
index 6df902ebb7f3329f75af7cb238acbfea25776477..c33e046b69a4265bb1ec6a4cf40b03395b2e8621 100644 (file)
 #define  OCTEP_OQ_INTR_RESEND_BIT  59
 
 #define  OCTEP_MMIO_REGIONS     3
+
+#define  IQ_INSTR_PENDING(iq)  ({ typeof(iq) iq__ = (iq); \
+                                 ((iq__)->host_write_index - (iq__)->flush_index) & \
+                                 (iq__)->ring_size_mask; \
+                               })
+#define  IQ_INSTR_SPACE(iq)    ({ typeof(iq) iq_ = (iq); \
+                                 (iq_)->max_count - IQ_INSTR_PENDING(iq_); \
+                               })
+
 /* PCI address space mapping information.
  * Each of the 3 address spaces given by BAR0, BAR2 and BAR4 of
  * Octeon gets mapped to different physical address spaces in
index d0adb82d65c31eddccdb6b56522ce91e3d021fee..06851b78aa28c8be946cfc847f0d1f16c6e5bc2b 100644 (file)
@@ -21,7 +21,6 @@ static void octep_iq_reset_indices(struct octep_iq *iq)
        iq->flush_index = 0;
        iq->pkts_processed = 0;
        iq->pkt_in_done = 0;
-       atomic_set(&iq->instr_pending, 0);
 }
 
 /**
@@ -82,7 +81,6 @@ int octep_iq_process_completions(struct octep_iq *iq, u16 budget)
        }
 
        iq->pkts_processed += compl_pkts;
-       atomic_sub(compl_pkts, &iq->instr_pending);
        iq->stats.instr_completed += compl_pkts;
        iq->stats.bytes_sent += compl_bytes;
        iq->stats.sgentry_sent += compl_sg;
@@ -91,7 +89,7 @@ int octep_iq_process_completions(struct octep_iq *iq, u16 budget)
        netdev_tx_completed_queue(iq->netdev_q, compl_pkts, compl_bytes);
 
        if (unlikely(__netif_subqueue_stopped(iq->netdev, iq->q_no)) &&
-           ((iq->max_count - atomic_read(&iq->instr_pending)) >
+           (IQ_INSTR_SPACE(iq) >
             OCTEP_WAKE_QUEUE_THRESHOLD))
                netif_wake_subqueue(iq->netdev, iq->q_no);
        return !budget;
@@ -144,7 +142,6 @@ static void octep_iq_free_pending(struct octep_iq *iq)
                dev_kfree_skb_any(skb);
        }
 
-       atomic_set(&iq->instr_pending, 0);
        iq->flush_index = fi;
        netdev_tx_reset_queue(netdev_get_tx_queue(iq->netdev, iq->q_no));
 }
index 86c98b13fc44198e03fb80cfe957a1eebe59542a..1ba4ff65e54d0bfc59de1abe57234085eedda500 100644 (file)
@@ -172,9 +172,6 @@ struct octep_iq {
        /* Statistics for this input queue. */
        struct octep_iq_stats stats;
 
-       /* This field keeps track of the instructions pending in this queue. */
-       atomic_t instr_pending;
-
        /* Pointer to the Virtual Base addr of the input ring. */
        struct octep_tx_desc_hw *desc_ring;