Message ID | 20161108140125.21455-4-npiggin@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Hi Nicholas, [auto build test ERROR on powerpc/next] [also build test ERROR on v4.9-rc4] [cannot apply to next-20161108] [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/Nicholas-Piggin/powerpc-NMI-IPIs/20161109-005049 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 6.1.1-9) 6.1.1 20160705 reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/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/platforms/pseries/smp.c: In function 'pseries_cause_nmi_ipi': >> arch/powerpc/platforms/pseries/smp.c:202:7: error: implicit declaration of function 'plapr_signal_sys_reset' [-Werror=implicit-function-declaration] if (plapr_signal_sys_reset(cpu) == H_SUCCESS) ^~~~~~~~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors vim +/plapr_signal_sys_reset +202 arch/powerpc/platforms/pseries/smp.c 196 xics_cause_ipi(cpu, data); 197 } 198 199 static int pseries_cause_nmi_ipi(int cpu, int type) 200 { 201 if (type == SMP_OP_NMI_TYPE_HARD) { > 202 if (plapr_signal_sys_reset(cpu) == H_SUCCESS) 203 return 1; 204 } 205 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 023a462..d1d7fd4 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c @@ -275,19 +275,22 @@ void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr) void system_reset_exception(struct pt_regs *regs) { + nmi_enter(); + /* See if any machine dependent calls */ if (ppc_md.system_reset_exception) { if (ppc_md.system_reset_exception(regs)) - return; + goto done; } die("System Reset", regs, SIGABRT); +done: /* Must die if the interrupt is not recoverable */ if (!(regs->msr & MSR_RI)) panic("Unrecoverable System Reset"); - /* What should we do here? We could issue a shutdown or hard reset. */ + nmi_exit(); } #ifdef CONFIG_PPC64 diff --git a/arch/powerpc/platforms/pseries/ras.c b/arch/powerpc/platforms/pseries/ras.c index 904a677..bb70b26 100644 --- a/arch/powerpc/platforms/pseries/ras.c +++ b/arch/powerpc/platforms/pseries/ras.c @@ -386,6 +386,10 @@ int pSeries_system_reset_exception(struct pt_regs *regs) } fwnmi_release_errinfo(); } + + if (smp_handle_nmi_ipi(regs)) + return 1; + return 0; /* need to perform reset */ } diff --git a/arch/powerpc/platforms/pseries/smp.c b/arch/powerpc/platforms/pseries/smp.c index 0f6522c..4534c5a 100644 --- a/arch/powerpc/platforms/pseries/smp.c +++ b/arch/powerpc/platforms/pseries/smp.c @@ -196,6 +196,16 @@ static void pSeries_cause_ipi_mux(int cpu, unsigned long data) xics_cause_ipi(cpu, data); } +static int pseries_cause_nmi_ipi(int cpu, int type) +{ + if (type == SMP_OP_NMI_TYPE_HARD) { + if (plapr_signal_sys_reset(cpu) == H_SUCCESS) + return 1; + } + + return 0; +} + static __init void pSeries_smp_probe(void) { xics_smp_probe(); @@ -209,7 +219,7 @@ static __init void pSeries_smp_probe(void) static struct smp_ops_t pseries_smp_ops = { .message_pass = NULL, /* Use smp_muxed_ipi_message_pass */ .cause_ipi = NULL, /* Filled at runtime by pSeries_smp_probe() */ - .cause_nmi_ipi = NULL, + .cause_nmi_ipi = pseries_cause_nmi_ipi, .probe = pSeries_smp_probe, .kick_cpu = smp_pSeries_kick_cpu, .setup_cpu = smp_setup_cpu,