]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: ntb_netdev: Factor out multi-queue helpers
authorKoichiro Den <den@valinux.co.jp>
Thu, 5 Mar 2026 15:56:38 +0000 (00:56 +0900)
committerJakub Kicinski <kuba@kernel.org>
Sat, 7 Mar 2026 03:15:20 +0000 (19:15 -0800)
Implementing .set_channels will otherwise duplicate the same multi-queue
operations at multiple call sites. Factor out the following helpers:

  - ntb_netdev_update_carrier(): carrier is switched on when at least
                                 one QP link is up
  - ntb_netdev_queue_rx_drain(): drain and free all queued RX packets
                                 for one QP
  - ntb_netdev_queue_rx_fill():  prefill RX ring for one QP

No functional change.

Signed-off-by: Koichiro Den <den@valinux.co.jp>
Link: https://patch.msgid.link/20260305155639.1885517-4-den@valinux.co.jp
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ntb_netdev.c

index e4c1422d1d7ae594f70a26adf40bdbabbe5d69f8..ac39652b04881244cbc0bc112e3e86d112ce8cbf 100644 (file)
@@ -94,26 +94,14 @@ struct ntb_netdev {
 #define        NTB_TX_TIMEOUT_MS       1000
 #define        NTB_RXQ_SIZE            100
 
-static void ntb_netdev_event_handler(void *data, int link_is_up)
+static void ntb_netdev_update_carrier(struct ntb_netdev *dev)
 {
-       struct ntb_netdev_queue *q = data;
-       struct ntb_netdev *dev = q->ntdev;
        struct net_device *ndev;
        bool any_up = false;
        unsigned int i;
 
        ndev = dev->ndev;
 
-       netdev_dbg(ndev, "Event %x, Link %x, qp %u\n", link_is_up,
-                  ntb_transport_link_query(q->qp), q->qid);
-
-       if (netif_running(ndev)) {
-               if (link_is_up)
-                       netif_wake_subqueue(ndev, q->qid);
-               else
-                       netif_stop_subqueue(ndev, q->qid);
-       }
-
        for (i = 0; i < dev->num_queues; i++) {
                if (ntb_transport_link_query(dev->queues[i].qp)) {
                        any_up = true;
@@ -127,6 +115,58 @@ static void ntb_netdev_event_handler(void *data, int link_is_up)
                netif_carrier_off(ndev);
 }
 
+static void ntb_netdev_queue_rx_drain(struct ntb_netdev_queue *queue)
+{
+       struct sk_buff *skb;
+       int len;
+
+       while ((skb = ntb_transport_rx_remove(queue->qp, &len)))
+               dev_kfree_skb(skb);
+}
+
+static int ntb_netdev_queue_rx_fill(struct net_device *ndev,
+                                   struct ntb_netdev_queue *queue)
+{
+       struct sk_buff *skb;
+       int rc, i;
+
+       for (i = 0; i < NTB_RXQ_SIZE; i++) {
+               skb = netdev_alloc_skb(ndev, ndev->mtu + ETH_HLEN);
+               if (!skb)
+                       return -ENOMEM;
+
+               rc = ntb_transport_rx_enqueue(queue->qp, skb, skb->data,
+                                             ndev->mtu + ETH_HLEN);
+               if (rc) {
+                       dev_kfree_skb(skb);
+                       return rc;
+               }
+       }
+
+       return 0;
+}
+
+static void ntb_netdev_event_handler(void *data, int link_is_up)
+{
+       struct ntb_netdev_queue *q = data;
+       struct ntb_netdev *dev = q->ntdev;
+       struct net_device *ndev;
+
+       ndev = dev->ndev;
+
+       netdev_dbg(ndev, "Event %x, Link %x, qp %u\n", link_is_up,
+                  ntb_transport_link_query(q->qp), q->qid);
+
+       if (netif_running(ndev)) {
+               if (link_is_up)
+                       netif_wake_subqueue(ndev, q->qid);
+               else
+                       netif_stop_subqueue(ndev, q->qid);
+       }
+
+       ntb_netdev_update_carrier(dev);
+}
+
 static void ntb_netdev_rx_handler(struct ntb_transport_qp *qp, void *qp_data,
                                  void *data, int len)
 {
@@ -298,28 +338,16 @@ static int ntb_netdev_open(struct net_device *ndev)
 {
        struct ntb_netdev *dev = netdev_priv(ndev);
        struct ntb_netdev_queue *queue;
-       struct sk_buff *skb;
-       int rc = 0, i, len;
        unsigned int q;
+       int rc = 0;
 
        /* Add some empty rx bufs for each queue */
        for (q = 0; q < dev->num_queues; q++) {
                queue = &dev->queues[q];
 
-               for (i = 0; i < NTB_RXQ_SIZE; i++) {
-                       skb = netdev_alloc_skb(ndev, ndev->mtu + ETH_HLEN);
-                       if (!skb) {
-                               rc = -ENOMEM;
-                               goto err;
-                       }
-
-                       rc = ntb_transport_rx_enqueue(queue->qp, skb, skb->data,
-                                                     ndev->mtu + ETH_HLEN);
-                       if (rc) {
-                               dev_kfree_skb(skb);
-                               goto err;
-                       }
-               }
+               rc = ntb_netdev_queue_rx_fill(ndev, queue);
+               if (rc)
+                       goto err;
 
                timer_setup(&queue->tx_timer, ntb_netdev_tx_timer, 0);
        }
@@ -335,9 +363,7 @@ static int ntb_netdev_open(struct net_device *ndev)
 err:
        for (q = 0; q < dev->num_queues; q++) {
                queue = &dev->queues[q];
-
-               while ((skb = ntb_transport_rx_remove(queue->qp, &len)))
-                       dev_kfree_skb(skb);
+               ntb_netdev_queue_rx_drain(queue);
        }
        return rc;
 }
@@ -346,9 +372,7 @@ static int ntb_netdev_close(struct net_device *ndev)
 {
        struct ntb_netdev *dev = netdev_priv(ndev);
        struct ntb_netdev_queue *queue;
-       struct sk_buff *skb;
        unsigned int q;
-       int len;
 
        netif_tx_stop_all_queues(ndev);
        netif_carrier_off(ndev);
@@ -357,12 +381,10 @@ static int ntb_netdev_close(struct net_device *ndev)
                queue = &dev->queues[q];
 
                ntb_transport_link_down(queue->qp);
-
-               while ((skb = ntb_transport_rx_remove(queue->qp, &len)))
-                       dev_kfree_skb(skb);
-
+               ntb_netdev_queue_rx_drain(queue);
                timer_delete_sync(&queue->tx_timer);
        }
+
        return 0;
 }
 
@@ -428,8 +450,7 @@ err:
 
                ntb_transport_link_down(queue->qp);
 
-               while ((skb = ntb_transport_rx_remove(queue->qp, &len)))
-                       dev_kfree_skb(skb);
+               ntb_netdev_queue_rx_drain(queue);
        }
 
        netdev_err(ndev, "Error changing MTU, device inoperable\n");