Commit 79b8cb97 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'powerpc-3.19-3' of git://git.kernel.org/pub/scm/linux/kernel/git/mpe/linux

Pull powerpc fixes from Michael Ellerman:

 - Wire up sys_execveat(). Tested on 32 & 64 bit.

 - Fix for kdump on LE systems with cpus hot unplugged.

 - Revert Anton's fix for "kernel BUG at kernel/smpboot.c:134!", this
   broke other platforms, we'll do a proper fix for 3.20.

* tag 'powerpc-3.19-3' of git://git.kernel.org/pub/scm/linux/kernel/git/mpe/linux:
  Revert "powerpc: Secondary CPUs must set cpu_callin_map after setting active and online"
  powerpc/kdump: Ignore failure in enabling big endian exception during crash
  powerpc: Wire up sys_execveat() syscall
parents f40bde85 1be6f10f
...@@ -86,6 +86,11 @@ extern int overlaps_crashkernel(unsigned long start, unsigned long size); ...@@ -86,6 +86,11 @@ extern int overlaps_crashkernel(unsigned long start, unsigned long size);
extern void reserve_crashkernel(void); extern void reserve_crashkernel(void);
extern void machine_kexec_mask_interrupts(void); extern void machine_kexec_mask_interrupts(void);
static inline bool kdump_in_progress(void)
{
return crashing_cpu >= 0;
}
#else /* !CONFIG_KEXEC */ #else /* !CONFIG_KEXEC */
static inline void crash_kexec_secondary(struct pt_regs *regs) { } static inline void crash_kexec_secondary(struct pt_regs *regs) { }
...@@ -106,6 +111,11 @@ static inline int crash_shutdown_unregister(crash_shutdown_t handler) ...@@ -106,6 +111,11 @@ static inline int crash_shutdown_unregister(crash_shutdown_t handler)
return 0; return 0;
} }
static inline bool kdump_in_progress(void)
{
return false;
}
#endif /* CONFIG_KEXEC */ #endif /* CONFIG_KEXEC */
#endif /* ! __ASSEMBLY__ */ #endif /* ! __ASSEMBLY__ */
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
......
...@@ -366,3 +366,4 @@ SYSCALL_SPU(seccomp) ...@@ -366,3 +366,4 @@ SYSCALL_SPU(seccomp)
SYSCALL_SPU(getrandom) SYSCALL_SPU(getrandom)
SYSCALL_SPU(memfd_create) SYSCALL_SPU(memfd_create)
SYSCALL_SPU(bpf) SYSCALL_SPU(bpf)
COMPAT_SYS(execveat)
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
#include <uapi/asm/unistd.h> #include <uapi/asm/unistd.h>
#define __NR_syscalls 362 #define __NR_syscalls 363
#define __NR__exit __NR_exit #define __NR__exit __NR_exit
#define NR_syscalls __NR_syscalls #define NR_syscalls __NR_syscalls
......
...@@ -384,5 +384,6 @@ ...@@ -384,5 +384,6 @@
#define __NR_getrandom 359 #define __NR_getrandom 359
#define __NR_memfd_create 360 #define __NR_memfd_create 360
#define __NR_bpf 361 #define __NR_bpf 361
#define __NR_execveat 362
#endif /* _UAPI_ASM_POWERPC_UNISTD_H_ */ #endif /* _UAPI_ASM_POWERPC_UNISTD_H_ */
...@@ -330,7 +330,7 @@ void default_machine_kexec(struct kimage *image) ...@@ -330,7 +330,7 @@ void default_machine_kexec(struct kimage *image)
* using debugger IPI. * using debugger IPI.
*/ */
if (crashing_cpu == -1) if (!kdump_in_progress())
kexec_prepare_cpus(); kexec_prepare_cpus();
pr_debug("kexec: Starting switchover sequence.\n"); pr_debug("kexec: Starting switchover sequence.\n");
......
...@@ -700,6 +700,7 @@ void start_secondary(void *unused) ...@@ -700,6 +700,7 @@ void start_secondary(void *unused)
smp_store_cpu_info(cpu); smp_store_cpu_info(cpu);
set_dec(tb_ticks_per_jiffy); set_dec(tb_ticks_per_jiffy);
preempt_disable(); preempt_disable();
cpu_callin_map[cpu] = 1;
if (smp_ops->setup_cpu) if (smp_ops->setup_cpu)
smp_ops->setup_cpu(cpu); smp_ops->setup_cpu(cpu);
...@@ -738,14 +739,6 @@ void start_secondary(void *unused) ...@@ -738,14 +739,6 @@ void start_secondary(void *unused)
notify_cpu_starting(cpu); notify_cpu_starting(cpu);
set_cpu_online(cpu, true); set_cpu_online(cpu, true);
/*
* CPU must be marked active and online before we signal back to the
* master, because the scheduler needs to see the cpu_online and
* cpu_active bits set.
*/
smp_wmb();
cpu_callin_map[cpu] = 1;
local_irq_enable(); local_irq_enable();
cpu_startup_entry(CPUHP_ONLINE); cpu_startup_entry(CPUHP_ONLINE);
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#include <asm/trace.h> #include <asm/trace.h>
#include <asm/firmware.h> #include <asm/firmware.h>
#include <asm/plpar_wrappers.h> #include <asm/plpar_wrappers.h>
#include <asm/kexec.h>
#include <asm/fadump.h> #include <asm/fadump.h>
#include "pseries.h" #include "pseries.h"
...@@ -267,8 +268,13 @@ static void pSeries_lpar_hptab_clear(void) ...@@ -267,8 +268,13 @@ static void pSeries_lpar_hptab_clear(void)
* out to the user, but at least this will stop us from * out to the user, but at least this will stop us from
* continuing on further and creating an even more * continuing on further and creating an even more
* difficult to debug situation. * difficult to debug situation.
*
* There is a known problem when kdump'ing, if cpus are offline
* the above call will fail. Rather than panicking again, keep
* going and hope the kdump kernel is also little endian, which
* it usually is.
*/ */
if (rc) if (rc && !kdump_in_progress())
panic("Could not enable big endian exceptions"); panic("Could not enable big endian exceptions");
} }
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment