sched/tick: Ensure timers does not get queued on isolated cpus

Timers should not be queued on isolated cpus. Instead try to find
other cpus to queue timer on.

Change-Id: I5d849dfd29aa5bb594454473768d7db1da258028
Signed-off-by: Olav Haugan <ohaugan@codeaurora.org>
This commit is contained in:
Olav Haugan 2016-06-02 16:29:27 -07:00
parent 639c8ad52d
commit ca2c4c6518

View file

@ -161,7 +161,15 @@ extern void __tick_nohz_task_switch(void);
#else #else
static inline int housekeeping_any_cpu(void) static inline int housekeeping_any_cpu(void)
{ {
return smp_processor_id(); cpumask_t available;
int cpu;
cpumask_andnot(&available, cpu_online_mask, cpu_isolated_mask);
cpu = cpumask_any(&available);
if (cpu >= nr_cpu_ids)
cpu = smp_processor_id();
return cpu;
} }
static inline bool tick_nohz_full_enabled(void) { return false; } static inline bool tick_nohz_full_enabled(void) { return false; }
static inline bool tick_nohz_full_cpu(int cpu) { return false; } static inline bool tick_nohz_full_cpu(int cpu) { return false; }
@ -187,7 +195,7 @@ static inline bool is_housekeeping_cpu(int cpu)
if (tick_nohz_full_enabled()) if (tick_nohz_full_enabled())
return cpumask_test_cpu(cpu, housekeeping_mask); return cpumask_test_cpu(cpu, housekeeping_mask);
#endif #endif
return true; return !cpu_isolated(cpu);
} }
static inline void housekeeping_affine(struct task_struct *t) static inline void housekeeping_affine(struct task_struct *t)