diff options
Diffstat (limited to 'net/core/gen_estimator.c')
-rw-r--r-- | net/core/gen_estimator.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/net/core/gen_estimator.c b/net/core/gen_estimator.c index 9dfb88a933e7..92d886f4adcb 100644 --- a/net/core/gen_estimator.c +++ b/net/core/gen_estimator.c | |||
@@ -66,7 +66,7 @@ | |||
66 | 66 | ||
67 | NOTES. | 67 | NOTES. |
68 | 68 | ||
69 | * avbps is scaled by 2^5, avpps is scaled by 2^10. | 69 | * avbps and avpps are scaled by 2^5. |
70 | * both values are reported as 32 bit unsigned values. bps can | 70 | * both values are reported as 32 bit unsigned values. bps can |
71 | overflow for fast links : max speed being 34360Mbit/sec | 71 | overflow for fast links : max speed being 34360Mbit/sec |
72 | * Minimal interval is HZ/4=250msec (it is the greatest common divisor | 72 | * Minimal interval is HZ/4=250msec (it is the greatest common divisor |
@@ -85,10 +85,10 @@ struct gen_estimator | |||
85 | struct gnet_stats_rate_est64 *rate_est; | 85 | struct gnet_stats_rate_est64 *rate_est; |
86 | spinlock_t *stats_lock; | 86 | spinlock_t *stats_lock; |
87 | int ewma_log; | 87 | int ewma_log; |
88 | u32 last_packets; | ||
89 | unsigned long avpps; | ||
88 | u64 last_bytes; | 90 | u64 last_bytes; |
89 | u64 avbps; | 91 | u64 avbps; |
90 | u32 last_packets; | ||
91 | u32 avpps; | ||
92 | struct rcu_head e_rcu; | 92 | struct rcu_head e_rcu; |
93 | struct rb_node node; | 93 | struct rb_node node; |
94 | struct gnet_stats_basic_cpu __percpu *cpu_bstats; | 94 | struct gnet_stats_basic_cpu __percpu *cpu_bstats; |
@@ -118,8 +118,8 @@ static void est_timer(unsigned long arg) | |||
118 | rcu_read_lock(); | 118 | rcu_read_lock(); |
119 | list_for_each_entry_rcu(e, &elist[idx].list, list) { | 119 | list_for_each_entry_rcu(e, &elist[idx].list, list) { |
120 | struct gnet_stats_basic_packed b = {0}; | 120 | struct gnet_stats_basic_packed b = {0}; |
121 | unsigned long rate; | ||
121 | u64 brate; | 122 | u64 brate; |
122 | u32 rate; | ||
123 | 123 | ||
124 | spin_lock(e->stats_lock); | 124 | spin_lock(e->stats_lock); |
125 | read_lock(&est_lock); | 125 | read_lock(&est_lock); |
@@ -133,10 +133,11 @@ static void est_timer(unsigned long arg) | |||
133 | e->avbps += (brate >> e->ewma_log) - (e->avbps >> e->ewma_log); | 133 | e->avbps += (brate >> e->ewma_log) - (e->avbps >> e->ewma_log); |
134 | e->rate_est->bps = (e->avbps+0xF)>>5; | 134 | e->rate_est->bps = (e->avbps+0xF)>>5; |
135 | 135 | ||
136 | rate = (b.packets - e->last_packets)<<(12 - idx); | 136 | rate = b.packets - e->last_packets; |
137 | rate <<= (7 - idx); | ||
137 | e->last_packets = b.packets; | 138 | e->last_packets = b.packets; |
138 | e->avpps += (rate >> e->ewma_log) - (e->avpps >> e->ewma_log); | 139 | e->avpps += (rate >> e->ewma_log) - (e->avpps >> e->ewma_log); |
139 | e->rate_est->pps = (e->avpps+0x1FF)>>10; | 140 | e->rate_est->pps = (e->avpps + 0xF) >> 5; |
140 | skip: | 141 | skip: |
141 | read_unlock(&est_lock); | 142 | read_unlock(&est_lock); |
142 | spin_unlock(e->stats_lock); | 143 | spin_unlock(e->stats_lock); |