When vcpu thread runs at the first time, it will ensure to stick
to the primary thread.

Signed-off-by: Liu Ping Fan <pingf...@linux.vnet.ibm.com>
---
 arch/powerpc/include/asm/kvm_host.h |  3 +++
 arch/powerpc/kvm/book3s_hv.c        | 17 +++++++++++++++++
 2 files changed, 20 insertions(+)

diff --git a/arch/powerpc/include/asm/kvm_host.h 
b/arch/powerpc/include/asm/kvm_host.h
index 98d9dd5..9a3355e 100644
--- a/arch/powerpc/include/asm/kvm_host.h
+++ b/arch/powerpc/include/asm/kvm_host.h
@@ -666,6 +666,9 @@ struct kvm_vcpu_arch {
        spinlock_t tbacct_lock;
        u64 busy_stolen;
        u64 busy_preempt;
+#ifdef CONFIG_KVMPPC_ENABLE_SECONDARY
+       bool cpu_selected;
+#endif
 #endif
 };
 
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
index 27cced9..ba258c8 100644
--- a/arch/powerpc/kvm/book3s_hv.c
+++ b/arch/powerpc/kvm/book3s_hv.c
@@ -1909,6 +1909,23 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, 
struct kvm_vcpu *vcpu)
 {
        int r;
        int srcu_idx;
+#ifdef CONFIG_KVMPPC_ENABLE_SECONDARY
+       int cpu = smp_processor_id();
+       int target_cpu;
+       unsigned int cpu;
+       struct task_struct *p = current;
+
+       if (unlikely(!vcpu->arch.cpu_selected)) {
+               vcpu->arch.cpu_selected = true;
+               for (cpu = 0; cpu < NR_CPUS; cpu+=threads_per_core) {
+                       cpumask_set_cpu(cpu, &p->sys_allowed);
+               }
+               if (cpu%threads_per_core != 0) {
+                       target_cpu = cpu/threads_per_core*threads_per_core;
+                       migrate_task_to(current, target_cpu);
+               }
+       }
+#endif
 
        if (!vcpu->arch.sane) {
                run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
-- 
1.8.3.1

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to