From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: linux-kernel@vger.kernel.org
Cc: mingo@elte.hu, laijs@cn.fujitsu.com, dipankar@in.ibm.com,
akpm@linux-foundation.org, mathieu.desnoyers@polymtl.ca,
josh@joshtriplett.org, niv@us.ibm.com, tglx@linutronix.de,
peterz@infradead.org, rostedt@goodmis.org,
Valdis.Kletnieks@vt.edu, dhowells@redhat.com,
eric.dumazet@gmail.com, darren@dvhart.com, fweisbec@gmail.com,
sbw@mit.edu, patches@linaro.org,
Alessio Igor Bogani <abogani@kernel.org>,
Avi Kivity <avi@redhat.com>, Chris Metcalf <cmetcalf@tilera.com>,
Christoph Lameter <cl@linux.com>,
Geoff Levand <geoff@infradead.org>,
Gilad Ben Yossef <gilad@benyossef.com>,
Hakan Akkan <hakanakkan@gmail.com>,
"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@kernel.org>,
Kevin Hilman <khilman@ti.com>,
Max Krasnyansky <maxk@qualcomm.com>,
Stephen Hemminger <shemminger@vyatta.com>,
Sven-Thorsten Dietrich <thebigcorporation@gmail.com>,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Subject: [PATCH tip/core/rcu 09/26] x86: Exception hooks for userspace RCU extended QS
Date: Thu, 30 Aug 2012 14:05:26 -0700 [thread overview]
Message-ID: <1346360743-3628-9-git-send-email-paulmck@linux.vnet.ibm.com> (raw)
In-Reply-To: <1346360743-3628-1-git-send-email-paulmck@linux.vnet.ibm.com>
From: Frederic Weisbecker <fweisbec@gmail.com>
Add necessary hooks to x86 exception for userspace
RCU extended quiescent state support.
This includes traps, page fault, debug exceptions, etc...
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Alessio Igor Bogani <abogani@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Avi Kivity <avi@redhat.com>
Cc: Chris Metcalf <cmetcalf@tilera.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: Geoff Levand <geoff@infradead.org>
Cc: Gilad Ben Yossef <gilad@benyossef.com>
Cc: Hakan Akkan <hakanakkan@gmail.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Josh Triplett <josh@joshtriplett.org>
Cc: Kevin Hilman <khilman@ti.com>
Cc: Max Krasnyansky <maxk@qualcomm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephen Hemminger <shemminger@vyatta.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Sven-Thorsten Dietrich <thebigcorporation@gmail.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
---
arch/x86/include/asm/rcu.h | 20 ++++++++++++++++++++
arch/x86/kernel/traps.c | 30 ++++++++++++++++++++++--------
arch/x86/mm/fault.c | 13 +++++++++++--
3 files changed, 53 insertions(+), 10 deletions(-)
create mode 100644 arch/x86/include/asm/rcu.h
diff --git a/arch/x86/include/asm/rcu.h b/arch/x86/include/asm/rcu.h
new file mode 100644
index 0000000..439815b
--- /dev/null
+++ b/arch/x86/include/asm/rcu.h
@@ -0,0 +1,20 @@
+#ifndef _ASM_X86_RCU_H
+#define _ASM_X86_RCU_H
+
+#include <linux/rcupdate.h>
+#include <asm/ptrace.h>
+
+static inline void exception_enter(struct pt_regs *regs)
+{
+ rcu_user_exit();
+}
+
+static inline void exception_exit(struct pt_regs *regs)
+{
+#ifdef CONFIG_RCU_USER_QS
+ if (user_mode(regs))
+ rcu_user_enter();
+#endif
+}
+
+#endif
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index b481341..ab82cbd 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -55,6 +55,7 @@
#include <asm/i387.h>
#include <asm/fpu-internal.h>
#include <asm/mce.h>
+#include <asm/rcu.h>
#include <asm/mach_traps.h>
@@ -180,11 +181,15 @@ vm86_trap:
#define DO_ERROR(trapnr, signr, str, name) \
dotraplinkage void do_##name(struct pt_regs *regs, long error_code) \
{ \
- if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
- == NOTIFY_STOP) \
+ exception_enter(regs); \
+ if (notify_die(DIE_TRAP, str, regs, error_code, \
+ trapnr, signr) == NOTIFY_STOP) { \
+ exception_exit(regs); \
return; \
+ } \
conditional_sti(regs); \
do_trap(trapnr, signr, str, regs, error_code, NULL); \
+ exception_exit(regs); \
}
#define DO_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \
@@ -195,11 +200,15 @@ dotraplinkage void do_##name(struct pt_regs *regs, long error_code) \
info.si_errno = 0; \
info.si_code = sicode; \
info.si_addr = (void __user *)siaddr; \
- if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
- == NOTIFY_STOP) \
+ exception_enter(regs); \
+ if (notify_die(DIE_TRAP, str, regs, error_code, \
+ trapnr, signr) == NOTIFY_STOP) { \
+ exception_exit(regs); \
return; \
+ } \
conditional_sti(regs); \
do_trap(trapnr, signr, str, regs, error_code, &info); \
+ exception_exit(regs); \
}
DO_ERROR_INFO(X86_TRAP_DE, SIGFPE, "divide error", divide_error, FPE_INTDIV,
@@ -312,6 +321,7 @@ dotraplinkage void __kprobes notrace do_int3(struct pt_regs *regs, long error_co
ftrace_int3_handler(regs))
return;
#endif
+ exception_enter(regs);
#ifdef CONFIG_KGDB_LOW_LEVEL_TRAP
if (kgdb_ll_trap(DIE_INT3, "int3", regs, error_code, X86_TRAP_BP,
SIGTRAP) == NOTIFY_STOP)
@@ -331,6 +341,7 @@ dotraplinkage void __kprobes notrace do_int3(struct pt_regs *regs, long error_co
do_trap(X86_TRAP_BP, SIGTRAP, "int3", regs, error_code, NULL);
preempt_conditional_cli(regs);
debug_stack_usage_dec();
+ exception_exit(regs);
}
#ifdef CONFIG_X86_64
@@ -391,6 +402,8 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code)
unsigned long dr6;
int si_code;
+ exception_enter(regs);
+
get_debugreg(dr6, 6);
/* Filter out all the reserved bits which are preset to 1 */
@@ -406,7 +419,7 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code)
/* Catch kmemcheck conditions first of all! */
if ((dr6 & DR_STEP) && kmemcheck_trap(regs))
- return;
+ goto exit;
/* DR6 may or may not be cleared by the CPU */
set_debugreg(0, 6);
@@ -421,7 +434,7 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code)
if (notify_die(DIE_DEBUG, "debug", regs, PTR_ERR(&dr6), error_code,
SIGTRAP) == NOTIFY_STOP)
- return;
+ goto exit;
/*
* Let others (NMI) know that the debug stack is in use
@@ -437,7 +450,7 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code)
X86_TRAP_DB);
preempt_conditional_cli(regs);
debug_stack_usage_dec();
- return;
+ goto exit;
}
/*
@@ -458,7 +471,8 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code)
preempt_conditional_cli(regs);
debug_stack_usage_dec();
- return;
+exit:
+ exception_exit(regs);
}
/*
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
index 76dcd9d..7dde46d 100644
--- a/arch/x86/mm/fault.c
+++ b/arch/x86/mm/fault.c
@@ -18,6 +18,7 @@
#include <asm/pgalloc.h> /* pgd_*(), ... */
#include <asm/kmemcheck.h> /* kmemcheck_*(), ... */
#include <asm/fixmap.h> /* VSYSCALL_START */
+#include <asm/rcu.h> /* exception_enter(), ... */
/*
* Page fault error code bits:
@@ -1000,8 +1001,8 @@ static int fault_in_kernel_space(unsigned long address)
* and the problem, and then passes it off to one of the appropriate
* routines.
*/
-dotraplinkage void __kprobes
-do_page_fault(struct pt_regs *regs, unsigned long error_code)
+static void __kprobes
+__do_page_fault(struct pt_regs *regs, unsigned long error_code)
{
struct vm_area_struct *vma;
struct task_struct *tsk;
@@ -1209,3 +1210,11 @@ good_area:
up_read(&mm->mmap_sem);
}
+
+dotraplinkage void __kprobes
+do_page_fault(struct pt_regs *regs, unsigned long error_code)
+{
+ exception_enter(regs);
+ __do_page_fault(regs, error_code);
+ exception_exit(regs);
+}
--
1.7.8
next prev parent reply other threads:[~2012-08-30 21:15 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-30 21:05 [PATCH tip/core/rcu 0/26] idle-related changes Paul E. McKenney
2012-08-30 21:05 ` [PATCH tip/core/rcu 01/26] rcu: New rcu_user_enter() and rcu_user_exit() APIs Paul E. McKenney
2012-08-30 21:05 ` [PATCH tip/core/rcu 02/26] rcu: New rcu_user_enter_irq() and rcu_user_exit_irq() APIs Paul E. McKenney
2012-08-31 19:13 ` Josh Triplett
2012-08-31 19:54 ` Frederic Weisbecker
2012-08-31 21:38 ` Josh Triplett
2012-08-30 21:05 ` [PATCH tip/core/rcu 03/26] rcu: Make RCU_FAST_NO_HZ handle adaptive ticks Paul E. McKenney
2012-08-31 23:40 ` Josh Triplett
2012-08-30 21:05 ` [PATCH tip/core/rcu 04/26] rcu: Settle config for userspace extended quiescent state Paul E. McKenney
2012-08-31 23:44 ` Josh Triplett
2012-09-05 0:34 ` Paul E. McKenney
2012-09-05 0:46 ` Josh Triplett
2012-09-10 21:35 ` Frederic Weisbecker
2012-08-30 21:05 ` [PATCH tip/core/rcu 05/26] rcu: Allow rcu_user_enter()/exit() to nest Paul E. McKenney
2012-08-31 23:45 ` Josh Triplett
2012-08-30 21:05 ` [PATCH tip/core/rcu 06/26] rcu: Ignore userspace extended quiescent state by default Paul E. McKenney
2012-08-31 23:46 ` Josh Triplett
2012-08-30 21:05 ` [PATCH tip/core/rcu 07/26] rcu: Switch task's syscall hooks on context switch Paul E. McKenney
2012-08-31 23:48 ` Josh Triplett
2012-08-30 21:05 ` [PATCH tip/core/rcu 08/26] x86: Syscall hooks for userspace RCU extended QS Paul E. McKenney
2012-08-31 23:59 ` Josh Triplett
2012-09-10 21:30 ` Frederic Weisbecker
2012-08-30 21:05 ` Paul E. McKenney [this message]
2012-08-31 23:51 ` [PATCH tip/core/rcu 09/26] x86: Exception " Josh Triplett
2012-08-30 21:05 ` [PATCH tip/core/rcu 10/26] rcu: Exit RCU extended QS on kernel preemption after irq/exception Paul E. McKenney
2012-08-31 23:51 ` Josh Triplett
2012-09-06 16:52 ` Peter Zijlstra
2012-09-10 20:31 ` Frederic Weisbecker
2012-08-30 21:05 ` [PATCH tip/core/rcu 11/26] rcu: Exit RCU extended QS on user preemption Paul E. McKenney
2012-08-31 23:52 ` Josh Triplett
2012-09-06 17:02 ` Peter Zijlstra
2012-09-06 17:13 ` Peter Zijlstra
2012-09-10 20:26 ` Frederic Weisbecker
2012-09-12 9:33 ` Peter Zijlstra
2012-09-12 12:06 ` Frederic Weisbecker
2012-09-12 12:41 ` Peter Zijlstra
2012-09-12 12:52 ` Peter Zijlstra
2012-09-12 13:54 ` Frederic Weisbecker
2012-09-12 14:09 ` Peter Zijlstra
2012-09-12 13:52 ` Frederic Weisbecker
2012-09-12 15:21 ` Paul E. McKenney
2012-08-30 21:05 ` [PATCH tip/core/rcu 12/26] x86: Use the new schedule_user API on userspace preemption Paul E. McKenney
2012-08-31 23:53 ` Josh Triplett
2012-08-30 21:05 ` [PATCH tip/core/rcu 13/26] x86: Exit RCU extended QS on notify resume Paul E. McKenney
2012-08-31 23:54 ` Josh Triplett
2012-08-30 21:05 ` [PATCH tip/core/rcu 14/26] rcu: Userspace RCU extended QS selftest Paul E. McKenney
2012-08-31 23:54 ` Josh Triplett
2012-08-30 21:05 ` [PATCH tip/core/rcu 15/26] alpha: Fix preemption handling in idle loop Paul E. McKenney
2012-08-31 23:55 ` Josh Triplett
2012-08-30 21:05 ` [PATCH tip/core/rcu 16/26] alpha: Add missing RCU idle APIs on " Paul E. McKenney
2012-09-01 0:00 ` Josh Triplett
2012-08-30 21:05 ` [PATCH tip/core/rcu 17/26] cris: " Paul E. McKenney
2012-09-01 0:01 ` Josh Triplett
2012-08-30 21:05 ` [PATCH tip/core/rcu 18/26] frv: " Paul E. McKenney
2012-09-01 0:01 ` Josh Triplett
2012-08-30 21:05 ` [PATCH tip/core/rcu 19/26] h8300: " Paul E. McKenney
2012-09-01 0:02 ` Josh Triplett
2012-08-30 21:05 ` [PATCH tip/core/rcu 20/26] m32r: " Paul E. McKenney
2012-09-01 0:02 ` Josh Triplett
2012-08-30 21:05 ` [PATCH tip/core/rcu 21/26] m68k: " Paul E. McKenney
2012-09-01 0:02 ` Josh Triplett
2012-08-30 21:05 ` [PATCH tip/core/rcu 22/26] mn10300: " Paul E. McKenney
2012-09-01 0:03 ` Josh Triplett
2012-08-30 21:05 ` [PATCH tip/core/rcu 23/26] parisc: " Paul E. McKenney
2012-09-01 0:03 ` Josh Triplett
2012-08-30 21:05 ` [PATCH tip/core/rcu 24/26] score: " Paul E. McKenney
2012-09-01 0:04 ` Josh Triplett
2012-08-30 21:05 ` [PATCH tip/core/rcu 25/26] xtensa: " Paul E. McKenney
2012-09-01 0:05 ` Josh Triplett
2012-08-30 21:05 ` [PATCH tip/core/rcu 26/26] ia64: " Paul E. McKenney
2012-09-01 0:05 ` Josh Triplett
2012-08-31 19:07 ` [PATCH tip/core/rcu 01/26] rcu: New rcu_user_enter() and rcu_user_exit() APIs Josh Triplett
2012-09-05 1:04 ` Paul E. McKenney
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1346360743-3628-9-git-send-email-paulmck@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=Valdis.Kletnieks@vt.edu \
--cc=abogani@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=avi@redhat.com \
--cc=cl@linux.com \
--cc=cmetcalf@tilera.com \
--cc=darren@dvhart.com \
--cc=dhowells@redhat.com \
--cc=dipankar@in.ibm.com \
--cc=eric.dumazet@gmail.com \
--cc=fweisbec@gmail.com \
--cc=geoff@infradead.org \
--cc=gilad@benyossef.com \
--cc=hakanakkan@gmail.com \
--cc=hpa@zytor.com \
--cc=josh@joshtriplett.org \
--cc=khilman@ti.com \
--cc=laijs@cn.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@polymtl.ca \
--cc=maxk@qualcomm.com \
--cc=mingo@elte.hu \
--cc=mingo@kernel.org \
--cc=niv@us.ibm.com \
--cc=patches@linaro.org \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=sbw@mit.edu \
--cc=shemminger@vyatta.com \
--cc=tglx@linutronix.de \
--cc=thebigcorporation@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®