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-ppc" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html