[RFC 02/11] powerpc: kvm: ensure vcpu-thread run only on primary hwthread
kernelfans at gmail.com
kernelfans at gmail.com
Fri Oct 17 06:29:51 AEDT 2014
When vcpu thread runs at the first time, it will ensure to stick
to the primary thread.
Signed-off-by: Liu Ping Fan <pingfank at 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
More information about the Linuxppc-dev
mailing list