lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 1011/1039] net_sched: restore "mpu xxx" handling
    Date
    From: Kevin Bracey <kevin@bracey.fi>

    commit fb80445c438c78b40b547d12b8d56596ce4ccfeb upstream.

    commit 56b765b79e9a ("htb: improved accuracy at high rates") broke
    "overhead X", "linklayer atm" and "mpu X" attributes.

    "overhead X" and "linklayer atm" have already been fixed. This restores
    the "mpu X" handling, as might be used by DOCSIS or Ethernet shaping:

    tc class add ... htb rate X overhead 4 mpu 64

    The code being fixed is used by htb, tbf and act_police. Cake has its
    own mpu handling. qdisc_calculate_pkt_len still uses the size table
    containing values adjusted for mpu by user space.

    iproute2 tc has always passed mpu into the kernel via a tc_ratespec
    structure, but the kernel never directly acted on it, merely stored it
    so that it could be read back by `tc class show`.

    Rather, tc would generate length-to-time tables that included the mpu
    (and linklayer) in their construction, and the kernel used those tables.

    Since v3.7, the tables were no longer used. Along with "mpu", this also
    broke "overhead" and "linklayer" which were fixed in 01cb71d2d47b
    ("net_sched: restore "overhead xxx" handling", v3.10) and 8a8e3d84b171
    ("net_sched: restore "linklayer atm" handling", v3.11).

    "overhead" was fixed by simply restoring use of tc_ratespec::overhead -
    this had originally been used by the kernel but was initially omitted
    from the new non-table-based calculations.

    "linklayer" had been handled in the table like "mpu", but the mode was
    not originally passed in tc_ratespec. The new implementation was made to
    handle it by getting new versions of tc to pass the mode in an extended
    tc_ratespec, and for older versions of tc the table contents were analysed
    at load time to deduce linklayer.

    As "mpu" has always been given to the kernel in tc_ratespec,
    accompanying the mpu-based table, we can restore system functionality
    with no userspace change by making the kernel act on the tc_ratespec
    value.

    Fixes: 56b765b79e9a ("htb: improved accuracy at high rates")
    Signed-off-by: Kevin Bracey <kevin@bracey.fi>
    Cc: Eric Dumazet <edumazet@google.com>
    Cc: Jiri Pirko <jiri@resnulli.us>
    Cc: Vimalkumar <j.vimal@gmail.com>
    Link: https://lore.kernel.org/r/20220112170210.1014351-1-kevin@bracey.fi
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    include/net/sch_generic.h | 5 +++++
    net/sched/sch_generic.c | 1 +
    2 files changed, 6 insertions(+)

    --- a/include/net/sch_generic.h
    +++ b/include/net/sch_generic.h
    @@ -1244,6 +1244,7 @@ struct psched_ratecfg {
    u64 rate_bytes_ps; /* bytes per second */
    u32 mult;
    u16 overhead;
    + u16 mpu;
    u8 linklayer;
    u8 shift;
    };
    @@ -1253,6 +1254,9 @@ static inline u64 psched_l2t_ns(const st
    {
    len += r->overhead;

    + if (len < r->mpu)
    + len = r->mpu;
    +
    if (unlikely(r->linklayer == TC_LINKLAYER_ATM))
    return ((u64)(DIV_ROUND_UP(len,48)*53) * r->mult) >> r->shift;

    @@ -1275,6 +1279,7 @@ static inline void psched_ratecfg_getrat
    res->rate = min_t(u64, r->rate_bytes_ps, ~0U);

    res->overhead = r->overhead;
    + res->mpu = r->mpu;
    res->linklayer = (r->linklayer & TC_LINKLAYER_MASK);
    }

    --- a/net/sched/sch_generic.c
    +++ b/net/sched/sch_generic.c
    @@ -1474,6 +1474,7 @@ void psched_ratecfg_precompute(struct ps
    {
    memset(r, 0, sizeof(*r));
    r->overhead = conf->overhead;
    + r->mpu = conf->mpu;
    r->rate_bytes_ps = max_t(u64, conf->rate, rate64);
    r->linklayer = (conf->linklayer & TC_LINKLAYER_MASK);
    psched_ratecfg_precompute__(r->rate_bytes_ps, &r->mult, &r->shift);

    \
     
     \ /
      Last update: 2022-01-25 04:09    [W:4.025 / U:0.348 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site