[PATCH net-next] net: stmmac: fix mqprio and cbs combination

Daniel Machon daniel.machon at microchip.com
Tue Oct 13 03:10:31 PDT 2026


Hi Lorenzo,

Just a question:

> The channel-mode mqprio offload and the CBS offload can currently not be
> enabled at the same time. tc_mqprio_validate_chan_mode() refuses the
> mqprio offload as soon as any TX queue is configured in AVB mode, and
> tc_setup_cbs() refuses to enable CBS while the strict-priority scheduler
> is active. As a result the combination is rejected whichever order the
> two are configured in.
> 
> The strict-priority scheduler selected by the channel-mode mqprio
> offload and the per-queue CBS shaper are independent MTL settings and do
> not conflict, so drop the checks and let the combination be offloaded.
> The following configuration, which was previously refused, now works:

Looks to me like these checks are shared by multiple cores. Are the MTL settings
independent on all of them?

> 
>   $ tc qdisc replace dev eth0 handle 100 parent root mqprio num_tc 4 \
>         map  0  0  0  0  0  1  2  3  0  0  0  0  0  0  0  0 \
>         queues 1 at 0 1 at 1 1 at 2 1 at 3 mode channel hw 1
>   $ tc qdisc replace dev eth0 parent 100:2 handle 102: cbs \
>         idleslope 800000 sendslope -1700000 hicredit 494 locredit -1049 offload 0
>   $ tc qdisc replace dev eth0 parent 100:3 handle 103: cbs \
>         idleslope 400000 sendslope -2100000 hicredit 247 locredit -1296 offload 1
>   $ tc qdisc replace dev eth0 parent 100:4 handle 104: cbs \
>         idleslope 200000 sendslope -2300000 hicredit 124 locredit -1419 offload 1
> 
> Fixes: 47891d501e34 ("net: stmmac: add tc mqprio hw queue priority offload")
> Tested-by: Daniel Thompson <daniel at riscstar.com>
> Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi at oss.qualcomm.com>
> ---
>  drivers/net/ethernet/stmicro/stmmac/stmmac_main.c |  8 --------
>  drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c   | 16 ----------------
>  2 files changed, 24 deletions(-)
> 
> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
> index 56d89a696272..51d502930219 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
> @@ -7740,14 +7740,6 @@ int stmmac_reinit_queues(struct net_device *dev, u8 rx_cnt, u8 tx_cnt)
>  	    tx_cnt < priv->xmit_qdisc.num_tx_queues)
>  		return -EINVAL;
>  
> -	if (priv->xmit_qdisc.prio_offload) {
> -		for (i = priv->plat->tx_queues_to_use; i < tx_cnt; i++) {
> -			if (priv->plat->tx_queues_cfg[i].mode_to_use ==
> -			    MTL_QUEUE_AVB)
> -				return -EINVAL;
> -		}
> -	}
> -
>  	if (netif_running(dev))
>  		stmmac_release(dev);
>  
> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c
> index ea1f97d6f0bd..175236ba379d 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c
> @@ -346,9 +346,6 @@ static int tc_setup_cbs(struct stmmac_priv *priv,
>  	if (!priv->dma_cap.av)
>  		return -EOPNOTSUPP;
>  
> -	if (qopt->enable && priv->xmit_qdisc.prio_offload)
> -		return -EOPNOTSUPP;
> -
>  	port_transmit_rate_kbps = qopt->idleslope - qopt->sendslope;
>  
>  	if (qopt->enable) {
> @@ -1340,7 +1337,6 @@ static void tc_mqprio_config_queue_prio(struct stmmac_priv *priv,
>  static int tc_mqprio_validate_chan_mode(struct stmmac_priv *priv,
>  					struct tc_mqprio_qopt_offload *mqprio)
>  {
> -	struct plat_stmmacenet_data *pdata = priv->plat;
>  	struct tc_mqprio_qopt *qopt = &mqprio->qopt;
>  	int i;
>  
> @@ -1350,18 +1346,6 @@ static int tc_mqprio_validate_chan_mode(struct stmmac_priv *priv,
>  		return -EOPNOTSUPP;
>  	}
>  
> -	/* Forcing strict priority conflicts with the CBS algorithm
> -	 * of AVB queues, so reject the offload when any queue is
> -	 * configured as AVB.
> -	 */
> -	for (i = 0; i < pdata->tx_queues_to_use; i++) {
> -		if (pdata->tx_queues_cfg[i].mode_to_use == MTL_QUEUE_AVB) {
> -			NL_SET_ERR_MSG_MOD(mqprio->extack,
> -					   "SP conflicts with AVB queues");
> -			return -EOPNOTSUPP;
> -		}
> -	}
> -
>  	for (i = 0; i < qopt->num_tc; i++) {
>  		/* The offload switches the MTL scheduler to strict
>  		 * priority, which only supports a 1:1 TC to TX queue
> 
> ---
> base-commit: d0bd617658ddfa5a115e64d1ab687bf155f6331f
> change-id: 20261012-stmmac-mqprio-cbs-combo-341f12749ce2
> 
> Best regards,
> -- 
> Lorenzo Bianconi <lorenzo.bianconi at oss.qualcomm.com>
> 

/Daniel



More information about the linux-arm-kernel mailing list