Commit 8a14342683b1e3adcf5f78660a42fcbd95b44a35
Committed by
Linus Torvalds
1 parent
2ecb9e633c
Exists in
master
and in
7 other branches
[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
fs/buffer.c
... | ... | @@ -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, |