• Ahmed S. Darwish's avatar
    net: sched: Protect Qdisc::bstats with u64_stats · 67c9e627
    Ahmed S. Darwish authored
    The not-per-CPU variant of qdisc tc (traffic control) statistics,
    Qdisc::gnet_stats_basic_packed bstats, is protected with Qdisc::running
    sequence counter.
    
    This sequence counter is used for reliably protecting bstats reads from
    parallel writes. Meanwhile, the seqcount's write section covers a much
    wider area than bstats update: qdisc_run_begin() => qdisc_run_end().
    
    That read/write section asymmetry can lead to needless retries of the
    read section. To prepare for removing the Qdisc::running sequence
    counter altogether, introduce a u64_stats sync point inside bstats
    instead.
    
    Modify _bstats_update() to start/end the bstats u64_stats write
    section.
    
    For bisectability, and finer commits granularity, the bstats read
    section is still protected with a Qdisc::running read/retry loop and
    qdisc_run_begin/end() still starts/ends that seqcount write section.
    Once all call sites are modified to use _bstats_update(), the
    Qdisc::running seqcount will be removed and bstats read/retry loop will
    be modified to utilize the internal u64_stats sync point.
    
    Note, using u64_stats implies no sequence counter protection for 64-bit
    architectures. This can lead to the statistics "packets" vs. "bytes"
    values getting out of sync on rare occasions. The individual values will
    still be valid.
    
    [bigeasy: Minor commit message edits, init all gnet_stats_basic_packed.]
    Signed-off-by: default avatarAhmed S. Darwish <a.darwish@linutronix.de>
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    67c9e627
gen_stats.c 11.8 KB