• Vladimir Oltean's avatar
    net: dsa: felix: fix min gate len calculation for tc when its first gate is closed · 7e4babff
    Vladimir Oltean authored
    min_gate_len[tc] is supposed to track the shortest interval of
    continuously open gates for a traffic class. For example, in the
    following case:
    
    TC 76543210
    
    t0 00000001b 200000 ns
    t1 00000010b 200000 ns
    
    min_gate_len[0] and min_gate_len[1] should be 200000, while
    min_gate_len[2-7] should be 0.
    
    However what happens is that min_gate_len[0] is 200000, but
    min_gate_len[1] ends up being 0 (despite gate_len[1] being 200000 at the
    point where the logic detects the gate close event for TC 1).
    
    The problem is that the code considers a "gate close" event whenever it
    sees that there is a 0 for that TC (essentially it's level rather than
    edge triggered). By doing that, any time a gate is seen as closed
    without having been open prior, gate_len, which is 0, will be written
    into min_gate_len. Once min_gate_len becomes 0, it's impossible for it
    to track anything higher than that (the length of actually open
    intervals).
    
    To fix this, we make the writing to min_gate_len[tc] be edge-triggered,
    which avoids writes for gates that are closed in consecutive intervals.
    However what this does is it makes us need to special-case the
    permanently closed gates at the end.
    
    Fixes: 55a515b1 ("net: dsa: felix: drop oversized frames with tc-taprio instead of hanging the port")
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Link: https://lore.kernel.org/r/20220804202817.1677572-1-vladimir.oltean@nxp.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    7e4babff
felix_vsc9959.c 76 KB