diff options
| author | Hollis Blanchard <hollisb@us.ibm.com> | 2008-12-02 15:51:55 -0600 | 
|---|---|---|
| committer | Avi Kivity <avi@redhat.com> | 2008-12-31 16:55:09 +0200 | 
| commit | 7924bd41097ae8991c6d38cef8b1e4058e30d198 (patch) | |
| tree | b39629f81598739eb886126c5f3f8705656ce9cd /arch/powerpc/kvm/booke_interrupts.S | |
| parent | c0ca609c5f874f7d6ae8e180afe79317e1943d22 (diff) | |
| download | olio-linux-3.10-7924bd41097ae8991c6d38cef8b1e4058e30d198.tar.xz olio-linux-3.10-7924bd41097ae8991c6d38cef8b1e4058e30d198.zip  | |
KVM: ppc: directly insert shadow mappings into the hardware TLB
Formerly, we used to maintain a per-vcpu shadow TLB and on every entry to the
guest would load this array into the hardware TLB. This consumed 1280 bytes of
memory (64 entries of 16 bytes plus a struct page pointer each), and also
required some assembly to loop over the array on every entry.
Instead of saving a copy in memory, we can just store shadow mappings directly
into the hardware TLB, accepting that the host kernel will clobber these as
part of the normal 440 TLB round robin. When we do that we need less than half
the memory, and we have decreased the exit handling time for all guest exits,
at the cost of increased number of TLB misses because the host overwrites some
guest entries.
These savings will be increased on processors with larger TLBs or which
implement intelligent flush instructions like tlbivax (which will avoid the
need to walk arrays in software).
In addition to that and to the code simplification, we have a greater chance of
leaving other host userspace mappings in the TLB, instead of forcing all
subsequent tasks to re-fault all their mappings.
Signed-off-by: Hollis Blanchard <hollisb@us.ibm.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/powerpc/kvm/booke_interrupts.S')
| -rw-r--r-- | arch/powerpc/kvm/booke_interrupts.S | 48 | 
1 files changed, 0 insertions, 48 deletions
diff --git a/arch/powerpc/kvm/booke_interrupts.S b/arch/powerpc/kvm/booke_interrupts.S index 8d6929b7fdb..eb2186823e4 100644 --- a/arch/powerpc/kvm/booke_interrupts.S +++ b/arch/powerpc/kvm/booke_interrupts.S @@ -335,54 +335,6 @@ lightweight_exit:  	lwz	r3, VCPU_SHADOW_PID(r4)  	mtspr	SPRN_PID, r3 -	/* Prevent all asynchronous TLB updates. */ -	mfmsr	r5 -	lis	r6, (MSR_EE|MSR_CE|MSR_ME|MSR_DE)@h -	ori	r6, r6, (MSR_EE|MSR_CE|MSR_ME|MSR_DE)@l -	andc	r6, r5, r6 -	mtmsr	r6 - -	/* Load the guest mappings, leaving the host's "pinned" kernel mappings -	 * in place. */ -	mfspr	r10, SPRN_MMUCR			/* Save host MMUCR. */ -	li	r5, PPC44x_TLB_SIZE -	lis	r5, tlb_44x_hwater@ha -	lwz	r5, tlb_44x_hwater@l(r5) -	mtctr	r5 -	addi	r9, r4, -VCPU_TO_44X + VCPU44x_SHADOW_TLB -	addi	r5, r4, -VCPU_TO_44X + VCPU44x_SHADOW_MOD -	li	r3, 0 -1: -	lbzx	r7, r3, r5 -	cmpwi	r7, 0 -	beq	3f - -	/* Load guest entry. */ -	mulli	r11, r3, TLBE_BYTES -	add	r11, r11, r9 -	lwz	r7, 0(r11) -	mtspr	SPRN_MMUCR, r7 -	lwz	r7, 4(r11) -	tlbwe	r7, r3, PPC44x_TLB_PAGEID -	lwz	r7, 8(r11) -	tlbwe	r7, r3, PPC44x_TLB_XLAT -	lwz	r7, 12(r11) -	tlbwe	r7, r3, PPC44x_TLB_ATTRIB -3: -	addi	r3, r3, 1                       /* Increment index. */ -	bdnz	1b - -	mtspr	SPRN_MMUCR, r10			/* Restore host MMUCR. */ - -	/* Clear bitmap of modified TLB entries */ -	li	r5, PPC44x_TLB_SIZE>>2 -	mtctr	r5 -	addi	r5, r4, -VCPU_TO_44X + VCPU44x_SHADOW_MOD - 4 -	li	r6, 0 -1: -	stwu	r6, 4(r5) -	bdnz	1b -  	iccci	0, 0 /* XXX hack */  	/* Load some guest volatiles. */  |