diff --git a/kernel/sched.c b/kernel/sched.c index 5f2182d42241d20b41a12eb9da9671927b5b36d8..4107db0dc0919767b72b31e8dd88a5580294a578 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -3877,6 +3877,13 @@ asmlinkage long sys_sched_yield(void) static inline void __cond_resched(void) { + /* + * The BKS might be reacquired before we have dropped + * PREEMPT_ACTIVE, which could trigger a second + * cond_resched() call. + */ + if (unlikely(preempt_count())) + return; do { add_preempt_count(PREEMPT_ACTIVE); schedule();