diff mbox

[v2,10/11] powerpc/kvm: Store the MMU mode in the PACA on KVM exit

Message ID 20171123043619.15301-10-benh@kernel.crashing.org (mailing list archive)
State New, archived
Headers show

Commit Message

Benjamin Herrenschmidt Nov. 23, 2017, 4:36 a.m. UTC
This stores the MMU mode (real vs. virt) in the PACA on exceptions
that do a KVM test.

At the moment, we do this unconditionally in those exceptions due
to how the macro system is put together. In the future we could
find a way to only do it when actually exiting a guest.

This will avoid a pile of mfmsr in the KVM exit path

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
 arch/powerpc/include/asm/exception-64s.h  | 38 ++++++++++++++++++++++---------
 arch/powerpc/include/asm/kvm_book3s_asm.h |  1 +
 arch/powerpc/kernel/asm-offsets.c         |  1 +
 arch/powerpc/kernel/exceptions-64s.S      | 15 +++++++-----
 4 files changed, 38 insertions(+), 17 deletions(-)

Comments

kernel test robot Nov. 24, 2017, 3:15 p.m. UTC | #1
Hi Benjamin,

I love your patch! Yet something to improve:

[auto build test ERROR on powerpc/next]
[also build test ERROR on v4.14 next-20171124]
[cannot apply to kvm-ppc/kvm-ppc-next]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Benjamin-Herrenschmidt/powerpc-kvm-xive-Add-more-debugfs-queues-info/20171124-190202
base:   https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next
config: powerpc-defconfig (attached as .config)
compiler: powerpc64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=powerpc 

All errors (new ones prefixed by >>):

   arch/powerpc/kernel/exceptions-64s.S: Assembler messages:
>> arch/powerpc/kernel/exceptions-64s.S:803: Error: Fixed entry overflow
   arch/powerpc/kernel/exceptions-64s.S:803: Fatal error: .abort detected.  Abandoning ship.

vim +803 arch/powerpc/kernel/exceptions-64s.S

c78d9b974 Nicholas Piggin        2016-09-21  801  
a5d4f3ad3 Benjamin Herrenschmidt 2011-04-05  802  
1a6822d19 Nicholas Piggin        2016-12-06 @803  EXC_REAL_MASKABLE(decrementer, 0x900, 0x80)
1a6822d19 Nicholas Piggin        2016-12-06  804  EXC_VIRT_MASKABLE(decrementer, 0x4900, 0x80, 0x900)
39c0da57a Nicholas Piggin        2016-09-21  805  TRAMP_KVM(PACA_EXGEN, 0x900)
39c0da57a Nicholas Piggin        2016-09-21  806  EXC_COMMON_ASYNC(decrementer_common, 0x900, timer_interrupt)
39c0da57a Nicholas Piggin        2016-09-21  807  
a485c7098 Paul Mackerras         2013-04-25  808  

:::::: The code at line 803 was first introduced by commit
:::::: 1a6822d194c3f627eeb6aaca6688a5d0a444663e powerpc/64s: Use (start, size) rather than (start, end) for exception handlers

:::::: TO: Nicholas Piggin <npiggin@gmail.com>
:::::: CC: Michael Ellerman <mpe@ellerman.id.au>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
Paul Mackerras Nov. 25, 2017, 5:03 a.m. UTC | #2
On Thu, Nov 23, 2017 at 03:36:18PM +1100, Benjamin Herrenschmidt wrote:
> This stores the MMU mode (real vs. virt) in the PACA on exceptions
> that do a KVM test.
> 
> At the moment, we do this unconditionally in those exceptions due
> to how the macro system is put together. In the future we could
> find a way to only do it when actually exiting a guest.
> 
> This will avoid a pile of mfmsr in the KVM exit path

Comments below...

> diff --git a/arch/powerpc/include/asm/kvm_book3s_asm.h b/arch/powerpc/include/asm/kvm_book3s_asm.h
> index 83596f32f50b..7775a278e56e 100644
> --- a/arch/powerpc/include/asm/kvm_book3s_asm.h
> +++ b/arch/powerpc/include/asm/kvm_book3s_asm.h
> @@ -118,6 +118,7 @@ struct kvmppc_host_state {
>  	void __iomem *xive_tima_phys;
>  	void __iomem *xive_tima_virt;
>  	u32 saved_xirr;
> +	u8 exit_virt;		/* MMU mode on exception exit */

This is being added in the #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
section of this struct, but as far as I can see we will need the new
field in the case where only PR and not HV is configured.  Did you try
compiling a PR-only config?

Paul.
Benjamin Herrenschmidt Nov. 26, 2017, 9:57 p.m. UTC | #3
On Sat, 2017-11-25 at 16:03 +1100, Paul Mackerras wrote:
> On Thu, Nov 23, 2017 at 03:36:18PM +1100, Benjamin Herrenschmidt wrote:
> > This stores the MMU mode (real vs. virt) in the PACA on exceptions
> > that do a KVM test.
> > 
> > At the moment, we do this unconditionally in those exceptions due
> > to how the macro system is put together. In the future we could
> > find a way to only do it when actually exiting a guest.
> > 
> > This will avoid a pile of mfmsr in the KVM exit path
> 
> Comments below...
> 
> > diff --git a/arch/powerpc/include/asm/kvm_book3s_asm.h b/arch/powerpc/include/asm/kvm_book3s_asm.h
> > index 83596f32f50b..7775a278e56e 100644
> > --- a/arch/powerpc/include/asm/kvm_book3s_asm.h
> > +++ b/arch/powerpc/include/asm/kvm_book3s_asm.h
> > @@ -118,6 +118,7 @@ struct kvmppc_host_state {
> >  	void __iomem *xive_tima_phys;
> >  	void __iomem *xive_tima_virt;
> >  	u32 saved_xirr;
> > +	u8 exit_virt;		/* MMU mode on exception exit */
> 
> This is being added in the #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
> section of this struct, but as far as I can see we will need the new
> field in the case where only PR and not HV is configured.  Did you try
> compiling a PR-only config?

Nope. There is another problem is that it causes the fixed handler to
be to big for at least one interrupt (haven't check which one, it's the
build bot who notified me). I need to re-think that. I might have to
either do separate do_* entry points or something like that too...

Ben.
diff mbox

Patch

diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h
index 9a318973af05..0921328aea78 100644
--- a/arch/powerpc/include/asm/exception-64s.h
+++ b/arch/powerpc/include/asm/exception-64s.h
@@ -238,7 +238,9 @@  END_FTR_SECTION_NESTED(ftr,ftr,943)
 	EXCEPTION_PROLOG_1(area, extra, vec);				\
 	EXCEPTION_PROLOG_PSERIES_1(label, h);
 
-#define __KVMTEST(h, n)							\
+#define __KVMTEST(h, n, v)						\
+	li	r10,v;							\
+	stb	r10,HSTATE_EXIT_VIRT(r13);				\
 	lbz	r10,HSTATE_IN_GUEST(r13);				\
 	cmpwi	r10,0;							\
 	bne	do_kvm_##h##n
@@ -348,12 +350,12 @@  END_FTR_SECTION_NESTED(ftr,ftr,943)
 	b	kvmppc_skip_##h##interrupt
 
 #ifdef CONFIG_KVM_BOOK3S_64_HANDLER
-#define KVMTEST(h, n)			__KVMTEST(h, n)
+#define KVMTEST(h, n, v)		__KVMTEST(h, n, v)
 #define KVM_HANDLER(area, h, n)		__KVM_HANDLER(area, h, n)
 #define KVM_HANDLER_SKIP(area, h, n)	__KVM_HANDLER_SKIP(area, h, n)
 
 #else
-#define KVMTEST(h, n)
+#define KVMTEST(h, n, v)
 #define KVM_HANDLER(area, h, n)
 #define KVM_HANDLER_SKIP(area, h, n)
 #endif
@@ -477,10 +479,10 @@  END_FTR_SECTION_NESTED(ftr,ftr,943)
 #define STD_RELON_EXCEPTION_HV(loc, vec, label)		\
 	SET_SCRATCH0(r13);	/* save r13 */		\
 	EXCEPTION_RELON_PROLOG_PSERIES(PACA_EXGEN, label,	\
-				       EXC_HV, KVMTEST_HV, vec);
+				       EXC_HV, KVMTEST_RELON_HV, vec);
 
 #define STD_RELON_EXCEPTION_HV_OOL(vec, label)			\
-	EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_HV, vec);	\
+	EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_RELON_HV, vec);	\
 	EXCEPTION_RELON_PROLOG_PSERIES_1(label, EXC_HV)
 
 /* This associate vector numbers with bits in paca->irq_happened */
@@ -501,18 +503,32 @@  END_FTR_SECTION_NESTED(ftr,ftr,943)
 #define _SOFTEN_TEST(h, vec)	__SOFTEN_TEST(h, vec)
 
 #define SOFTEN_TEST_PR(vec)						\
-	KVMTEST(EXC_STD, vec);						\
+	KVMTEST(EXC_STD, vec, 0);					\
 	_SOFTEN_TEST(EXC_STD, vec)
 
 #define SOFTEN_TEST_HV(vec)						\
-	KVMTEST(EXC_HV, vec);						\
+	KVMTEST(EXC_HV, vec, 0);					\
+	_SOFTEN_TEST(EXC_HV, vec)
+
+#define SOFTEN_TEST_RELON_PR(vec)					\
+	KVMTEST(EXC_STD, vec, 1);					\
+	_SOFTEN_TEST(EXC_STD, vec)
+
+#define SOFTEN_TEST_RELON_HV(vec)					\
+	KVMTEST(EXC_HV, vec, 1);					\
 	_SOFTEN_TEST(EXC_HV, vec)
 
 #define KVMTEST_PR(vec)							\
-	KVMTEST(EXC_STD, vec)
+	KVMTEST(EXC_STD, vec, 0)
 
 #define KVMTEST_HV(vec)							\
-	KVMTEST(EXC_HV, vec)
+	KVMTEST(EXC_HV, vec, 0)
+
+#define KVMTEST_RELON_PR(vec)						\
+	KVMTEST(EXC_STD, vec, 1)
+
+#define KVMTEST_RELON_HV(vec)						\
+	KVMTEST(EXC_HV, vec, 1)
 
 #define SOFTEN_NOTEST_PR(vec)		_SOFTEN_TEST(EXC_STD, vec)
 #define SOFTEN_NOTEST_HV(vec)		_SOFTEN_TEST(EXC_HV, vec)
@@ -557,10 +573,10 @@  END_FTR_SECTION_NESTED(ftr,ftr,943)
 
 #define MASKABLE_RELON_EXCEPTION_HV(loc, vec, label)			\
 	_MASKABLE_RELON_EXCEPTION_PSERIES(vec, label,			\
-					  EXC_HV, SOFTEN_TEST_HV)
+					  EXC_HV, SOFTEN_TEST_RELON_HV)
 
 #define MASKABLE_RELON_EXCEPTION_HV_OOL(vec, label)			\
-	EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_TEST_HV, vec);		\
+	EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_TEST_RELON_HV, vec);	\
 	EXCEPTION_RELON_PROLOG_PSERIES_1(label, EXC_HV)
 
 /*
diff --git a/arch/powerpc/include/asm/kvm_book3s_asm.h b/arch/powerpc/include/asm/kvm_book3s_asm.h
index 83596f32f50b..7775a278e56e 100644
--- a/arch/powerpc/include/asm/kvm_book3s_asm.h
+++ b/arch/powerpc/include/asm/kvm_book3s_asm.h
@@ -118,6 +118,7 @@  struct kvmppc_host_state {
 	void __iomem *xive_tima_phys;
 	void __iomem *xive_tima_virt;
 	u32 saved_xirr;
+	u8 exit_virt;		/* MMU mode on exception exit */
 	u64 dabr;
 	u64 host_mmcr[7];	/* MMCR 0,1,A, SIAR, SDAR, MMCR2, SIER */
 	u32 host_pmc[8];
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
index eff521c67ec3..87e3cd09659c 100644
--- a/arch/powerpc/kernel/asm-offsets.c
+++ b/arch/powerpc/kernel/asm-offsets.c
@@ -641,6 +641,7 @@  int main(void)
 	HSTATE_FIELD(HSTATE_XIVE_TIMA_PHYS, xive_tima_phys);
 	HSTATE_FIELD(HSTATE_XIVE_TIMA_VIRT, xive_tima_virt);
 	HSTATE_FIELD(HSTATE_SAVED_XIRR, saved_xirr);
+	HSTATE_FIELD(HSTATE_EXIT_VIRT, exit_virt);
 	HSTATE_FIELD(HSTATE_HOST_IPI, host_ipi);
 	HSTATE_FIELD(HSTATE_PTID, ptid);
 	HSTATE_FIELD(HSTATE_MMCR0, host_mmcr[0]);
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index 1c80bd292e48..8a0cd4fdf015 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -700,9 +700,9 @@  EXC_VIRT_BEGIN(hardware_interrupt, 0x4500, 0x100)
 	.globl hardware_interrupt_relon_hv;
 hardware_interrupt_relon_hv:
 	BEGIN_FTR_SECTION
-		_MASKABLE_RELON_EXCEPTION_PSERIES(0x500, hardware_interrupt_common, EXC_HV, SOFTEN_TEST_HV)
+		_MASKABLE_RELON_EXCEPTION_PSERIES(0x500, hardware_interrupt_common, EXC_HV, SOFTEN_TEST_RELON_HV)
 	FTR_SECTION_ELSE
-		_MASKABLE_RELON_EXCEPTION_PSERIES(0x500, hardware_interrupt_common, EXC_STD, SOFTEN_TEST_PR)
+		_MASKABLE_RELON_EXCEPTION_PSERIES(0x500, hardware_interrupt_common, EXC_STD, SOFTEN_TEST_RELON_PR)
 	ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE)
 EXC_VIRT_END(hardware_interrupt, 0x4500, 0x100)
 
@@ -870,21 +870,24 @@  EXC_COMMON(trap_0b_common, 0xb00, unknown_exception)
 	 * Userspace syscalls have already saved the PPR, hcalls must save
 	 * it before setting HMT_MEDIUM.
 	 */
-#define SYSCALL_KVMTEST							\
+#define __SYSCALL_KVMTEST(test)						\
 	mtctr	r13;							\
 	GET_PACA(r13);							\
 	std	r10,PACA_EXGEN+EX_R10(r13);				\
-	KVMTEST_PR(0xc00); /* uses r10, branch to do_kvm_0xc00_system_call */ \
+	test;	/* uses r10, branch to do_kvm_0xc00_system_call */	\
 	HMT_MEDIUM;							\
 	mfctr	r9;
+#define SYSCALL_KVMTEST		__SYSCALL_KVMTEST(KVMTEST_PR(0xc00))
+#define SYSCALL_KVMTEST_RELON	__SYSCALL_KVMTEST(KVMTEST_RELON_PR(0xc00))
 
 #else
 #define SYSCALL_KVMTEST							\
 	HMT_MEDIUM;							\
 	mr	r9,r13;							\
 	GET_PACA(r13);
+#define SYSCALL_KVMTEST_RELON SYSCALL_KVMTEST
 #endif
-	
+
 #define LOAD_SYSCALL_HANDLER(reg)					\
 	__LOAD_HANDLER(reg, system_call_common)
 
@@ -948,7 +951,7 @@  EXC_REAL_BEGIN(system_call, 0xc00, 0x100)
 EXC_REAL_END(system_call, 0xc00, 0x100)
 
 EXC_VIRT_BEGIN(system_call, 0x4c00, 0x100)
-	SYSCALL_KVMTEST /* loads PACA into r13, and saves r13 to r9 */
+	SYSCALL_KVMTEST_RELON /* loads PACA into r13, and saves r13 to r9 */
 	SYSCALL_FASTENDIAN_TEST
 	SYSCALL_VIRT
 	SYSCALL_FASTENDIAN