• Vladimir Oltean's avatar
    net/sched: taprio: only pass gate mask per TXQ for igc, stmmac, tsnep, am65_cpsw · 522d15ea
    Vladimir Oltean authored
    There are 2 classes of in-tree drivers currently:
    
    - those who act upon struct tc_taprio_sched_entry :: gate_mask as if it
      holds a bit mask of TXQs
    
    - those who act upon the gate_mask as if it holds a bit mask of TCs
    
    When it comes to the standard, IEEE 802.1Q-2018 does say this in the
    second paragraph of section 8.6.8.4 Enhancements for scheduled traffic:
    
    | A gate control list associated with each Port contains an ordered list
    | of gate operations. Each gate operation changes the transmission gate
    | state for the gate associated with each of the Port's traffic class
    | queues and allows associated control operations to be scheduled.
    
    In typically obtuse language, it refers to a "traffic class queue"
    rather than a "traffic class" or a "queue". But careful reading of
    802.1Q clarifies that "traffic class" and "queue" are in fact
    synonymous (see 8.6.6 Queuing frames):
    
    | A queue in this context is not necessarily a single FIFO data structure.
    | A queue is a record of all frames of a given traffic class awaiting
    | transmission on a given Bridge Port. The structure of this record is not
    | specified.
    
    i.o.w. their definition of "queue" isn't the Linux TX queue.
    
    The gate_mask really is input into taprio via its UAPI as a mask of
    traffic classes, but taprio_sched_to_offload() converts it into a TXQ
    mask.
    
    The breakdown of drivers which handle TC_SETUP_QDISC_TAPRIO is:
    
    - hellcreek, felix, sja1105: these are DSA switches, it's not even very
      clear what TXQs correspond to, other than purely software constructs.
      Only the mqprio configuration with 8 TCs and 1 TXQ per TC makes sense.
      So it's fine to convert these to a gate mask per TC.
    
    - enetc: I have the hardware and can confirm that the gate mask is per
      TC, and affects all TXQs (BD rings) configured for that priority.
    
    - igc: in igc_save_qbv_schedule(), the gate_mask is clearly interpreted
      to be per-TXQ.
    
    - tsnep: Gerhard Engleder clarifies that even though this hardware
      supports at most 1 TXQ per TC, the TXQ indices may be different from
      the TC values themselves, and it is the TXQ indices that matter to
      this hardware. So keep it per-TXQ as well.
    
    - stmmac: I have a GMAC datasheet, and in the EST section it does
      specify that the gate events are per TXQ rather than per TC.
    
    - lan966x: again, this is a switch, and while not a DSA one, the way in
      which it implements lan966x_mqprio_add() - by only allowing num_tc ==
      NUM_PRIO_QUEUES (8) - makes it clear to me that TXQs are a purely
      software construct here as well. They seem to map 1:1 with TCs.
    
    - am65_cpsw: from looking at am65_cpsw_est_set_sched_cmds(), I get the
      impression that the fetch_allow variable is treated like a prio_mask.
      This definitely sounds closer to a per-TC gate mask rather than a
      per-TXQ one, and TI documentation does seem to recomment an identity
      mapping between TCs and TXQs. However, Roger Quadros would like to do
      some testing before making changes, so I'm leaving this driver to
      operate as it did before, for now. Link with more details at the end.
    
    Based on this breakdown, we have 5 drivers with a gate mask per TC and
    4 with a gate mask per TXQ. So let's make the gate mask per TXQ the
    opt-in and the gate mask per TC the default.
    
    Benefit from the TC_QUERY_CAPS feature that Jakub suggested we add, and
    query the device driver before calling the proper ndo_setup_tc(), and
    figure out if it expects one or the other format.
    
    Link: https://patchwork.kernel.org/project/netdevbpf/patch/20230202003621.2679603-15-vladimir.oltean@nxp.com/#25193204
    Cc: Horatiu Vultur <horatiu.vultur@microchip.com>
    Cc: Siddharth Vadapalli <s-vadapalli@ti.com>
    Cc: Roger Quadros <rogerq@kernel.org>
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Acked-by: Kurt Kanzenbach <kurt@linutronix.de> # hellcreek
    Reviewed-by: default avatarGerhard Engleder <gerhard@engleder-embedded.com>
    Reviewed-by: default avatarSimon Horman <simon.horman@corigine.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    522d15ea
igc_main.c 179 KB