On 19.02.2013, at 05:13, Scott Wood wrote: > The existing check handles the case where we've migrated to a different > core than we last ran on, but it doesn't handle the case where we're > still on the same cpu we last ran on, but some other vcpu has run on > this cpu in the meantime. > > Signed-off-by: Scott Wood <scottwood@xxxxxxxxxxxxx> > --- > This seems to have been the cause of the userspace segfaults I was > seeing (the other TLB patches I posted are still needed as well). > > arch/powerpc/kvm/e500mc.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/arch/powerpc/kvm/e500mc.c b/arch/powerpc/kvm/e500mc.c > index 1f89d26..8637689 100644 > --- a/arch/powerpc/kvm/e500mc.c > +++ b/arch/powerpc/kvm/e500mc.c > @@ -111,6 +111,7 @@ void kvmppc_mmu_msr_notify(struct kvm_vcpu *vcpu, u32 old_msr) > void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu) > { > struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu); > + static struct kvm_vcpu *last_vcpu_on_cpu[NR_CPUS]; Why not use DEFINE_PER_CPU? Alex > > kvmppc_booke_vcpu_load(vcpu, cpu); > > @@ -136,8 +137,11 @@ void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu) > mtspr(SPRN_GDEAR, vcpu->arch.shared->dar); > mtspr(SPRN_GESR, vcpu->arch.shared->esr); > > - if (vcpu->arch.oldpir != mfspr(SPRN_PIR)) > + if (vcpu->arch.oldpir != mfspr(SPRN_PIR) || > + last_vcpu_on_cpu[smp_processor_id()] != vcpu) { > kvmppc_e500_tlbil_all(vcpu_e500); > + last_vcpu_on_cpu[smp_processor_id()] = vcpu; > + } > > kvmppc_load_guest_fp(vcpu); > } > -- > 1.7.9.5 > -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html