diff options
| author | Chris Metcalf <cmetcalf@ezchip.com> | 2015-03-23 14:23:58 -0400 | 
|---|---|---|
| committer | Chris Metcalf <cmetcalf@ezchip.com> | 2015-04-17 14:01:10 -0400 | 
| commit | 49e4e15619cd7cd9fc275d460fae2a95c1337fcc (patch) | |
| tree | 700e24bb8f72a7662e7d4ae26d847e908d08de92 /arch/tile/mm | |
| parent | b340c656af6317e28b466996a72cca019d97b42d (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/mm')
| -rw-r--r-- | arch/tile/mm/fault.c | 10 | 
1 files changed, 7 insertions, 3 deletions
| diff --git a/arch/tile/mm/fault.c b/arch/tile/mm/fault.c index 0f61a73534e6..e83cc999da02 100644 --- a/arch/tile/mm/fault.c +++ b/arch/tile/mm/fault.c @@ -35,6 +35,7 @@  #include <linux/syscalls.h>  #include <linux/uaccess.h>  #include <linux/kdebug.h> +#include <linux/context_tracking.h>  #include <asm/pgalloc.h>  #include <asm/sections.h> @@ -702,6 +703,7 @@ void do_page_fault(struct pt_regs *regs, int fault_num,  		   unsigned long address, unsigned long write)  {  	int is_page_fault; +	enum ctx_state prev_state = exception_enter();  #ifdef CONFIG_KPROBES  	/* @@ -711,7 +713,7 @@ void do_page_fault(struct pt_regs *regs, int fault_num,  	 */  	if (notify_die(DIE_PAGE_FAULT, "page fault", regs, -1,  		       regs->faultnum, SIGSEGV) == NOTIFY_STOP) -		return; +		goto done;  #endif  #ifdef __tilegx__ @@ -750,7 +752,6 @@ void do_page_fault(struct pt_regs *regs, int fault_num,  				 current->comm, current->pid, pc, address);  			show_regs(regs);  			do_group_exit(SIGKILL); -			return;  		}  	}  #else @@ -834,12 +835,15 @@ void do_page_fault(struct pt_regs *regs, int fault_num,  			async->is_fault = is_page_fault;  			async->is_write = write;  			async->address = address; -			return; +			goto done;  		}  	}  #endif  	handle_page_fault(regs, fault_num, is_page_fault, address, write); + +done: +	exception_exit(prev_state);  } | 
