diff options
author | Paul Mundt <lethal@linux-sh.org> | 2010-01-15 00:21:37 -0500 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2010-01-15 00:21:37 -0500 |
commit | a6198a238baceae9d4e0ce3915f6d239c89b5c08 (patch) | |
tree | 512b77781c1e4af78873f58a9bea8733aa06c117 /arch/sh/mm | |
parent | a09d2831b3457a92a58d67bddfed370516acfe28 (diff) |
sh: Guard against early IPIs in flush_cache_all().
flush_cache_all() gets called in to when we do some early ioremapping.
Unfortunately on SDK7786 the interrupt controller itself requires
ioremapping, leading to a bit of a chicken and egg scenario. For now,
don't bother with IPI crosscalls if there aren't any other CPUs online.
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/mm')
-rw-r--r-- | arch/sh/mm/cache.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/arch/sh/mm/cache.c b/arch/sh/mm/cache.c index b8607fa7ae12..0f4095d7ac8b 100644 --- a/arch/sh/mm/cache.c +++ b/arch/sh/mm/cache.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * arch/sh/mm/cache.c | 2 | * arch/sh/mm/cache.c |
3 | * | 3 | * |
4 | * Copyright (C) 1999, 2000, 2002 Niibe Yutaka | 4 | * Copyright (C) 1999, 2000, 2002 Niibe Yutaka |
5 | * Copyright (C) 2002 - 2009 Paul Mundt | 5 | * Copyright (C) 2002 - 2010 Paul Mundt |
6 | * | 6 | * |
7 | * Released under the terms of the GNU GPL v2.0. | 7 | * Released under the terms of the GNU GPL v2.0. |
8 | */ | 8 | */ |
@@ -41,8 +41,17 @@ static inline void cacheop_on_each_cpu(void (*func) (void *info), void *info, | |||
41 | int wait) | 41 | int wait) |
42 | { | 42 | { |
43 | preempt_disable(); | 43 | preempt_disable(); |
44 | smp_call_function(func, info, wait); | 44 | |
45 | /* | ||
46 | * It's possible that this gets called early on when IRQs are | ||
47 | * still disabled due to ioremapping by the boot CPU, so don't | ||
48 | * even attempt IPIs unless there are other CPUs online. | ||
49 | */ | ||
50 | if (num_online_cpus() > 1) | ||
51 | smp_call_function(func, info, wait); | ||
52 | |||
45 | func(info); | 53 | func(info); |
54 | |||
46 | preempt_enable(); | 55 | preempt_enable(); |
47 | } | 56 | } |
48 | 57 | ||