sch_htb: Fix inconsistency when leaf qdisc creation fails
authorMaxim Mikityanskiy <maximmi@nvidia.com>
Thu, 26 Aug 2021 11:54:25 +0000 (14:54 +0300)
committerJakub Kicinski <kuba@kernel.org>
Mon, 30 Aug 2021 23:33:59 +0000 (16:33 -0700)
commitca49bfd90a9dde175d2929dc1544b54841e33804
treec52af23984e7acfb4c82285ca771cb5687be6224
parent1b9fbe813016b08e08b22ddba4ddbf9cb1b04b00
sch_htb: Fix inconsistency when leaf qdisc creation fails

In HTB offload mode, qdiscs of leaf classes are grafted to netdev
queues. sch_htb expects the dev_queue field of these qdiscs to point to
the corresponding queues. However, qdisc creation may fail, and in that
case noop_qdisc is used instead. Its dev_queue doesn't point to the
right queue, so sch_htb can lose track of used netdev queues, which will
cause internal inconsistencies.

This commit fixes this bug by keeping track of the netdev queue inside
struct htb_class. All reads of cl->leaf.q->dev_queue are replaced by the
new field, the two values are synced on writes, and WARNs are added to
assert equality of the two values.

The driver API has changed: when TC_HTB_LEAF_DEL needs to move a queue,
the driver used to pass the old and new queue IDs to sch_htb. Now that
there is a new field (offload_queue) in struct htb_class that needs to
be updated on this operation, the driver will pass the old class ID to
sch_htb instead (it already knows the new class ID).

Fixes: d03b195b5aa0 ("sch_htb: Hierarchical QoS hardware offload")
Signed-off-by: Maxim Mikityanskiy <maximmi@nvidia.com>
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
Link: https://lore.kernel.org/r/20210826115425.1744053-1-maximmi@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/en/qos.c
drivers/net/ethernet/mellanox/mlx5/core/en/qos.h
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
include/net/pkt_cls.h
net/sched/sch_htb.c