From e866a628054d3b665b272206f7b09131dd3aa08f Mon Sep 17 00:00:00 2001 From: Aurelien Jarno Date: Wed, 30 Jul 2014 07:34:38 +0000 Subject: [PATCH] [mips*] Avoid smp_processor_id() in preemptible code. svn path=/dists/sid/linux/; revision=21650 --- debian/changelog | 1 + ...d-smp_processor_id-in-preemptible-co.patch | 86 +++++++++++++++++++ debian/patches/series | 1 + 3 files changed, 88 insertions(+) create mode 100644 debian/patches/bugfix/mips/MIPS-ptrace-Avoid-smp_processor_id-in-preemptible-co.patch diff --git a/debian/changelog b/debian/changelog index 4d5aa5968..45ebd07c3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -6,6 +6,7 @@ linux (3.14.13-3) UNRELEASED; urgency=medium * Update French debconf template translations (David Prévot) (Closes: #756134). * Rewrite postinst to not require File::stat perl module (Closes: #756207). + * [mips*] Avoid smp_processor_id() in preemptible code. [ Ben Hutchings ] * [amd64] Reject x32 executables if x32 ABI not supported diff --git a/debian/patches/bugfix/mips/MIPS-ptrace-Avoid-smp_processor_id-in-preemptible-co.patch b/debian/patches/bugfix/mips/MIPS-ptrace-Avoid-smp_processor_id-in-preemptible-co.patch new file mode 100644 index 000000000..c64a90ef4 --- /dev/null +++ b/debian/patches/bugfix/mips/MIPS-ptrace-Avoid-smp_processor_id-in-preemptible-co.patch @@ -0,0 +1,86 @@ +From: Alex Smith +Date: Thu, 1 May 2014 12:51:19 +0100 +Subject: MIPS: ptrace: Avoid smp_processor_id() in preemptible code +Origin: https://git.kernel.org/linus/57c7ea513f0e4b033ba602550992e2ca0e6b8d2c + +ptrace_{get,set}_watch_regs access current_cpu_data to get the watch +register count/masks, which calls smp_processor_id(). However they are +run in preemptible context and therefore trigger warnings like so: + +[ 6340.092000] BUG: using smp_processor_id() in preemptible [00000000] code: gdb/367 +[ 6340.092000] caller is ptrace_get_watch_regs+0x44/0x220 + +Since the watch register count/masks should be the same across all +CPUs, use boot_cpu_data instead. Note that this may need to change in +future should a heterogenous system be supported where the count/masks +are not the same across all CPUs (the current code is also incorrect +for this scenario - current_cpu_data here would not necessarily be +correct for the CPU that the target task will execute on). + +Signed-off-by: Alex Smith +Reviewed-by: Paul Burton +Cc: linux-mips@linux-mips.org +Patchwork: https://patchwork.linux-mips.org/patch/6879/ +Signed-off-by: Ralf Baechle +--- + arch/mips/kernel/ptrace.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/arch/mips/kernel/ptrace.c b/arch/mips/kernel/ptrace.c +index 71f85f4..f639ccd 100644 +--- a/arch/mips/kernel/ptrace.c ++++ b/arch/mips/kernel/ptrace.c +@@ -163,7 +163,7 @@ int ptrace_get_watch_regs(struct task_struct *child, + enum pt_watch_style style; + int i; + +- if (!cpu_has_watch || current_cpu_data.watch_reg_use_cnt == 0) ++ if (!cpu_has_watch || boot_cpu_data.watch_reg_use_cnt == 0) + return -EIO; + if (!access_ok(VERIFY_WRITE, addr, sizeof(struct pt_watch_regs))) + return -EIO; +@@ -177,14 +177,14 @@ int ptrace_get_watch_regs(struct task_struct *child, + #endif + + __put_user(style, &addr->style); +- __put_user(current_cpu_data.watch_reg_use_cnt, ++ __put_user(boot_cpu_data.watch_reg_use_cnt, + &addr->WATCH_STYLE.num_valid); +- for (i = 0; i < current_cpu_data.watch_reg_use_cnt; i++) { ++ for (i = 0; i < boot_cpu_data.watch_reg_use_cnt; i++) { + __put_user(child->thread.watch.mips3264.watchlo[i], + &addr->WATCH_STYLE.watchlo[i]); + __put_user(child->thread.watch.mips3264.watchhi[i] & 0xfff, + &addr->WATCH_STYLE.watchhi[i]); +- __put_user(current_cpu_data.watch_reg_masks[i], ++ __put_user(boot_cpu_data.watch_reg_masks[i], + &addr->WATCH_STYLE.watch_masks[i]); + } + for (; i < 8; i++) { +@@ -204,12 +204,12 @@ int ptrace_set_watch_regs(struct task_struct *child, + unsigned long lt[NUM_WATCH_REGS]; + u16 ht[NUM_WATCH_REGS]; + +- if (!cpu_has_watch || current_cpu_data.watch_reg_use_cnt == 0) ++ if (!cpu_has_watch || boot_cpu_data.watch_reg_use_cnt == 0) + return -EIO; + if (!access_ok(VERIFY_READ, addr, sizeof(struct pt_watch_regs))) + return -EIO; + /* Check the values. */ +- for (i = 0; i < current_cpu_data.watch_reg_use_cnt; i++) { ++ for (i = 0; i < boot_cpu_data.watch_reg_use_cnt; i++) { + __get_user(lt[i], &addr->WATCH_STYLE.watchlo[i]); + #ifdef CONFIG_32BIT + if (lt[i] & __UA_LIMIT) +@@ -228,7 +228,7 @@ int ptrace_set_watch_regs(struct task_struct *child, + return -EINVAL; + } + /* Install them. */ +- for (i = 0; i < current_cpu_data.watch_reg_use_cnt; i++) { ++ for (i = 0; i < boot_cpu_data.watch_reg_use_cnt; i++) { + if (lt[i] & 7) + watch_active = 1; + child->thread.watch.mips3264.watchlo[i] = lt[i]; +-- +2.0.0 + diff --git a/debian/patches/series b/debian/patches/series index 2851d5d44..709e5ef6b 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -70,6 +70,7 @@ bugfix/all/kbuild-use-nostdinc-in-compile-tests.patch bugfix/all/disable-some-marvell-phys.patch bugfix/all/bluetooth-allocate-static-minor-for-vhci.patch bugfix/s390/s390-ptrace-fix-PSW-mask-check.patch +bugfix/mips/MIPS-ptrace-Avoid-smp_processor_id-in-preemptible-co.patch # Miscellaneous features features/all/x86-memtest-WARN-if-bad-RAM-found.patch