diff options
Diffstat (limited to 'kernel/debug/debug_core.c')
| -rw-r--r-- | kernel/debug/debug_core.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/kernel/debug/debug_core.c b/kernel/debug/debug_core.c index 334b3980ffc1..2956c8da1605 100644 --- a/kernel/debug/debug_core.c +++ b/kernel/debug/debug_core.c | |||
| @@ -49,6 +49,7 @@ | |||
| 49 | #include <linux/pid.h> | 49 | #include <linux/pid.h> |
| 50 | #include <linux/smp.h> | 50 | #include <linux/smp.h> |
| 51 | #include <linux/mm.h> | 51 | #include <linux/mm.h> |
| 52 | #include <linux/vmacache.h> | ||
| 52 | #include <linux/rcupdate.h> | 53 | #include <linux/rcupdate.h> |
| 53 | 54 | ||
| 54 | #include <asm/cacheflush.h> | 55 | #include <asm/cacheflush.h> |
| @@ -224,10 +225,17 @@ static void kgdb_flush_swbreak_addr(unsigned long addr) | |||
| 224 | if (!CACHE_FLUSH_IS_SAFE) | 225 | if (!CACHE_FLUSH_IS_SAFE) |
| 225 | return; | 226 | return; |
| 226 | 227 | ||
| 227 | if (current->mm && current->mm->mmap_cache) { | 228 | if (current->mm) { |
| 228 | flush_cache_range(current->mm->mmap_cache, | 229 | int i; |
| 229 | addr, addr + BREAK_INSTR_SIZE); | 230 | |
| 231 | for (i = 0; i < VMACACHE_SIZE; i++) { | ||
| 232 | if (!current->vmacache[i]) | ||
| 233 | continue; | ||
| 234 | flush_cache_range(current->vmacache[i], | ||
| 235 | addr, addr + BREAK_INSTR_SIZE); | ||
| 236 | } | ||
| 230 | } | 237 | } |
| 238 | |||
| 231 | /* Force flush instruction cache if it was outside the mm */ | 239 | /* Force flush instruction cache if it was outside the mm */ |
| 232 | flush_icache_range(addr, addr + BREAK_INSTR_SIZE); | 240 | flush_icache_range(addr, addr + BREAK_INSTR_SIZE); |
| 233 | } | 241 | } |
| @@ -1035,7 +1043,7 @@ int dbg_io_get_char(void) | |||
| 1035 | * otherwise as a quick means to stop program execution and "break" into | 1043 | * otherwise as a quick means to stop program execution and "break" into |
| 1036 | * the debugger. | 1044 | * the debugger. |
| 1037 | */ | 1045 | */ |
| 1038 | void kgdb_breakpoint(void) | 1046 | noinline void kgdb_breakpoint(void) |
| 1039 | { | 1047 | { |
| 1040 | atomic_inc(&kgdb_setting_breakpoint); | 1048 | atomic_inc(&kgdb_setting_breakpoint); |
| 1041 | wmb(); /* Sync point before breakpoint */ | 1049 | wmb(); /* Sync point before breakpoint */ |
