]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
tsnep: Replace TX spin_lock with __netif_tx_lock
authorGerhard Engleder <gerhard@engleder-embedded.com>
Mon, 16 Jan 2023 20:24:50 +0000 (21:24 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 18 Jan 2023 13:17:05 +0000 (13:17 +0000)
TX spin_lock can be eliminated, because the normal TX path is already
protected with __netif_tx_lock and this lock can be used for access to
queue outside of normal TX path too.

Signed-off-by: Gerhard Engleder <gerhard@engleder-embedded.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/engleder/tsnep.h
drivers/net/ethernet/engleder/tsnep_main.c

index f93ba48bac3f452f5845d1878dc362e642d1e68d..48910cb1bd8adc38b89c9ee17a14e8085209c19c 100644 (file)
@@ -78,8 +78,6 @@ struct tsnep_tx {
        void *page[TSNEP_RING_PAGE_COUNT];
        dma_addr_t page_dma[TSNEP_RING_PAGE_COUNT];
 
-       /* TX ring lock */
-       spinlock_t lock;
        struct tsnep_tx_entry entry[TSNEP_RING_SIZE];
        int write;
        int read;
index bf0190e1d2ea4c9fdd291eadf5eeeea6b00acbb3..c182c40277ddc767ae8fe316f187d05ef8c8b0be 100644 (file)
@@ -434,7 +434,6 @@ static int tsnep_tx_unmap(struct tsnep_tx *tx, int index, int count)
 static netdev_tx_t tsnep_xmit_frame_ring(struct sk_buff *skb,
                                         struct tsnep_tx *tx)
 {
-       unsigned long flags;
        int count = 1;
        struct tsnep_tx_entry *entry;
        int length;
@@ -444,16 +443,12 @@ static netdev_tx_t tsnep_xmit_frame_ring(struct sk_buff *skb,
        if (skb_shinfo(skb)->nr_frags > 0)
                count += skb_shinfo(skb)->nr_frags;
 
-       spin_lock_irqsave(&tx->lock, flags);
-
        if (tsnep_tx_desc_available(tx) < count) {
                /* ring full, shall not happen because queue is stopped if full
                 * below
                 */
                netif_stop_queue(tx->adapter->netdev);
 
-               spin_unlock_irqrestore(&tx->lock, flags);
-
                return NETDEV_TX_BUSY;
        }
 
@@ -468,8 +463,6 @@ static netdev_tx_t tsnep_xmit_frame_ring(struct sk_buff *skb,
 
                tx->dropped++;
 
-               spin_unlock_irqrestore(&tx->lock, flags);
-
                netdev_err(tx->adapter->netdev, "TX DMA map failed\n");
 
                return NETDEV_TX_OK;
@@ -496,20 +489,19 @@ static netdev_tx_t tsnep_xmit_frame_ring(struct sk_buff *skb,
                netif_stop_queue(tx->adapter->netdev);
        }
 
-       spin_unlock_irqrestore(&tx->lock, flags);
-
        return NETDEV_TX_OK;
 }
 
 static bool tsnep_tx_poll(struct tsnep_tx *tx, int napi_budget)
 {
-       unsigned long flags;
-       int budget = 128;
        struct tsnep_tx_entry *entry;
-       int count;
+       struct netdev_queue *nq;
+       int budget = 128;
        int length;
+       int count;
 
-       spin_lock_irqsave(&tx->lock, flags);
+       nq = netdev_get_tx_queue(tx->adapter->netdev, tx->queue_index);
+       __netif_tx_lock(nq, smp_processor_id());
 
        do {
                if (tx->read == tx->write)
@@ -568,18 +560,19 @@ static bool tsnep_tx_poll(struct tsnep_tx *tx, int napi_budget)
                netif_wake_queue(tx->adapter->netdev);
        }
 
-       spin_unlock_irqrestore(&tx->lock, flags);
+       __netif_tx_unlock(nq);
 
        return (budget != 0);
 }
 
 static bool tsnep_tx_pending(struct tsnep_tx *tx)
 {
-       unsigned long flags;
        struct tsnep_tx_entry *entry;
+       struct netdev_queue *nq;
        bool pending = false;
 
-       spin_lock_irqsave(&tx->lock, flags);
+       nq = netdev_get_tx_queue(tx->adapter->netdev, tx->queue_index);
+       __netif_tx_lock(nq, smp_processor_id());
 
        if (tx->read != tx->write) {
                entry = &tx->entry[tx->read];
@@ -589,7 +582,7 @@ static bool tsnep_tx_pending(struct tsnep_tx *tx)
                        pending = true;
        }
 
-       spin_unlock_irqrestore(&tx->lock, flags);
+       __netif_tx_unlock(nq);
 
        return pending;
 }
@@ -615,8 +608,6 @@ static int tsnep_tx_open(struct tsnep_adapter *adapter, void __iomem *addr,
        tx->owner_counter = 1;
        tx->increment_owner_counter = TSNEP_RING_SIZE - 1;
 
-       spin_lock_init(&tx->lock);
-
        return 0;
 }