• Maxim Mikityanskiy's avatar
    sch_htb: Fix inconsistency when leaf qdisc creation fails · ca49bfd9
    Maxim Mikityanskiy authored
    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: d03b195b ("sch_htb: Hierarchical QoS hardware offload")
    Signed-off-by: default avatarMaxim Mikityanskiy <maximmi@nvidia.com>
    Reviewed-by: default avatarTariq Toukan <tariqt@nvidia.com>
    Link: https://lore.kernel.org/r/20210826115425.1744053-1-maximmi@nvidia.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    ca49bfd9
sch_htb.c 55.7 KB