mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Avi Kivity <avi@redhat.com>
To: kvm@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, Hollis Blanchard <hollisb@us.ibm.com>
Subject: [PATCH 22/36] KVM: ppc: save and restore guest mappings on context switch
Date: Sun, 14 Dec 2008 10:06:55 +0200	[thread overview]
Message-ID: <1229242029-13410-23-git-send-email-avi@redhat.com> (raw)
In-Reply-To: <1229242029-13410-1-git-send-email-avi@redhat.com>

From: Hollis Blanchard <hollisb@us.ibm.com>

Store shadow TLB entries in memory, but only use it on host context switch
(instead of every guest entry). This improves performance for most workloads on
440 by reducing the guest TLB miss rate.

Signed-off-by: Hollis Blanchard <hollisb@us.ibm.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
---
 arch/powerpc/include/asm/kvm_44x.h |    6 ++++
 arch/powerpc/kvm/44x.c             |    7 +---
 arch/powerpc/kvm/44x_tlb.c         |   58 ++++++++++++++++++++++++++++++++++++
 3 files changed, 66 insertions(+), 5 deletions(-)

diff --git a/arch/powerpc/include/asm/kvm_44x.h b/arch/powerpc/include/asm/kvm_44x.h
index e770ea2..f49031b 100644
--- a/arch/powerpc/include/asm/kvm_44x.h
+++ b/arch/powerpc/include/asm/kvm_44x.h
@@ -42,6 +42,10 @@ struct kvmppc_vcpu_44x {
 	/* References to guest pages in the hardware TLB. */
 	struct kvmppc_44x_shadow_ref shadow_refs[PPC44x_TLB_SIZE];
 
+	/* State of the shadow TLB at guest context switch time. */
+	struct kvmppc_44x_tlbe shadow_tlb[PPC44x_TLB_SIZE];
+	u8 shadow_tlb_mod[PPC44x_TLB_SIZE];
+
 	struct kvm_vcpu vcpu;
 };
 
@@ -51,5 +55,7 @@ static inline struct kvmppc_vcpu_44x *to_44x(struct kvm_vcpu *vcpu)
 }
 
 void kvmppc_set_pid(struct kvm_vcpu *vcpu, u32 new_pid);
+void kvmppc_44x_tlb_put(struct kvm_vcpu *vcpu);
+void kvmppc_44x_tlb_load(struct kvm_vcpu *vcpu);
 
 #endif /* __ASM_44X_H__ */
diff --git a/arch/powerpc/kvm/44x.c b/arch/powerpc/kvm/44x.c
index 05d72fc..a66bec5 100644
--- a/arch/powerpc/kvm/44x.c
+++ b/arch/powerpc/kvm/44x.c
@@ -96,15 +96,12 @@ void kvmppc_core_load_guest_debugstate(struct kvm_vcpu *vcpu)
 
 void kvmppc_core_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
 {
+	kvmppc_44x_tlb_load(vcpu);
 }
 
 void kvmppc_core_vcpu_put(struct kvm_vcpu *vcpu)
 {
-	/* XXX Since every guest uses TS=1 TID=0/1 mappings, we can't leave any TLB
-	 * entries around when we're descheduled, so we must completely flush the
-	 * TLB of all guest mappings. On the other hand, if there is only one
-	 * guest, this flush is completely unnecessary. */
-	_tlbia();
+	kvmppc_44x_tlb_put(vcpu);
 }
 
 int kvmppc_core_check_processor_compat(void)
diff --git a/arch/powerpc/kvm/44x_tlb.c b/arch/powerpc/kvm/44x_tlb.c
index 2981ebe..ff16d0e 100644
--- a/arch/powerpc/kvm/44x_tlb.c
+++ b/arch/powerpc/kvm/44x_tlb.c
@@ -73,6 +73,25 @@ static inline void kvmppc_44x_tlbie(unsigned int index)
 	);
 }
 
+static inline void kvmppc_44x_tlbre(unsigned int index,
+                                    struct kvmppc_44x_tlbe *tlbe)
+{
+	asm volatile(
+		"tlbre %[word0], %[index], 0\n"
+		"mfspr %[tid], %[sprn_mmucr]\n"
+		"andi. %[tid], %[tid], 0xff\n"
+		"tlbre %[word1], %[index], 1\n"
+		"tlbre %[word2], %[index], 2\n"
+		: [word0] "=r"(tlbe->word0),
+		  [word1] "=r"(tlbe->word1),
+		  [word2] "=r"(tlbe->word2),
+		  [tid]   "=r"(tlbe->tid)
+		: [index] "r"(index),
+		  [sprn_mmucr] "i"(SPRN_MMUCR)
+		: "cc"
+	);
+}
+
 static inline void kvmppc_44x_tlbwe(unsigned int index,
                                     struct kvmppc_44x_tlbe *stlbe)
 {
@@ -116,6 +135,44 @@ static u32 kvmppc_44x_tlb_shadow_attrib(u32 attrib, int usermode)
 	return attrib;
 }
 
+/* Load shadow TLB back into hardware. */
+void kvmppc_44x_tlb_load(struct kvm_vcpu *vcpu)
+{
+	struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu);
+	int i;
+
+	for (i = 0; i <= tlb_44x_hwater; i++) {
+		struct kvmppc_44x_tlbe *stlbe = &vcpu_44x->shadow_tlb[i];
+
+		if (get_tlb_v(stlbe) && get_tlb_ts(stlbe))
+			kvmppc_44x_tlbwe(i, stlbe);
+	}
+}
+
+static void kvmppc_44x_tlbe_set_modified(struct kvmppc_vcpu_44x *vcpu_44x,
+                                         unsigned int i)
+{
+	vcpu_44x->shadow_tlb_mod[i] = 1;
+}
+
+/* Save hardware TLB to the vcpu, and invalidate all guest mappings. */
+void kvmppc_44x_tlb_put(struct kvm_vcpu *vcpu)
+{
+	struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu);
+	int i;
+
+	for (i = 0; i <= tlb_44x_hwater; i++) {
+		struct kvmppc_44x_tlbe *stlbe = &vcpu_44x->shadow_tlb[i];
+
+		if (vcpu_44x->shadow_tlb_mod[i])
+			kvmppc_44x_tlbre(i, stlbe);
+
+		if (get_tlb_v(stlbe) && get_tlb_ts(stlbe))
+			kvmppc_44x_tlbie(i);
+	}
+}
+
+
 /* Search the guest TLB for a matching entry. */
 int kvmppc_44x_tlb_index(struct kvm_vcpu *vcpu, gva_t eaddr, unsigned int pid,
                          unsigned int as)
@@ -283,6 +340,7 @@ void kvmppc_mmu_map(struct kvm_vcpu *vcpu, u64 gvaddr, gpa_t gpaddr, u64 asid,
 	ref->tid = stlbe.tid;
 
 	/* Insert shadow mapping into hardware TLB. */
+	kvmppc_44x_tlbe_set_modified(vcpu_44x, victim);
 	kvmppc_44x_tlbwe(victim, &stlbe);
 	KVMTRACE_5D(STLB_WRITE, vcpu, victim, stlbe.tid, stlbe.word0, stlbe.word1,
 	            stlbe.word2, handler);
-- 
1.6.0.3


  parent reply	other threads:[~2008-12-14  8:18 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-12-14  8:06 [PATCH 00/36] KVM Updates for 2.6.29 (part 3 of 3) Avi Kivity
2008-12-14  8:06 ` [PATCH 01/36] KVM: x86 emulator: reduce duplication in one operand emulation thunks Avi Kivity
2008-12-14  8:06 ` [PATCH 02/36] KVM: x86 emulator: consolidate emulation of two operand instructions Avi Kivity
2008-12-14  8:06 ` [PATCH 03/36] KVM: s390: Fix refcounting and allow module unload Avi Kivity
2008-12-14  8:06 ` [PATCH 04/36] KVM: s390: Fix memory leak of vcpu->run Avi Kivity
2008-12-14  8:06 ` [PATCH 05/36] KVM: Prevent trace call into unloaded module text Avi Kivity
2008-12-14  8:06 ` [PATCH 06/36] KVM: x86 emulator: Extract 'pop' sequence into a function Avi Kivity
2008-12-14  8:06 ` [PATCH 07/36] KVM: x86 emulator: allow pop from mmio Avi Kivity
2008-12-14  8:06 ` [PATCH 08/36] KVM: x86 emulator: switch 'pop reg' instruction to emulate_pop() Avi Kivity
2008-12-14  8:06 ` [PATCH 09/36] KVM: x86 emulator: fix ret emulation Avi Kivity
2008-12-14  8:06 ` [PATCH 10/36] KVM: x86 emulator: fix popf emulation Avi Kivity
2008-12-14  8:06 ` [PATCH 11/36] KVM: Remove extraneous semicolon after do/while Avi Kivity
2008-12-14  8:06 ` [PATCH 12/36] KVM: fix sparse warning Avi Kivity
2008-12-14  8:06 ` [PATCH 13/36] KVM: VMX: " Avi Kivity
2008-12-14  8:06 ` [PATCH 14/36] KVM: remove the IRQ ACK notifier assertions Avi Kivity
2008-12-14  8:06 ` [PATCH 15/36] KVM: make kvm_unregister_irq_ack_notifier() safe Avi Kivity
2008-12-14  8:06 ` [PATCH 16/36] KVM: don't fee an unallocated irq source id Avi Kivity
2008-12-14  8:06 ` [PATCH 17/36] KVM: add KVM_USERSPACE_IRQ_SOURCE_ID assertions Avi Kivity
2008-12-14  8:06 ` [PATCH 18/36] KVM: split out kvm_free_assigned_irq() Avi Kivity
2008-12-14  8:06 ` [PATCH 19/36] KVM: ppc: support large host pages Avi Kivity
2008-12-14  8:06 ` [PATCH 20/36] powerpc/44x: declare tlb_44x_index for use in C code Avi Kivity
2008-12-14  8:06 ` [PATCH 21/36] KVM: ppc: directly insert shadow mappings into the hardware TLB Avi Kivity
2008-12-14  8:06 ` Avi Kivity [this message]
2008-12-14  8:06 ` [PATCH 23/36] KVM: ppc: Implement in-kernel exit timing statistics Avi Kivity
2008-12-14  8:06 ` [PATCH 24/36] KVM: ppc: mostly cosmetic updates to the exit timing accounting code Avi Kivity
2008-12-14  8:06 ` [PATCH 25/36] KVM: Really remove a slot when a user ask us so Avi Kivity
2008-12-14  8:06 ` [PATCH 26/36] KVM: x86 emulator: Extend the opcode descriptor Avi Kivity
2008-12-14  8:07 ` [PATCH 27/36] KVM: x86 emulator: add Src2 decode set Avi Kivity
2008-12-14  8:07 ` [PATCH 28/36] KVM: x86 emulator: add a new "implied 1" Src decode type Avi Kivity
2008-12-14  8:07 ` [PATCH 29/36] KVM: x86 emulator: add the assembler code for three operands Avi Kivity
2008-12-14  8:07 ` [PATCH 30/36] KVM: x86 emulator: add the emulation of shld and shrd instructions Avi Kivity
2008-12-14  8:07 ` [PATCH 31/36] KVM: x86 emulator: Fix handling of VMMCALL instruction Avi Kivity
2008-12-14  8:07 ` [PATCH 32/36] KVM: MMU: use page array in unsync walk Avi Kivity
2008-12-14  8:07 ` [PATCH 33/36] KVM: MMU: collapse remote TLB flushes on root sync Avi Kivity
2008-12-14  8:07 ` [PATCH 34/36] KVM: MMU: skip global pgtables on sync due to cr3 switch Avi Kivity
2008-12-14  8:07 ` [PATCH 35/36] KVM: MMU: prepopulate the shadow on invlpg Avi Kivity
2008-12-14  8:07 ` [PATCH 36/36] x86: KVM guest: kvm_get_tsc_khz: return khz, not lpj Avi Kivity

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=1229242029-13410-23-git-send-email-avi@redhat.com \
    --to=avi@redhat.com \
    --cc=hollisb@us.ibm.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®