From: Paul Mackerras <paulus@samba.org>
To: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Cc: agraf@suse.de, benh@kernel.crashing.org,
linuxppc-dev@lists.ozlabs.org, kvm-ppc@vger.kernel.org,
kvm@vger.kernel.org
Subject: Re: [PATCH 5/6] KVM: PPC: BOOK3S: Use hpte_update_in_progress to track invalid hpte during an hpte u
Date: Wed, 02 Jul 2014 05:41:56 +0000 [thread overview]
Message-ID: <20140702054156.GD16865@drongo> (raw)
In-Reply-To: <1404040655-12076-7-git-send-email-aneesh.kumar@linux.vnet.ibm.com>
On Sun, Jun 29, 2014 at 04:47:34PM +0530, Aneesh Kumar K.V wrote:
> As per ISA, we first need to mark hpte invalid (V=0) before we update
> the hpte lower half bits. With virtual page class key protection mechanism we want
> to send any fault other than key fault to guest directly without
> searching the hash page table. But then we can get NO_HPTE fault while
> we are updating the hpte. To track that add a vm specific atomic
> variable that we check in the fault path to always send the fault
> to host.
[...]
> @@ -750,13 +751,15 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
> r &= rcbits | ~(HPTE_R_R | HPTE_R_C);
>
> if (be64_to_cpu(hptep[0]) & HPTE_V_VALID) {
> - /* HPTE was previously valid, so we need to invalidate it */
> + /*
> + * If we had mapped this hpte before, we now need to
> + * invalidate that.
> + */
> unlock_rmap(rmap);
> - /* Always mark HPTE_V_ABSENT before invalidating */
> - kvmppc_unmap_host_hpte(kvm, hptep);
> kvmppc_invalidate_hpte(kvm, hptep, index);
> /* don't lose previous R and C bits */
> r |= be64_to_cpu(hptep[1]) & (HPTE_R_R | HPTE_R_C);
> + hpte_invalidated = true;
So now we're not setting the ABSENT bit before invalidating the HPTE.
That means that another guest vcpu could do an H_ENTER which could
think that this HPTE is free and use it for another unrelated guest
HPTE, which would be bad...
> @@ -1144,8 +1149,8 @@ static int kvm_test_clear_dirty_npages(struct kvm *kvm, unsigned long *rmapp)
> npages_dirty = n;
> eieio();
> }
> - kvmppc_map_host_hpte(kvm, &v, &r);
> - hptep[0] = cpu_to_be64(v & ~HPTE_V_HVLOCK);
> + hptep[0] = cpu_to_be64(v & ~HPTE_V_LOCK);
> + atomic_dec(&kvm->arch.hpte_update_in_progress);
Why are we using LOCK rather than HVLOCK now? (And why didn't you
mention this change and its rationale in the patch description?)
Paul.
WARNING: multiple messages have this Message-ID (diff)
From: Paul Mackerras <paulus@samba.org>
To: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Cc: linuxppc-dev@lists.ozlabs.org, agraf@suse.de,
kvm-ppc@vger.kernel.org, kvm@vger.kernel.org
Subject: Re: [PATCH 5/6] KVM: PPC: BOOK3S: Use hpte_update_in_progress to track invalid hpte during an hpte update
Date: Wed, 2 Jul 2014 15:41:56 +1000 [thread overview]
Message-ID: <20140702054156.GD16865@drongo> (raw)
In-Reply-To: <1404040655-12076-7-git-send-email-aneesh.kumar@linux.vnet.ibm.com>
On Sun, Jun 29, 2014 at 04:47:34PM +0530, Aneesh Kumar K.V wrote:
> As per ISA, we first need to mark hpte invalid (V=0) before we update
> the hpte lower half bits. With virtual page class key protection mechanism we want
> to send any fault other than key fault to guest directly without
> searching the hash page table. But then we can get NO_HPTE fault while
> we are updating the hpte. To track that add a vm specific atomic
> variable that we check in the fault path to always send the fault
> to host.
[...]
> @@ -750,13 +751,15 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
> r &= rcbits | ~(HPTE_R_R | HPTE_R_C);
>
> if (be64_to_cpu(hptep[0]) & HPTE_V_VALID) {
> - /* HPTE was previously valid, so we need to invalidate it */
> + /*
> + * If we had mapped this hpte before, we now need to
> + * invalidate that.
> + */
> unlock_rmap(rmap);
> - /* Always mark HPTE_V_ABSENT before invalidating */
> - kvmppc_unmap_host_hpte(kvm, hptep);
> kvmppc_invalidate_hpte(kvm, hptep, index);
> /* don't lose previous R and C bits */
> r |= be64_to_cpu(hptep[1]) & (HPTE_R_R | HPTE_R_C);
> + hpte_invalidated = true;
So now we're not setting the ABSENT bit before invalidating the HPTE.
That means that another guest vcpu could do an H_ENTER which could
think that this HPTE is free and use it for another unrelated guest
HPTE, which would be bad...
> @@ -1144,8 +1149,8 @@ static int kvm_test_clear_dirty_npages(struct kvm *kvm, unsigned long *rmapp)
> npages_dirty = n;
> eieio();
> }
> - kvmppc_map_host_hpte(kvm, &v, &r);
> - hptep[0] = cpu_to_be64(v & ~HPTE_V_HVLOCK);
> + hptep[0] = cpu_to_be64(v & ~HPTE_V_LOCK);
> + atomic_dec(&kvm->arch.hpte_update_in_progress);
Why are we using LOCK rather than HVLOCK now? (And why didn't you
mention this change and its rationale in the patch description?)
Paul.
WARNING: multiple messages have this Message-ID (diff)
From: Paul Mackerras <paulus@samba.org>
To: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Cc: agraf@suse.de, benh@kernel.crashing.org,
linuxppc-dev@lists.ozlabs.org, kvm-ppc@vger.kernel.org,
kvm@vger.kernel.org
Subject: Re: [PATCH 5/6] KVM: PPC: BOOK3S: Use hpte_update_in_progress to track invalid hpte during an hpte update
Date: Wed, 2 Jul 2014 15:41:56 +1000 [thread overview]
Message-ID: <20140702054156.GD16865@drongo> (raw)
In-Reply-To: <1404040655-12076-7-git-send-email-aneesh.kumar@linux.vnet.ibm.com>
On Sun, Jun 29, 2014 at 04:47:34PM +0530, Aneesh Kumar K.V wrote:
> As per ISA, we first need to mark hpte invalid (V=0) before we update
> the hpte lower half bits. With virtual page class key protection mechanism we want
> to send any fault other than key fault to guest directly without
> searching the hash page table. But then we can get NO_HPTE fault while
> we are updating the hpte. To track that add a vm specific atomic
> variable that we check in the fault path to always send the fault
> to host.
[...]
> @@ -750,13 +751,15 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
> r &= rcbits | ~(HPTE_R_R | HPTE_R_C);
>
> if (be64_to_cpu(hptep[0]) & HPTE_V_VALID) {
> - /* HPTE was previously valid, so we need to invalidate it */
> + /*
> + * If we had mapped this hpte before, we now need to
> + * invalidate that.
> + */
> unlock_rmap(rmap);
> - /* Always mark HPTE_V_ABSENT before invalidating */
> - kvmppc_unmap_host_hpte(kvm, hptep);
> kvmppc_invalidate_hpte(kvm, hptep, index);
> /* don't lose previous R and C bits */
> r |= be64_to_cpu(hptep[1]) & (HPTE_R_R | HPTE_R_C);
> + hpte_invalidated = true;
So now we're not setting the ABSENT bit before invalidating the HPTE.
That means that another guest vcpu could do an H_ENTER which could
think that this HPTE is free and use it for another unrelated guest
HPTE, which would be bad...
> @@ -1144,8 +1149,8 @@ static int kvm_test_clear_dirty_npages(struct kvm *kvm, unsigned long *rmapp)
> npages_dirty = n;
> eieio();
> }
> - kvmppc_map_host_hpte(kvm, &v, &r);
> - hptep[0] = cpu_to_be64(v & ~HPTE_V_HVLOCK);
> + hptep[0] = cpu_to_be64(v & ~HPTE_V_LOCK);
> + atomic_dec(&kvm->arch.hpte_update_in_progress);
Why are we using LOCK rather than HVLOCK now? (And why didn't you
mention this change and its rationale in the patch description?)
Paul.
next prev parent reply other threads:[~2014-07-02 5:41 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-29 11:17 [PATCH 0/6] Use virtual page class key protection mechanism for speeding up guest page fault Aneesh Kumar K.V
2014-06-29 11:29 ` Aneesh Kumar K.V
2014-06-29 11:17 ` Aneesh Kumar K.V
2014-06-29 11:17 ` [PATCH 1/6] KVM: PPC: BOOK3S: HV: Clear hash pte bits from do_h_enter callers Aneesh Kumar K.V
2014-06-29 11:29 ` Aneesh Kumar K.V
2014-06-29 11:17 ` Aneesh Kumar K.V
2014-06-29 11:17 ` [PATCH] KVM: PPC: BOOK3S: HV: Update compute_tlbie_rb to handle 16MB base page Aneesh Kumar K.V
2014-06-29 11:29 ` Aneesh Kumar K.V
2014-06-29 11:17 ` Aneesh Kumar K.V
2014-07-02 4:00 ` Paul Mackerras
2014-07-02 4:00 ` Paul Mackerras
2014-07-02 4:00 ` Paul Mackerras
2014-06-29 11:17 ` [PATCH 2/6] KVM: PPC: BOOK3S: HV: Deny virtual page class key update via h_protect Aneesh Kumar K.V
2014-06-29 11:29 ` Aneesh Kumar K.V
2014-06-29 11:17 ` Aneesh Kumar K.V
2014-07-02 4:50 ` Paul Mackerras
2014-07-02 4:50 ` Paul Mackerras
2014-07-02 4:50 ` Paul Mackerras
2014-07-02 12:12 ` Aneesh Kumar K.V
2014-07-02 12:24 ` Aneesh Kumar K.V
2014-07-02 12:12 ` Aneesh Kumar K.V
2014-06-29 11:17 ` [PATCH 3/6] KVM: PPC: BOOK3S: HV: Remove dead code Aneesh Kumar K.V
2014-06-29 11:29 ` Aneesh Kumar K.V
2014-06-29 11:17 ` Aneesh Kumar K.V
2014-06-29 11:17 ` [PATCH 4/6] KVM: PPC: BOOK3S: HV: Use new functions for mapping/unmapping hpte in host Aneesh Kumar K.V
2014-06-29 11:29 ` Aneesh Kumar K.V
2014-06-29 11:17 ` Aneesh Kumar K.V
2014-07-02 4:28 ` Paul Mackerras
2014-07-02 4:28 ` Paul Mackerras
2014-07-02 4:28 ` Paul Mackerras
2014-07-02 11:49 ` Aneesh Kumar K.V
2014-07-02 11:50 ` Aneesh Kumar K.V
2014-07-02 11:49 ` Aneesh Kumar K.V
2014-06-29 11:17 ` [PATCH 5/6] KVM: PPC: BOOK3S: Use hpte_update_in_progress to track invalid hpte during an hpte update Aneesh Kumar K.V
2014-06-29 11:29 ` [PATCH 5/6] KVM: PPC: BOOK3S: Use hpte_update_in_progress to track invalid hpte during an hpte updat Aneesh Kumar K.V
2014-06-29 11:17 ` [PATCH 5/6] KVM: PPC: BOOK3S: Use hpte_update_in_progress to track invalid hpte during an hpte update Aneesh Kumar K.V
2014-07-02 5:41 ` Paul Mackerras [this message]
2014-07-02 5:41 ` Paul Mackerras
2014-07-02 5:41 ` Paul Mackerras
2014-07-02 11:57 ` Aneesh Kumar K.V
2014-07-02 11:57 ` [PATCH 5/6] KVM: PPC: BOOK3S: Use hpte_update_in_progress to track invalid hpte during an hpte u Aneesh Kumar K.V
2014-07-02 11:57 ` [PATCH 5/6] KVM: PPC: BOOK3S: Use hpte_update_in_progress to track invalid hpte during an hpte update Aneesh Kumar K.V
2014-06-29 11:17 ` [PATCH 6/6] KVM: PPC: BOOK3S: HV: Use virtual page class protection mechanism for host fault and mmio Aneesh Kumar K.V
2014-06-29 11:29 ` [PATCH 6/6] KVM: PPC: BOOK3S: HV: Use virtual page class protection mechanism for host fault and mmi Aneesh Kumar K.V
2014-06-29 11:17 ` [PATCH 6/6] KVM: PPC: BOOK3S: HV: Use virtual page class protection mechanism for host fault and mmio Aneesh Kumar K.V
2014-06-29 11:26 ` [PATCH 0/6] Use virtual page class key protection mechanism for speeding up guest page fault Benjamin Herrenschmidt
2014-06-29 11:26 ` Benjamin Herrenschmidt
2014-06-29 11:26 ` Benjamin Herrenschmidt
2014-06-29 16:57 ` Aneesh Kumar K.V
2014-06-29 16:57 ` Aneesh Kumar K.V
2014-06-29 16:57 ` Aneesh Kumar K.V
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140702054156.GD16865@drongo \
--to=paulus@samba.org \
--cc=agraf@suse.de \
--cc=aneesh.kumar@linux.vnet.ibm.com \
--cc=benh@kernel.crashing.org \
--cc=kvm-ppc@vger.kernel.org \
--cc=kvm@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.