Hi! Our Qdisc offload so far has been very simplistic. We held and array of marking thresholds and statistics sized to the number of PF queues. This was sufficient since the only configuration we supported was single layer of RED Qdiscs (on top of MQ or not, but MQ isn't really about queuing).
As we move to add more Qdiscs it's time to actually try to track the full Qdisc hierarchy. This allows us to make sure our offloaded configuration reflects the SW path better. We add graft notifications to MQ and RED (PRIO already sends them) to allow drivers offloading those to learn how Qdiscs are linked. MQ graft gives us the obvious advantage of being able to track when Qdiscs are shared or moved. It seems unlikely HW would offload RED's child Qdiscs but since the behaviour would change based on linked child we should stop offloading REDs with modified child. RED will also handle the child differently during reconfig when limit parameter is set - so we have to inform the drivers about the limit, and have them reset the child state when appropriate. The NFP driver will now allocate a structure to track each Qdisc and link it to its children. We will also maintain a shadow copy of threshold settings - to save device writes and make it easier to apply defaults when config is re-evaluated. Jakub Kicinski (13): nfp: abm: rename qdiscs -> red_qdiscs nfp: abm: keep track of all RED thresholds nfp: abm: track all offload-enabled qdiscs net: sched: provide notification for graft on root nfp: abm: remember which Qdisc is root nfp: abm: allocate Qdisc child table net: sched: red: offload a graft notification net: sched: mq: offload a graft notification nfp: abm: build full Qdisc hierarchy based on graft notifications net: sched: red: notify drivers about RED's limit parameter nfp: abm: reset RED's child based on limit nfp: abm: save RED's parameters nfp: abm: restructure Qdisc handling drivers/net/ethernet/netronome/nfp/abm/ctrl.c | 105 +-- drivers/net/ethernet/netronome/nfp/abm/main.c | 42 +- drivers/net/ethernet/netronome/nfp/abm/main.h | 108 ++- .../net/ethernet/netronome/nfp/abm/qdisc.c | 712 +++++++++++++----- include/linux/netdevice.h | 1 + include/net/pkt_cls.h | 24 +- net/sched/sch_api.c | 17 + net/sched/sch_mq.c | 9 + net/sched/sch_red.c | 18 + 9 files changed, 740 insertions(+), 296 deletions(-) -- 2.17.1