aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sched/core.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/sched/core.c')
-rw-r--r--kernel/sched/core.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 20b858f2db22..4e925ea10c0c 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -2960,7 +2960,13 @@ asmlinkage __visible void __sched notrace preempt_schedule_context(void)
2960 return; 2960 return;
2961 2961
2962 do { 2962 do {
2963 preempt_active_enter(); 2963 /*
2964 * Use raw __prempt_count() ops that don't call function.
2965 * We can't call functions before disabling preemption which
2966 * disarm preemption tracing recursions.
2967 */
2968 __preempt_count_add(PREEMPT_ACTIVE + PREEMPT_DISABLE_OFFSET);
2969 barrier();
2964 /* 2970 /*
2965 * Needs preempt disabled in case user_exit() is traced 2971 * Needs preempt disabled in case user_exit() is traced
2966 * and the tracer calls preempt_enable_notrace() causing 2972 * and the tracer calls preempt_enable_notrace() causing
@@ -2970,7 +2976,8 @@ asmlinkage __visible void __sched notrace preempt_schedule_context(void)
2970 __schedule(); 2976 __schedule();
2971 exception_exit(prev_ctx); 2977 exception_exit(prev_ctx);
2972 2978
2973 preempt_active_exit(); 2979 barrier();
2980 __preempt_count_sub(PREEMPT_ACTIVE + PREEMPT_DISABLE_OFFSET);
2974 } while (need_resched()); 2981 } while (need_resched());
2975} 2982}
2976EXPORT_SYMBOL_GPL(preempt_schedule_context); 2983EXPORT_SYMBOL_GPL(preempt_schedule_context);