Missing preempt count set on scheduler IPI. -ck --- include/linux/sched.h | 5 ----- kernel/sched/bfs.c | 12 ++++++++++++ 2 files changed, 12 insertions(+), 5 deletions(-) Index: linux-3.16-ck2/include/linux/sched.h =================================================================== --- linux-3.16-ck2.orig/include/linux/sched.h 2014-08-25 09:45:58.094543864 +1000 +++ linux-3.16-ck2/include/linux/sched.h 2014-08-25 09:45:58.092543864 +1000 @@ -2510,12 +2510,7 @@ static inline void set_task_comm(struct extern char *get_task_comm(char *to, struct task_struct *tsk); #ifdef CONFIG_SMP -#ifdef CONFIG_SCHED_BFS -/* scheduler_ipi does nothing on BFS */ -static inline void scheduler_ipi(void) { } -#else void scheduler_ipi(void); -#endif extern unsigned long wait_task_inactive(struct task_struct *, long match_state); #else static inline void scheduler_ipi(void) { } Index: linux-3.16-ck2/kernel/sched/bfs.c =================================================================== --- linux-3.16-ck2.orig/kernel/sched/bfs.c 2014-08-25 09:45:58.094543864 +1000 +++ linux-3.16-ck2/kernel/sched/bfs.c 2014-08-25 09:45:58.092543864 +1000 @@ -1505,6 +1505,18 @@ ttwu_stat(struct task_struct *p, int cpu #endif /* CONFIG_SCHEDSTATS */ } +#ifdef CONFIG_SMP +void scheduler_ipi(void) +{ + /* + * Fold TIF_NEED_RESCHED into the preempt_count; anybody setting + * TIF_NEED_RESCHED remotely (for the first time) will also send + * this IPI. + */ + preempt_fold_need_resched(); +} +#endif + static inline void ttwu_activate(struct task_struct *p, struct rq *rq, bool is_sync) {