diff options
Diffstat (limited to 'arch/x86/kernel/ptrace.c')
-rw-r--r-- | arch/x86/kernel/ptrace.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index 5e0596b0632e..b629bbe0d9bd 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/hw_breakpoint.h> | 23 | #include <linux/hw_breakpoint.h> |
24 | #include <linux/rcupdate.h> | 24 | #include <linux/rcupdate.h> |
25 | #include <linux/module.h> | 25 | #include <linux/module.h> |
26 | #include <linux/context_tracking.h> | ||
26 | 27 | ||
27 | #include <asm/uaccess.h> | 28 | #include <asm/uaccess.h> |
28 | #include <asm/pgtable.h> | 29 | #include <asm/pgtable.h> |
@@ -1491,7 +1492,7 @@ long syscall_trace_enter(struct pt_regs *regs) | |||
1491 | { | 1492 | { |
1492 | long ret = 0; | 1493 | long ret = 0; |
1493 | 1494 | ||
1494 | rcu_user_exit(); | 1495 | user_exit(); |
1495 | 1496 | ||
1496 | /* | 1497 | /* |
1497 | * If we stepped into a sysenter/syscall insn, it trapped in | 1498 | * If we stepped into a sysenter/syscall insn, it trapped in |
@@ -1541,6 +1542,13 @@ void syscall_trace_leave(struct pt_regs *regs) | |||
1541 | { | 1542 | { |
1542 | bool step; | 1543 | bool step; |
1543 | 1544 | ||
1545 | /* | ||
1546 | * We may come here right after calling schedule_user() | ||
1547 | * or do_notify_resume(), in which case we can be in RCU | ||
1548 | * user mode. | ||
1549 | */ | ||
1550 | user_exit(); | ||
1551 | |||
1544 | audit_syscall_exit(regs); | 1552 | audit_syscall_exit(regs); |
1545 | 1553 | ||
1546 | if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT))) | 1554 | if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT))) |
@@ -1557,5 +1565,5 @@ void syscall_trace_leave(struct pt_regs *regs) | |||
1557 | if (step || test_thread_flag(TIF_SYSCALL_TRACE)) | 1565 | if (step || test_thread_flag(TIF_SYSCALL_TRACE)) |
1558 | tracehook_report_syscall_exit(regs, step); | 1566 | tracehook_report_syscall_exit(regs, step); |
1559 | 1567 | ||
1560 | rcu_user_enter(); | 1568 | user_enter(); |
1561 | } | 1569 | } |