dpaa2-eth: Refactor xps code
authorIoana Radulescu <ruxandra.radulescu@nxp.com>
Tue, 11 Jun 2019 11:50:01 +0000 (14:50 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 12 Jun 2019 18:22:10 +0000 (11:22 -0700)
Move the code configuring xps on the netdev TX queues to a
separate function. A subsequent patch will need to call
this in another context as well.

Signed-off-by: Ioana Radulescu <ruxandra.radulescu@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c

index 8a438331e94248bdfac41f450c8dfde94d81d5d2..a0988e0a18cec5eab0e2949b0fcd5fbef3065a5d 100644 (file)
@@ -1863,6 +1863,35 @@ static int dpaa2_eth_xdp_xmit(struct net_device *net_dev, int n,
        return n - drops;
 }
 
+static int update_xps(struct dpaa2_eth_priv *priv)
+{
+       struct net_device *net_dev = priv->net_dev;
+       struct cpumask xps_mask;
+       struct dpaa2_eth_fq *fq;
+       int i, num_queues;
+       int err = 0;
+
+       num_queues = dpaa2_eth_queue_count(priv);
+
+       /* The first <num_queues> entries in priv->fq array are Tx/Tx conf
+        * queues, so only process those
+        */
+       for (i = 0; i < num_queues; i++) {
+               fq = &priv->fq[i];
+
+               cpumask_clear(&xps_mask);
+               cpumask_set_cpu(fq->target_cpu, &xps_mask);
+
+               err = netif_set_xps_queue(net_dev, &xps_mask, i);
+               if (err) {
+                       netdev_warn_once(net_dev, "Error setting XPS queue\n");
+                       break;
+               }
+       }
+
+       return err;
+}
+
 static const struct net_device_ops dpaa2_eth_ops = {
        .ndo_open = dpaa2_eth_open,
        .ndo_start_xmit = dpaa2_eth_tx,
@@ -2129,10 +2158,9 @@ static struct dpaa2_eth_channel *get_affine_channel(struct dpaa2_eth_priv *priv,
 static void set_fq_affinity(struct dpaa2_eth_priv *priv)
 {
        struct device *dev = priv->net_dev->dev.parent;
-       struct cpumask xps_mask;
        struct dpaa2_eth_fq *fq;
        int rx_cpu, txc_cpu;
-       int i, err;
+       int i;
 
        /* For each FQ, pick one channel/CPU to deliver frames to.
         * This may well change at runtime, either through irqbalance or
@@ -2151,17 +2179,6 @@ static void set_fq_affinity(struct dpaa2_eth_priv *priv)
                        break;
                case DPAA2_TX_CONF_FQ:
                        fq->target_cpu = txc_cpu;
-
-                       /* Tell the stack to affine to txc_cpu the Tx queue
-                        * associated with the confirmation one
-                        */
-                       cpumask_clear(&xps_mask);
-                       cpumask_set_cpu(txc_cpu, &xps_mask);
-                       err = netif_set_xps_queue(priv->net_dev, &xps_mask,
-                                                 fq->flowid);
-                       if (err)
-                               dev_err(dev, "Error setting XPS queue\n");
-
                        txc_cpu = cpumask_next(txc_cpu, &priv->dpio_cpumask);
                        if (txc_cpu >= nr_cpu_ids)
                                txc_cpu = cpumask_first(&priv->dpio_cpumask);
@@ -2171,6 +2188,8 @@ static void set_fq_affinity(struct dpaa2_eth_priv *priv)
                }
                fq->channel = get_affine_channel(priv, fq->target_cpu);
        }
+
+       update_xps(priv);
 }
 
 static void setup_fqs(struct dpaa2_eth_priv *priv)