net_sched: gen_estimator: extend packet counter to 64bit
authorEric Dumazet <edumazet@google.com>
Thu, 7 Nov 2019 04:52:40 +0000 (20:52 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 7 Nov 2019 05:51:36 +0000 (21:51 -0800)
I forgot to change last_packets field in struct net_rate_estimator.

Without this fix, rate estimators would misbehave after more
than 2^32 packets have been sent.

Another solution would be to be careful and only use the
32 least significant bits of packets counters, but we have
a hole in net_rate_estimator structure and this looks
easier to read/maintain.

Fixes: d0083d98f685 ("net_sched: extend packet counter to 64bit")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/gen_estimator.c

index bfe7bdd4c3406a40e3b53b0b6c8260112691582e..80dbf2f4016e26824bc968115503ca2072933f63 100644 (file)
@@ -48,7 +48,7 @@ struct net_rate_estimator {
        u8                      intvl_log; /* period : (250ms << intvl_log) */
 
        seqcount_t              seq;
-       u32                     last_packets;
+       u64                     last_packets;
        u64                     last_bytes;
 
        u64                     avpps;
@@ -83,7 +83,7 @@ static void est_timer(struct timer_list *t)
        brate = (b.bytes - est->last_bytes) << (10 - est->ewma_log - est->intvl_log);
        brate -= (est->avbps >> est->ewma_log);
 
-       rate = (u64)(b.packets - est->last_packets) << (10 - est->ewma_log - est->intvl_log);
+       rate = (b.packets - est->last_packets) << (10 - est->ewma_log - est->intvl_log);
        rate -= (est->avpps >> est->ewma_log);
 
        write_seqcount_begin(&est->seq);