Commit 6861d6d9 authored by David S. Miller's avatar David S. Miller

Merge branch 'qdisc-noop'

Jesper Dangaard Brouer says:

====================
Fix qdisc noop issue caused by driver and identify future bugs

I've been very puzzled why networking on my NXP development board,
using driver dpaa2-eth, stopped working when I updated the kernel
version >= 5.3.  The observable issue were that interface would drop
all TX packets, because it had assigned the qdisc noop.

This turned out the be a NIC driver bug, that would only get triggered
when using sysctl net/core/default_qdisc=fq_codel. It was non-trivial
to find out[1] this was driver related. Thus, this patchset besides
fixing the driver bug, also helps end-user identify the issue.

[1]: https://github.com/xdp-project/xdp-project/blob/master/areas/arm64/board_nxp_ls1088/nxp-board04-troubleshoot-qdisc.org
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 92dc39fd b89c1e6b
...@@ -2021,7 +2021,7 @@ static int dpaa2_eth_setup_tc(struct net_device *net_dev, ...@@ -2021,7 +2021,7 @@ static int dpaa2_eth_setup_tc(struct net_device *net_dev,
int i; int i;
if (type != TC_SETUP_QDISC_MQPRIO) if (type != TC_SETUP_QDISC_MQPRIO)
return -EINVAL; return -EOPNOTSUPP;
mqprio->hw = TC_MQPRIO_HW_OFFLOAD_TCS; mqprio->hw = TC_MQPRIO_HW_OFFLOAD_TCS;
num_queues = dpaa2_eth_queue_count(priv); num_queues = dpaa2_eth_queue_count(priv);
...@@ -2033,7 +2033,7 @@ static int dpaa2_eth_setup_tc(struct net_device *net_dev, ...@@ -2033,7 +2033,7 @@ static int dpaa2_eth_setup_tc(struct net_device *net_dev,
if (num_tc > dpaa2_eth_tc_count(priv)) { if (num_tc > dpaa2_eth_tc_count(priv)) {
netdev_err(net_dev, "Max %d traffic classes supported\n", netdev_err(net_dev, "Max %d traffic classes supported\n",
dpaa2_eth_tc_count(priv)); dpaa2_eth_tc_count(priv));
return -EINVAL; return -EOPNOTSUPP;
} }
if (!num_tc) { if (!num_tc) {
......
...@@ -735,8 +735,11 @@ static int tcf_block_offload_cmd(struct tcf_block *block, ...@@ -735,8 +735,11 @@ static int tcf_block_offload_cmd(struct tcf_block *block,
INIT_LIST_HEAD(&bo.cb_list); INIT_LIST_HEAD(&bo.cb_list);
err = dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_BLOCK, &bo); err = dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_BLOCK, &bo);
if (err < 0) if (err < 0) {
if (err != -EOPNOTSUPP)
NL_SET_ERR_MSG(extack, "Driver ndo_setup_tc failed");
return err; return err;
}
return tcf_block_setup(block, &bo); return tcf_block_setup(block, &bo);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment