Message ID | 20171123043619.15301-10-benh@kernel.crashing.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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
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.
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 --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
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(-)