aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/ia64/kernel/perfmon.c21
-rw-r--r--arch/ia64/kernel/process.c9
-rw-r--r--include/asm-ia64/thread_info.h9
3 files changed, 18 insertions, 21 deletions
diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c
index 78acd9fe97e9..f6b99719f10f 100644
--- a/arch/ia64/kernel/perfmon.c
+++ b/arch/ia64/kernel/perfmon.c
@@ -586,21 +586,6 @@ pfm_put_task(struct task_struct *task)
586} 586}
587 587
588static inline void 588static inline void
589pfm_set_task_notify(struct task_struct *task)
590{
591 struct thread_info *info;
592
593 info = (struct thread_info *) ((char *) task + IA64_TASK_SIZE);
594 set_bit(TIF_PERFMON_WORK, &info->flags);
595}
596
597static inline void
598pfm_clear_task_notify(void)
599{
600 clear_thread_flag(TIF_PERFMON_WORK);
601}
602
603static inline void
604pfm_reserve_page(unsigned long a) 589pfm_reserve_page(unsigned long a)
605{ 590{
606 SetPageReserved(vmalloc_to_page((void *)a)); 591 SetPageReserved(vmalloc_to_page((void *)a));
@@ -3724,7 +3709,7 @@ pfm_restart(pfm_context_t *ctx, void *arg, int count, struct pt_regs *regs)
3724 3709
3725 PFM_SET_WORK_PENDING(task, 1); 3710 PFM_SET_WORK_PENDING(task, 1);
3726 3711
3727 pfm_set_task_notify(task); 3712 tsk_set_notify_resume(task);
3728 3713
3729 /* 3714 /*
3730 * XXX: send reschedule if task runs on another CPU 3715 * XXX: send reschedule if task runs on another CPU
@@ -5082,7 +5067,7 @@ pfm_handle_work(void)
5082 5067
5083 PFM_SET_WORK_PENDING(current, 0); 5068 PFM_SET_WORK_PENDING(current, 0);
5084 5069
5085 pfm_clear_task_notify(); 5070 tsk_clear_notify_resume(current);
5086 5071
5087 regs = task_pt_regs(current); 5072 regs = task_pt_regs(current);
5088 5073
@@ -5450,7 +5435,7 @@ pfm_overflow_handler(struct task_struct *task, pfm_context_t *ctx, u64 pmc0, str
5450 * when coming from ctxsw, current still points to the 5435 * when coming from ctxsw, current still points to the
5451 * previous task, therefore we must work with task and not current. 5436 * previous task, therefore we must work with task and not current.
5452 */ 5437 */
5453 pfm_set_task_notify(task); 5438 tsk_set_notify_resume(task);
5454 } 5439 }
5455 /* 5440 /*
5456 * defer until state is changed (shorten spin window). the context is locked 5441 * defer until state is changed (shorten spin window). the context is locked
diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c
index 7377d323131d..5c9efe626563 100644
--- a/arch/ia64/kernel/process.c
+++ b/arch/ia64/kernel/process.c
@@ -157,6 +157,15 @@ show_regs (struct pt_regs *regs)
157 show_stack(NULL, NULL); 157 show_stack(NULL, NULL);
158} 158}
159 159
160void tsk_clear_notify_resume(struct task_struct *tsk)
161{
162#ifdef CONFIG_PERFMON
163 if (tsk->thread.pfm_needs_checking)
164 return;
165#endif
166 clear_ti_thread_flag(task_thread_info(tsk), TIF_NOTIFY_RESUME);
167}
168
160void 169void
161do_notify_resume_user (sigset_t *unused, struct sigscratch *scr, long in_syscall) 170do_notify_resume_user (sigset_t *unused, struct sigscratch *scr, long in_syscall)
162{ 171{
diff --git a/include/asm-ia64/thread_info.h b/include/asm-ia64/thread_info.h
index d16031e72efa..5a2c47957069 100644
--- a/include/asm-ia64/thread_info.h
+++ b/include/asm-ia64/thread_info.h
@@ -71,6 +71,9 @@ struct thread_info {
71#define alloc_task_struct() ((struct task_struct *)__get_free_pages(GFP_KERNEL | __GFP_COMP, KERNEL_STACK_SIZE_ORDER)) 71#define alloc_task_struct() ((struct task_struct *)__get_free_pages(GFP_KERNEL | __GFP_COMP, KERNEL_STACK_SIZE_ORDER))
72#define free_task_struct(tsk) free_pages((unsigned long) (tsk), KERNEL_STACK_SIZE_ORDER) 72#define free_task_struct(tsk) free_pages((unsigned long) (tsk), KERNEL_STACK_SIZE_ORDER)
73 73
74#define tsk_set_notify_resume(tsk) \
75 set_ti_thread_flag(task_thread_info(tsk), TIF_NOTIFY_RESUME)
76extern void tsk_clear_notify_resume(struct task_struct *tsk);
74#endif /* !__ASSEMBLY */ 77#endif /* !__ASSEMBLY */
75 78
76/* 79/*
@@ -85,7 +88,7 @@ struct thread_info {
85#define TIF_SYSCALL_AUDIT 3 /* syscall auditing active */ 88#define TIF_SYSCALL_AUDIT 3 /* syscall auditing active */
86#define TIF_SINGLESTEP 4 /* restore singlestep on return to user mode */ 89#define TIF_SINGLESTEP 4 /* restore singlestep on return to user mode */
87#define TIF_RESTORE_SIGMASK 5 /* restore signal mask in do_signal() */ 90#define TIF_RESTORE_SIGMASK 5 /* restore signal mask in do_signal() */
88#define TIF_PERFMON_WORK 6 /* work for pfm_handle_work() */ 91#define TIF_NOTIFY_RESUME 6 /* resumption notification requested */
89#define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */ 92#define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */
90#define TIF_MEMDIE 17 93#define TIF_MEMDIE 17
91#define TIF_MCA_INIT 18 /* this task is processing MCA or INIT */ 94#define TIF_MCA_INIT 18 /* this task is processing MCA or INIT */
@@ -97,7 +100,7 @@ struct thread_info {
97#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) 100#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP)
98#define _TIF_SYSCALL_TRACEAUDIT (_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP) 101#define _TIF_SYSCALL_TRACEAUDIT (_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP)
99#define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK) 102#define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK)
100#define _TIF_PERFMON_WORK (1 << TIF_PERFMON_WORK) 103#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
101#define _TIF_SIGPENDING (1 << TIF_SIGPENDING) 104#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
102#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) 105#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
103#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) 106#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG)
@@ -106,7 +109,7 @@ struct thread_info {
106#define _TIF_FREEZE (1 << TIF_FREEZE) 109#define _TIF_FREEZE (1 << TIF_FREEZE)
107 110
108/* "work to do on user-return" bits */ 111/* "work to do on user-return" bits */
109#define TIF_ALLWORK_MASK (_TIF_SIGPENDING|_TIF_PERFMON_WORK|_TIF_SYSCALL_AUDIT|\ 112#define TIF_ALLWORK_MASK (_TIF_SIGPENDING|_TIF_NOTIFY_RESUME|_TIF_SYSCALL_AUDIT|\
110 _TIF_NEED_RESCHED| _TIF_SYSCALL_TRACE|\ 113 _TIF_NEED_RESCHED| _TIF_SYSCALL_TRACE|\
111 _TIF_RESTORE_SIGMASK) 114 _TIF_RESTORE_SIGMASK)
112/* like TIF_ALLWORK_BITS but sans TIF_SYSCALL_TRACE or TIF_SYSCALL_AUDIT */ 115/* like TIF_ALLWORK_BITS but sans TIF_SYSCALL_TRACE or TIF_SYSCALL_AUDIT */