• Ahmed S. Darwish's avatar
    net: sched: Remove Qdisc::running sequence counter · 29cbcd85
    Ahmed S. Darwish authored
    The Qdisc::running sequence counter has two uses:
    
      1. Reliably reading qdisc's tc statistics while the qdisc is running
         (a seqcount read/retry loop at gnet_stats_add_basic()).
    
      2. As a flag, indicating whether the qdisc in question is running
         (without any retry loops).
    
    For the first usage, the Qdisc::running sequence counter write section,
    qdisc_run_begin() => qdisc_run_end(), covers a much wider area than what
    is actually needed: the raw qdisc's bstats update. A u64_stats sync
    point was thus introduced (in previous commits) inside the bstats
    structure itself. A local u64_stats write section is then started and
    stopped for the bstats updates.
    
    Use that u64_stats sync point mechanism for the bstats read/retry loop
    at gnet_stats_add_basic().
    
    For the second qdisc->running usage, a __QDISC_STATE_RUNNING bit flag,
    accessed with atomic bitops, is sufficient. Using a bit flag instead of
    a sequence counter at qdisc_run_begin/end() and qdisc_is_running() leads
    to the SMP barriers implicitly added through raw_read_seqcount() and
    write_seqcount_begin/end() getting removed. All call sites have been
    surveyed though, and no required ordering was identified.
    
    Now that the qdisc->running sequence counter is no longer used, remove
    it.
    
    Note, using u64_stats implies no sequence counter protection for 64-bit
    architectures. This can lead to the qdisc tc statistics "packets" vs.
    "bytes" values getting out of sync on rare occasions. The individual
    values will still be valid.
    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>
    29cbcd85
gen_stats.c 12.4 KB