aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/preempt.h5
-rw-r--r--kernel/sched.c2
2 files changed, 6 insertions, 1 deletions
diff --git a/include/linux/preempt.h b/include/linux/preempt.h
index 72b1a10a59b6..2e681d9555bd 100644
--- a/include/linux/preempt.h
+++ b/include/linux/preempt.h
@@ -105,6 +105,11 @@ struct preempt_notifier;
105 * @sched_out: we've just been preempted 105 * @sched_out: we've just been preempted
106 * notifier: struct preempt_notifier for the task being preempted 106 * notifier: struct preempt_notifier for the task being preempted
107 * next: the task that's kicking us out 107 * next: the task that's kicking us out
108 *
109 * Please note that sched_in and out are called under different
110 * contexts. sched_out is called with rq lock held and irq disabled
111 * while sched_in is called without rq lock and irq enabled. This
112 * difference is intentional and depended upon by its users.
108 */ 113 */
109struct preempt_ops { 114struct preempt_ops {
110 void (*sched_in)(struct preempt_notifier *notifier, int cpu); 115 void (*sched_in)(struct preempt_notifier *notifier, int cpu);
diff --git a/kernel/sched.c b/kernel/sched.c
index b3d4e2be95aa..1031cae39c4c 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)
2768 prev_state = prev->state; 2768 prev_state = prev->state;
2769 finish_arch_switch(prev); 2769 finish_arch_switch(prev);
2770 perf_event_task_sched_in(current, cpu_of(rq)); 2770 perf_event_task_sched_in(current, cpu_of(rq));
2771 fire_sched_in_preempt_notifiers(current);
2772 finish_lock_switch(rq, prev); 2771 finish_lock_switch(rq, prev);
2773 2772
2773 fire_sched_in_preempt_notifiers(current);
2774 if (mm) 2774 if (mm)
2775 mmdrop(mm); 2775 mmdrop(mm);
2776 if (unlikely(prev_state == TASK_DEAD)) { 2776 if (unlikely(prev_state == TASK_DEAD)) {