SMT siblings share caches and other hardware, halt polling will degrade its sibling performance if its sibling is busy Signed-off-by: Li RongQing <lirongqing@xxxxxxxxx> --- include/linux/kvm_host.h | 5 ++++- include/linux/sched.h | 17 +++++++++++++++++ kernel/sched/fair.c | 17 ----------------- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index ae7735b..15b3ef4 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -269,7 +269,10 @@ static inline bool kvm_vcpu_mapped(struct kvm_host_map *map) static inline bool kvm_vcpu_can_poll(ktime_t cur, ktime_t stop) { - return single_task_running() && !need_resched() && ktime_before(cur, stop); + return single_task_running() && + !need_resched() && + ktime_before(cur, stop) && + is_core_idle(raw_smp_processor_id()); } /* diff --git a/include/linux/sched.h b/include/linux/sched.h index ec8d07d..c333218 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -34,6 +34,7 @@ #include <linux/rseq.h> #include <linux/seqlock.h> #include <linux/kcsan.h> +#include <linux/topology.h> #include <asm/kmap_size.h> /* task_struct member predeclarations (sorted alphabetically): */ @@ -2191,6 +2192,22 @@ int sched_trace_rq_nr_running(struct rq *rq); const struct cpumask *sched_trace_rd_span(struct root_domain *rd); +static inline bool is_core_idle(int cpu) +{ +#ifdef CONFIG_SCHED_SMT + int sibling; + + for_each_cpu(sibling, cpu_smt_mask(cpu)) { + if (cpu == sibling) + continue; + + if (!idle_cpu(cpu)) + return false; + } +#endif + return true; +} + #ifdef CONFIG_SCHED_CORE extern void sched_core_free(struct task_struct *tsk); extern void sched_core_fork(struct task_struct *p); diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 44c4520..5b0259c 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -1477,23 +1477,6 @@ struct numa_stats { int idle_cpu; }; -static inline bool is_core_idle(int cpu) -{ -#ifdef CONFIG_SCHED_SMT - int sibling; - - for_each_cpu(sibling, cpu_smt_mask(cpu)) { - if (cpu == sibling) - continue; - - if (!idle_cpu(cpu)) - return false; - } -#endif - - return true; -} - struct task_numa_env { struct task_struct *p; -- 2.9.4