diff options
Diffstat (limited to 'kernel/sched/core.c')
-rw-r--r-- | kernel/sched/core.c | 11 |
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 | } |
2976 | EXPORT_SYMBOL_GPL(preempt_schedule_context); | 2983 | EXPORT_SYMBOL_GPL(preempt_schedule_context); |