@@ -176,6 +176,7 @@ module_param_named(debug, uv_nmi_debug, int, 0644);
176
176
* "kdump" - do crash dump
177
177
* "kdb" - enter KDB (default)
178
178
* "kgdb" - enter KGDB
179
+ * "health" - check if CPUs respond to NMI
179
180
*/
180
181
static char uv_nmi_action [8 ] = "kdb" ;
181
182
module_param_string (action , uv_nmi_action , sizeof (uv_nmi_action ), 0644 );
@@ -571,6 +572,22 @@ static void uv_nmi_sync_exit(int master)
571
572
}
572
573
}
573
574
575
+ /* Current "health" check is to check which CPU's are responsive */
576
+ static void uv_nmi_action_health (int cpu , struct pt_regs * regs , int master )
577
+ {
578
+ if (master ) {
579
+ int in = atomic_read (& uv_nmi_cpus_in_nmi );
580
+ int out = num_online_cpus () - in ;
581
+
582
+ pr_alert ("UV: NMI CPU health check (non-responding:%d)\n" , out );
583
+ atomic_set (& uv_nmi_slave_continue , SLAVE_EXIT );
584
+ } else {
585
+ while (!atomic_read (& uv_nmi_slave_continue ))
586
+ cpu_relax ();
587
+ }
588
+ uv_nmi_sync_exit (master );
589
+ }
590
+
574
591
/* Walk through cpu list and dump state of each */
575
592
static void uv_nmi_dump_state (int cpu , struct pt_regs * regs , int master )
576
593
{
@@ -747,7 +764,9 @@ int uv_handle_nmi(unsigned int reason, struct pt_regs *regs)
747
764
uv_nmi_wait (master );
748
765
749
766
/* Process actions other than "kdump": */
750
- if (uv_nmi_action_is ("ips" ) || uv_nmi_action_is ("dump" )) {
767
+ if (uv_nmi_action_is ("health" )) {
768
+ uv_nmi_action_health (cpu , regs , master );
769
+ } else if (uv_nmi_action_is ("ips" ) || uv_nmi_action_is ("dump" )) {
751
770
uv_nmi_dump_state (cpu , regs , master );
752
771
} else if (uv_nmi_action_is ("kdb" ) || uv_nmi_action_is ("kgdb" )) {
753
772
uv_call_kgdb_kdb (cpu , regs , master );
0 commit comments