dpaa2-eth: Refactor xps code
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>
This commit is contained in:
parent
a41efedfaf
commit
06d5b17911
|
@ -1863,6 +1863,35 @@ static int dpaa2_eth_xdp_xmit(struct net_device *net_dev, int n,
|
||||||
return n - drops;
|
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 = {
|
static const struct net_device_ops dpaa2_eth_ops = {
|
||||||
.ndo_open = dpaa2_eth_open,
|
.ndo_open = dpaa2_eth_open,
|
||||||
.ndo_start_xmit = dpaa2_eth_tx,
|
.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)
|
static void set_fq_affinity(struct dpaa2_eth_priv *priv)
|
||||||
{
|
{
|
||||||
struct device *dev = priv->net_dev->dev.parent;
|
struct device *dev = priv->net_dev->dev.parent;
|
||||||
struct cpumask xps_mask;
|
|
||||||
struct dpaa2_eth_fq *fq;
|
struct dpaa2_eth_fq *fq;
|
||||||
int rx_cpu, txc_cpu;
|
int rx_cpu, txc_cpu;
|
||||||
int i, err;
|
int i;
|
||||||
|
|
||||||
/* For each FQ, pick one channel/CPU to deliver frames to.
|
/* For each FQ, pick one channel/CPU to deliver frames to.
|
||||||
* This may well change at runtime, either through irqbalance or
|
* 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;
|
break;
|
||||||
case DPAA2_TX_CONF_FQ:
|
case DPAA2_TX_CONF_FQ:
|
||||||
fq->target_cpu = txc_cpu;
|
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);
|
txc_cpu = cpumask_next(txc_cpu, &priv->dpio_cpumask);
|
||||||
if (txc_cpu >= nr_cpu_ids)
|
if (txc_cpu >= nr_cpu_ids)
|
||||||
txc_cpu = cpumask_first(&priv->dpio_cpumask);
|
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);
|
fq->channel = get_affine_channel(priv, fq->target_cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
update_xps(priv);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setup_fqs(struct dpaa2_eth_priv *priv)
|
static void setup_fqs(struct dpaa2_eth_priv *priv)
|
||||||
|
|
Loading…
Reference in New Issue