kernel/sched/core.c | 5 ++++- kernel/sched/sched.h | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 89e7283015a6..1b40aed13931 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -1577,7 +1577,9 @@ void scheduler_ipi(void) */ preempt_fold_need_resched(); - if (llist_empty(&this_rq()->wake_list) && !got_nohz_idle_kick()) + if (llist_empty(&this_rq()->wake_list) + && !tick_nohz_full_cpu(smp_processor_id()) + && !got_nohz_idle_kick()) return; /* @@ -1594,6 +1596,7 @@ void scheduler_ipi(void) * somewhat pessimize the simple resched case. */ irq_enter(); + tick_nohz_full_check(); sched_ttwu_pending(); /* diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 2df8ef067cc5..e9a73143d318 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -1245,7 +1245,7 @@ static inline void add_nr_running(struct rq *rq, unsigned count) * new value of rq->nr_running is visible on reception * from the target. */ - tick_nohz_full_kick_cpu(rq->cpu); + smp_send_reschedule(rq->cpu); } #endif }