diff options
| -rw-r--r-- | include/linux/preempt.h | 5 | ||||
| -rw-r--r-- | kernel/sched.c | 2 | 
2 files changed, 6 insertions, 1 deletions
diff --git a/include/linux/preempt.h b/include/linux/preempt.h index 72b1a10a59b..2e681d9555b 100644 --- a/include/linux/preempt.h +++ b/include/linux/preempt.h @@ -105,6 +105,11 @@ struct preempt_notifier;   * @sched_out: we've just been preempted   *    notifier: struct preempt_notifier for the task being preempted   *    next: the task that's kicking us out + * + * Please note that sched_in and out are called under different + * contexts.  sched_out is called with rq lock held and irq disabled + * while sched_in is called without rq lock and irq enabled.  This + * difference is intentional and depended upon by its users.   */  struct preempt_ops {  	void (*sched_in)(struct preempt_notifier *notifier, int cpu); diff --git a/kernel/sched.c b/kernel/sched.c index b3d4e2be95a..1031cae39c4 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -2768,9 +2768,9 @@ static void finish_task_switch(struct rq *rq, struct task_struct *prev)  	prev_state = prev->state;  	finish_arch_switch(prev);  	perf_event_task_sched_in(current, cpu_of(rq)); -	fire_sched_in_preempt_notifiers(current);  	finish_lock_switch(rq, prev); +	fire_sched_in_preempt_notifiers(current);  	if (mm)  		mmdrop(mm);  	if (unlikely(prev_state == TASK_DEAD)) {  |