• Vladimir Oltean's avatar
    net/sched: taprio: allow per-TC user input of FP adminStatus · a721c3e5
    Vladimir Oltean authored
    This is a duplication of the FP adminStatus logic introduced for
    tc-mqprio. Offloading is done through the tc_mqprio_qopt_offload
    structure embedded within tc_taprio_qopt_offload. So practically, if a
    device driver is written to treat the mqprio portion of taprio just like
    standalone mqprio, it gets unified handling of frame preemption.
    
    I would have reused more code with taprio, but this is mostly netlink
    attribute parsing, which is hard to transform into generic code without
    having something that stinks as a result. We have the same variables
    with the same semantics, just different nlattr type values
    (TCA_MQPRIO_TC_ENTRY=5 vs TCA_TAPRIO_ATTR_TC_ENTRY=12;
    TCA_MQPRIO_TC_ENTRY_FP=2 vs TCA_TAPRIO_TC_ENTRY_FP=3, etc) and
    consequently, different policies for the nest.
    
    Every time nla_parse_nested() is called, an on-stack table "tb" of
    nlattr pointers is allocated statically, up to the maximum understood
    nlattr type. That array size is hardcoded as a constant, but when
    transforming this into a common parsing function, it would become either
    a VLA (which the Linux kernel rightfully doesn't like) or a call to the
    allocator.
    
    Having FP adminStatus in tc-taprio can be seen as addressing the 802.1Q
    Annex S.3 "Scheduling and preemption used in combination, no HOLD/RELEASE"
    and S.4 "Scheduling and preemption used in combination with HOLD/RELEASE"
    use cases. HOLD and RELEASE events are emitted towards the underlying
    MAC Merge layer when the schedule hits a Set-And-Hold-MAC or a
    Set-And-Release-MAC gate operation. So within the tc-taprio UAPI space,
    one can distinguish between the 2 use cases by choosing whether to use
    the TC_TAPRIO_CMD_SET_AND_HOLD and TC_TAPRIO_CMD_SET_AND_RELEASE gate
    operations within the schedule, or just TC_TAPRIO_CMD_SET_GATES.
    
    A small part of the change is dedicated to refactoring the max_sdu
    nlattr parsing to put all logic under the "if" that tests for presence
    of that nlattr.
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Reviewed-by: default avatarFerenc Fejes <fejes@inf.elte.hu>
    Reviewed-by: default avatarSimon Horman <simon.horman@corigine.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    a721c3e5
pkt_sched.h 30.1 KB