Commit 8a14342683b1e3adcf5f78660a42fcbd95b44a35

Authored by Eric Dumazet
Committed by Linus Torvalds
1 parent 2ecb9e633c

[PATCH] HOTPLUG_CPU: avoid hitting too many cachelines in recalc_bh_state()

Instead of using for_each_cpu(i), we can use for_each_online_cpu(i).

When a CPU goes offline (ie removed from online map), it might have a non
null bh_accounting.nr, so this patch adds a transfer of this counter to an
online CPU counter.

We already have a hotcpu_notifier, (function buffer_cpu_notify()), where we
can do this bh_accounting.

Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

Showing 1 changed file with 4 additions and 1 deletions Side-by-side Diff

... ... @@ -3078,7 +3078,7 @@
3078 3078 if (__get_cpu_var(bh_accounting).ratelimit++ < 4096)
3079 3079 return;
3080 3080 __get_cpu_var(bh_accounting).ratelimit = 0;
3081   - for_each_cpu(i)
  3081 + for_each_online_cpu(i)
3082 3082 tot += per_cpu(bh_accounting, i).nr;
3083 3083 buffer_heads_over_limit = (tot > max_buffer_heads);
3084 3084 }
... ... @@ -3127,6 +3127,9 @@
3127 3127 brelse(b->bhs[i]);
3128 3128 b->bhs[i] = NULL;
3129 3129 }
  3130 + get_cpu_var(bh_accounting).nr += per_cpu(bh_accounting, cpu).nr;
  3131 + per_cpu(bh_accounting, cpu).nr = 0;
  3132 + put_cpu_var(bh_accounting);
3130 3133 }
3131 3134  
3132 3135 static int buffer_cpu_notify(struct notifier_block *self,