diff options
Diffstat (limited to 'arch/arm')
| -rw-r--r-- | arch/arm/include/asm/thread_info.h | 3 | ||||
| -rw-r--r-- | arch/arm/kernel/entry-common.S | 2 | ||||
| -rw-r--r-- | arch/arm/kernel/signal.c | 8 | 
3 files changed, 12 insertions, 1 deletions
diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h index 73394e50cbc..d3a39b1e6c0 100644 --- a/arch/arm/include/asm/thread_info.h +++ b/arch/arm/include/asm/thread_info.h @@ -130,11 +130,13 @@ extern void vfp_sync_state(struct thread_info *thread);   *  TIF_SYSCALL_TRACE	- syscall trace active   *  TIF_SIGPENDING	- signal pending   *  TIF_NEED_RESCHED	- rescheduling necessary + *  TIF_NOTIFY_RESUME	- callback before returning to user   *  TIF_USEDFPU		- FPU was used by this task this quantum (SMP)   *  TIF_POLLING_NRFLAG	- true if poll_idle() is polling TIF_NEED_RESCHED   */  #define TIF_SIGPENDING		0  #define TIF_NEED_RESCHED	1 +#define TIF_NOTIFY_RESUME	2	/* callback before returning to user */  #define TIF_SYSCALL_TRACE	8  #define TIF_POLLING_NRFLAG	16  #define TIF_USING_IWMMXT	17 @@ -143,6 +145,7 @@ extern void vfp_sync_state(struct thread_info *thread);  #define _TIF_SIGPENDING		(1 << TIF_SIGPENDING)  #define _TIF_NEED_RESCHED	(1 << TIF_NEED_RESCHED) +#define _TIF_NOTIFY_RESUME	(1 << TIF_NOTIFY_RESUME)  #define _TIF_SYSCALL_TRACE	(1 << TIF_SYSCALL_TRACE)  #define _TIF_POLLING_NRFLAG	(1 << TIF_POLLING_NRFLAG)  #define _TIF_USING_IWMMXT	(1 << TIF_USING_IWMMXT) diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 8c3de1a350b..7813ab782fd 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -51,7 +51,7 @@ fast_work_pending:  work_pending:  	tst	r1, #_TIF_NEED_RESCHED  	bne	work_resched -	tst	r1, #_TIF_SIGPENDING +	tst	r1, #_TIF_SIGPENDING|_TIF_NOTIFY_RESUME  	beq	no_work_pending  	mov	r0, sp				@ 'regs'  	mov	r2, why				@ 'syscall' diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index f6bc5d44278..b76fe06d92e 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -12,6 +12,7 @@  #include <linux/personality.h>  #include <linux/freezer.h>  #include <linux/uaccess.h> +#include <linux/tracehook.h>  #include <asm/elf.h>  #include <asm/cacheflush.h> @@ -707,4 +708,11 @@ do_notify_resume(struct pt_regs *regs, unsigned int thread_flags, int syscall)  {  	if (thread_flags & _TIF_SIGPENDING)  		do_signal(¤t->blocked, regs, syscall); + +	if (thread_flags & _TIF_NOTIFY_RESUME) { +		clear_thread_flag(TIF_NOTIFY_RESUME); +		tracehook_notify_resume(regs); +		if (current->replacement_session_keyring) +			key_replace_session_keyring(); +	}  }  |