On 08/07/2012 01:57 PM, Alexander Graf wrote: > The e500 target has lived without mmu notifiers ever since it got > introduced, but fails for the user space check on them with hugetlbfs. > > So in order to get that one working, implement mmu notifiers in a > reasonably dumb fashion and be happy. On embedded hardware, we almost > never end up with mmu notifier calls, since most people don't overcommit. > > > +static void kvmppc_check_requests(struct kvm_vcpu *vcpu) > +{ > +#if defined(CONFIG_KVM_E500V2) || defined(CONFIG_KVM_E500MC) > + if (vcpu->requests) > + if (kvm_check_request(KVM_REQ_TLB_FLUSH, vcpu)) > + kvmppc_core_flush_tlb(vcpu); > +#endif > +} > + > /* > * Common checks before entering the guest world. Call with interrupts > * disabled. > @@ -485,12 +494,24 @@ static int kvmppc_prepare_to_enter(struct kvm_vcpu *vcpu) > break; > } > > + smp_mb(); > + kvmppc_check_requests(vcpu); > + On x86 we do the requests processing while in normal preemptible context, then do an additional check for requests != 0 during guest entry. This allows us to do sleepy things in request processing, and reduces the amount of work we do with interrupts disabled. > if (kvmppc_core_prepare_to_enter(vcpu)) { > /* interrupts got enabled in between, so we > are back at square 1 */ > continue; > } > > + if (vcpu->mode == EXITING_GUEST_MODE) { > + r = 1; > + break; > + } > + > + /* Going into guest context! Yay! */ > + vcpu->mode = IN_GUEST_MODE; > + smp_wmb(); > + > break; > } > > @@ -560,6 +581,8 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu) > #endif > > kvm_guest_exit(); > + vcpu->mode = OUTSIDE_GUEST_MODE; > + smp_wmb(); > > +/************* MMU Notifiers *************/ > + > +int kvm_unmap_hva(struct kvm *kvm, unsigned long hva) > +{ > + /* Is this a guest page? */ > + if (!hva_to_memslot(kvm, hva)) > + return 0; > + > + /* > + * Flush all shadow tlb entries everywhere. This is slow, but > + * we are 100% sure that we catch the to be unmapped page > + */ > + kvm_flush_remote_tlbs(kvm); Wow. > + > + return 0; > +} > + Where do you drop the reference count when installing a page in a shadow tlb entry? -- error compiling committee.c: too many arguments to function -- 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