aboutsummaryrefslogtreecommitdiffstats
path: root/arch/tile/kernel/process.c
diff options
context:
space:
mode:
authorChris Metcalf <cmetcalf@ezchip.com>2015-03-23 14:23:58 -0400
committerChris Metcalf <cmetcalf@ezchip.com>2015-04-17 14:01:10 -0400
commit49e4e15619cd7cd9fc275d460fae2a95c1337fcc (patch)
tree700e24bb8f72a7662e7d4ae26d847e908d08de92 /arch/tile/kernel/process.c
parentb340c656af6317e28b466996a72cca019d97b42d (diff)
tile: support CONTEXT_TRACKING and thus NOHZ_FULL
Add the TIF_NOHZ flag appropriately. Add call to user_exit() on entry to do_work_pending() and on entry to syscalls via do_syscall_trace_enter(), and also the top of do_syscall_trace_exit() just because it's done in x86. Add call to user_enter() at the bottom of do_work_pending() once we have no more work to do before returning to userspace. Wrap all the trap code in exception_enter() / exception_exit(). Signed-off-by: Chris Metcalf <cmetcalf@ezchip.com> Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
Diffstat (limited to 'arch/tile/kernel/process.c')
-rw-r--r--arch/tile/kernel/process.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/arch/tile/kernel/process.c b/arch/tile/kernel/process.c
index 48e5773dd0b7..b403c2e3e263 100644
--- a/arch/tile/kernel/process.c
+++ b/arch/tile/kernel/process.c
@@ -27,6 +27,7 @@
27#include <linux/kernel.h> 27#include <linux/kernel.h>
28#include <linux/tracehook.h> 28#include <linux/tracehook.h>
29#include <linux/signal.h> 29#include <linux/signal.h>
30#include <linux/context_tracking.h>
30#include <asm/stack.h> 31#include <asm/stack.h>
31#include <asm/switch_to.h> 32#include <asm/switch_to.h>
32#include <asm/homecache.h> 33#include <asm/homecache.h>
@@ -474,6 +475,8 @@ int do_work_pending(struct pt_regs *regs, u32 thread_info_flags)
474 if (!user_mode(regs)) 475 if (!user_mode(regs))
475 return 0; 476 return 0;
476 477
478 user_exit();
479
477 /* Enable interrupts; they are disabled again on return to caller. */ 480 /* Enable interrupts; they are disabled again on return to caller. */
478 local_irq_enable(); 481 local_irq_enable();
479 482
@@ -496,11 +499,12 @@ int do_work_pending(struct pt_regs *regs, u32 thread_info_flags)
496 tracehook_notify_resume(regs); 499 tracehook_notify_resume(regs);
497 return 1; 500 return 1;
498 } 501 }
499 if (thread_info_flags & _TIF_SINGLESTEP) { 502 if (thread_info_flags & _TIF_SINGLESTEP)
500 single_step_once(regs); 503 single_step_once(regs);
501 return 0; 504
502 } 505 user_enter();
503 panic("work_pending: bad flags %#x\n", thread_info_flags); 506
507 return 0;
504} 508}
505 509
506unsigned long get_wchan(struct task_struct *p) 510unsigned long get_wchan(struct task_struct *p)