Skip to content

Commit b03827d

Browse files
author
Fox Snowpatch
committed
1 parent a2f7734 commit b03827d

3 files changed

Lines changed: 30 additions & 1 deletion

File tree

arch/powerpc/include/asm/smp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ struct smp_ops_t {
4747
void (*cause_ipi)(int cpu);
4848
#endif
4949
int (*cause_nmi_ipi)(int cpu);
50+
void (*set_crash_nmi_ipi)(void);
5051
void (*probe)(void);
5152
int (*kick_cpu)(int nr);
5253
int (*prepare_cpu)(int nr);

arch/powerpc/kernel/smp.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,7 @@ void crash_send_ipi(void (*crash_ipi_callback)(struct pt_regs *))
594594
{
595595
int cpu;
596596

597+
smp_ops->set_crash_nmi_ipi();
597598
smp_send_nmi_ipi(NMI_IPI_ALL_OTHERS, crash_ipi_callback, 1000000);
598599
if (kdump_in_progress() && crash_wake_offline) {
599600
for_each_present_cpu(cpu) {

arch/powerpc/platforms/pseries/smp.c

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@
5151
*/
5252
static cpumask_var_t of_spin_mask;
5353

54+
55+
static int crash_nmi_ipi;
56+
5457
/* Query where a cpu is now. Return codes #defined in plpar_wrappers.h */
5558
int smp_query_cpu_stopped(unsigned int pcpu)
5659
{
@@ -171,12 +174,35 @@ static void dbell_or_ic_cause_ipi(int cpu)
171174
ic_cause_ipi(cpu);
172175
}
173176

177+
static void pseries_set_crash_nmi_ipi(void)
178+
{
179+
crash_nmi_ipi = 1;
180+
}
181+
174182
static int pseries_cause_nmi_ipi(int cpu)
175183
{
176184
int hwcpu;
185+
int k, curcpu;
177186

187+
curcpu = smp_processor_id();
178188
if (cpu == NMI_IPI_ALL_OTHERS) {
179-
hwcpu = H_SIGNAL_SYS_RESET_ALL_OTHERS;
189+
if (crash_nmi_ipi) {
190+
for_each_present_cpu(k) {
191+
if (k != curcpu) {
192+
hwcpu = get_hard_smp_processor_id(k);
193+
194+
/* it is possible that cpu is present,
195+
* but not started yet.
196+
*/
197+
198+
if (paca_ptrs[hwcpu]->cpu_start == 1) {
199+
plpar_signal_sys_reset(hwcpu);
200+
}
201+
}
202+
}
203+
return 1;
204+
} else
205+
hwcpu = H_SIGNAL_SYS_RESET_ALL_OTHERS;
180206
} else {
181207
if (cpu < 0) {
182208
WARN_ONCE(true, "incorrect cpu parameter %d", cpu);
@@ -243,6 +269,7 @@ static struct smp_ops_t pseries_smp_ops = {
243269
.message_pass = NULL, /* Use smp_muxed_ipi_message_pass */
244270
.cause_ipi = NULL, /* Filled at runtime by pSeries_smp_probe() */
245271
.cause_nmi_ipi = pseries_cause_nmi_ipi,
272+
.set_crash_nmi_ipi = pseries_set_crash_nmi_ipi,
246273
.probe = pSeries_smp_probe,
247274
.prepare_cpu = pseries_smp_prepare_cpu,
248275
.kick_cpu = smp_pSeries_kick_cpu,

0 commit comments

Comments
 (0)