projects
/
linux.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
fcec538
)
MIPS: Do not use smp_processor_id() in preemptible code
author
Xingxing Su
<suxingxing@loongson.cn>
Fri, 3 Jul 2020 04:11:58 +0000
(12:11 +0800)
committer
Thomas Bogendoerfer
<tsbogend@alpha.franken.de>
Sun, 5 Jul 2020 09:43:52 +0000
(11:43 +0200)
Use preempt_disable() to fix the following bug under CONFIG_DEBUG_PREEMPT.
[ 21.915305] BUG: using smp_processor_id() in preemptible [
00000000
] code: qemu-system-mip/1056
[ 21.923996] caller is do_ri+0x1d4/0x690
[ 21.927921] CPU: 0 PID: 1056 Comm: qemu-system-mip Not tainted 5.8.0-rc2 #3
[ 21.934913] Stack :
0000000000000001
ffffffff81370000
ffffffff8071cd60
a80f926d5ac95694
[ 21.942984]
a80f926d5ac95694
0000000000000000
98000007f0043c88
ffffffff80f2fe40
[ 21.951054]
0000000000000000
0000000000000000
0000000000000001
0000000000000000
[ 21.959123]
ffffffff802d60cc
98000007f0043dd8
ffffffff81f4b1e8
ffffffff81f60000
[ 21.967192]
ffffffff81f60000
ffffffff80fe0000
ffff000000000000
0000000000000000
[ 21.975261]
fffffffff500cce1
0000000000000001
0000000000000002
0000000000000000
[ 21.983331]
ffffffff80fe1a40
0000000000000006
ffffffff8077f940
0000000000000000
[ 21.991401]
ffffffff81460000
98000007f0040000
98000007f0043c80
000000fffba8cf20
[ 21.999471]
ffffffff8071cd60
0000000000000000
0000000000000000
0000000000000000
[ 22.007541]
0000000000000000
0000000000000000
ffffffff80212ab4
a80f926d5ac95694
[ 22.015610] ...
[ 22.018086] Call Trace:
[ 22.020562] [<
ffffffff80212ab4
>] show_stack+0xa4/0x138
[ 22.025732] [<
ffffffff8071cd60
>] dump_stack+0xf0/0x150
[ 22.030903] [<
ffffffff80c73f5c
>] check_preemption_disabled+0xf4/0x100
[ 22.037375] [<
ffffffff80213b84
>] do_ri+0x1d4/0x690
[ 22.042198] [<
ffffffff8020b828
>] handle_ri_int+0x44/0x5c
[ 24.359386] BUG: using smp_processor_id() in preemptible [
00000000
] code: qemu-system-mip/1072
[ 24.368204] caller is do_ri+0x1a8/0x690
[ 24.372169] CPU: 4 PID: 1072 Comm: qemu-system-mip Not tainted 5.8.0-rc2 #3
[ 24.379170] Stack :
0000000000000001
ffffffff81370000
ffffffff8071cd60
a80f926d5ac95694
[ 24.387246]
a80f926d5ac95694
0000000000000000
98001007ef06bc88
ffffffff80f2fe40
[ 24.395318]
0000000000000000
0000000000000000
0000000000000001
0000000000000000
[ 24.403389]
ffffffff802d60cc
98001007ef06bdd8
ffffffff81f4b818
ffffffff81f60000
[ 24.411461]
ffffffff81f60000
ffffffff80fe0000
ffff000000000000
0000000000000000
[ 24.419533]
fffffffff500cce1
0000000000000001
0000000000000002
0000000000000000
[ 24.427603]
ffffffff80fe0000
0000000000000006
ffffffff8077f940
0000000000000020
[ 24.435673]
ffffffff81460020
98001007ef068000
98001007ef06bc80
000000fffbbbb370
[ 24.443745]
ffffffff8071cd60
0000000000000000
0000000000000000
0000000000000000
[ 24.451816]
0000000000000000
0000000000000000
ffffffff80212ab4
a80f926d5ac95694
[ 24.459887] ...
[ 24.462367] Call Trace:
[ 24.464846] [<
ffffffff80212ab4
>] show_stack+0xa4/0x138
[ 24.470029] [<
ffffffff8071cd60
>] dump_stack+0xf0/0x150
[ 24.475208] [<
ffffffff80c73f5c
>] check_preemption_disabled+0xf4/0x100
[ 24.481682] [<
ffffffff80213b58
>] do_ri+0x1a8/0x690
[ 24.486509] [<
ffffffff8020b828
>] handle_ri_int+0x44/0x5c
Signed-off-by: Xingxing Su <suxingxing@loongson.cn>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
arch/mips/kernel/traps.c
patch
|
blob
|
history
diff --git
a/arch/mips/kernel/traps.c
b/arch/mips/kernel/traps.c
index 1234ea21dd8ff984ddcb52073c233352286c907c..f655af68176c85aec5fbb47b9eb2f237dc6d4ca4 100644
(file)
--- a/
arch/mips/kernel/traps.c
+++ b/
arch/mips/kernel/traps.c
@@
-723,12
+723,14
@@
static int simulate_loongson3_cpucfg(struct pt_regs *regs,
perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, 1, regs, 0);
/* Do not emulate on unsupported core models. */
- if (!loongson3_cpucfg_emulation_enabled(¤t_cpu_data))
+ preempt_disable();
+ if (!loongson3_cpucfg_emulation_enabled(¤t_cpu_data)) {
+ preempt_enable();
return -1;
-
+ }
regs->regs[rd] = loongson3_cpucfg_read_synthesized(
¤t_cpu_data, sel);
-
+ preempt_enable();
return 0;
}