From 9a3bb8b74b8b99bb36560f97ccac609eb9117440 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 13 May 2014 13:18:01 +0200 Subject: [PATCH] 3.10-stable patches added patches: arc-preempt-ensure-return-to-kernel-mode-is-irq-safe.patch --- ...re-return-to-kernel-mode-is-irq-safe.patch | 54 +++++++++++++++++++ queue-3.10/series | 1 + 2 files changed, 55 insertions(+) create mode 100644 queue-3.10/arc-preempt-ensure-return-to-kernel-mode-is-irq-safe.patch diff --git a/queue-3.10/arc-preempt-ensure-return-to-kernel-mode-is-irq-safe.patch b/queue-3.10/arc-preempt-ensure-return-to-kernel-mode-is-irq-safe.patch new file mode 100644 index 00000000000..126d3f2cffa --- /dev/null +++ b/queue-3.10/arc-preempt-ensure-return-to-kernel-mode-is-irq-safe.patch @@ -0,0 +1,54 @@ +From 8aa9e85adac609588eeec356e5a85059b3b819ba Mon Sep 17 00:00:00 2001 +From: Vineet Gupta +Date: Wed, 30 Apr 2014 15:26:45 +0530 +Subject: ARC: !PREEMPT: Ensure Return to kernel mode is IRQ safe + +From: Vineet Gupta + +commit 8aa9e85adac609588eeec356e5a85059b3b819ba upstream. + +There was a very small race window where resume to kernel mode from a +Exception Path (or pure kernel mode which is true for most of ARC +exceptions anyways), was not disabling interrupts in restore_regs, +clobbering the exception regs + +Anton found the culprit call flow (after many sleepless nights) + +| 1. we got a Trap from user land +| 2. started to service it. +| 3. While doing some stuff on user-land memory (I think it is padzero()), +| we got a DataTlbMiss +| 4. On return from it we are taking "resume_kernel_mode" path +| 5. NEED_RESHED is not set, so we go to "return from exception" path in +| restore regs. +| 6. there seems to be IRQ happening + +Signed-off-by: Vineet Gupta +Cc: Anton Kolesov +Cc: Francois Bedard +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + arch/arc/kernel/entry.S | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +--- a/arch/arc/kernel/entry.S ++++ b/arch/arc/kernel/entry.S +@@ -651,11 +651,13 @@ resume_user_mode_begin: + + resume_kernel_mode: + +-#ifdef CONFIG_PREEMPT +- +- ; This is a must for preempt_schedule_irq() ++ ; Disable Interrupts from this point on ++ ; CONFIG_PREEMPT: This is a must for preempt_schedule_irq() ++ ; !CONFIG_PREEMPT: To ensure restore_regs is intr safe + IRQ_DISABLE r9 + ++#ifdef CONFIG_PREEMPT ++ + ; Can't preempt if preemption disabled + GET_CURR_THR_INFO_FROM_SP r10 + ld r8, [r10, THREAD_INFO_PREEMPT_COUNT] diff --git a/queue-3.10/series b/queue-3.10/series index 3c3619dcf13..f4efeae3a38 100644 --- a/queue-3.10/series +++ b/queue-3.10/series @@ -46,3 +46,4 @@ lockd-ensure-we-tear-down-any-live-sockets-when-socket-creation-fails-during-loc input-synaptics-add-min-max-quirk-for-thinkpad-t431s-l440-l540-s1-yoga-and-x1.patch input-synaptics-add-min-max-quirk-for-thinkpad-edge-e431.patch drm-cirrus-add-power-management-support.patch +arc-preempt-ensure-return-to-kernel-mode-is-irq-safe.patch -- 2.47.3