net: sched: Allow statistics reads from softirq.
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Tue, 19 Oct 2021 10:12:04 +0000 (12:12 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 19 Oct 2021 12:07:35 +0000 (13:07 +0100)
Eric reported that the rate estimator reads statics from the softirq
which in turn triggers a warning introduced in the statistics rework.

The warning is too cautious. The updates happen in the softirq context
so reads from softirq are fine since the writes can not be preempted.
The updates/writes happen during qdisc_run() which ensures one writer
and the softirq context.
The remaining bad context for reading statistics remains in hard-IRQ
because it may preempt a writer.

Fixes: 29cbcd8582837 ("net: sched: Remove Qdisc::running sequence counter")
Reported-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/gen_stats.c

index 5516ea0d5da0b0d8b8824a15e2dabf65e21f6770..15c270e22c5efb2e1cfc2cedd1e28cacda0b0c21 100644 (file)
@@ -154,7 +154,7 @@ void gnet_stats_add_basic(struct gnet_stats_basic_sync *bstats,
        u64 bytes = 0;
        u64 packets = 0;
 
-       WARN_ON_ONCE((cpu || running) && !in_task());
+       WARN_ON_ONCE((cpu || running) && in_hardirq());
 
        if (cpu) {
                gnet_stats_add_basic_cpu(bstats, cpu);