[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>
This commit is contained in:
parent
2ecb9e633c
commit
8a14342683
|
@ -3078,7 +3078,7 @@ static void recalc_bh_state(void)
|
|||
if (__get_cpu_var(bh_accounting).ratelimit++ < 4096)
|
||||
return;
|
||||
__get_cpu_var(bh_accounting).ratelimit = 0;
|
||||
for_each_cpu(i)
|
||||
for_each_online_cpu(i)
|
||||
tot += per_cpu(bh_accounting, i).nr;
|
||||
buffer_heads_over_limit = (tot > max_buffer_heads);
|
||||
}
|
||||
|
@ -3127,6 +3127,9 @@ static void buffer_exit_cpu(int cpu)
|
|||
brelse(b->bhs[i]);
|
||||
b->bhs[i] = NULL;
|
||||
}
|
||||
get_cpu_var(bh_accounting).nr += per_cpu(bh_accounting, cpu).nr;
|
||||
per_cpu(bh_accounting, cpu).nr = 0;
|
||||
put_cpu_var(bh_accounting);
|
||||
}
|
||||
|
||||
static int buffer_cpu_notify(struct notifier_block *self,
|
||||
|
|
Loading…
Reference in New Issue