diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/debug/debug_core.c | 9 | ||||
| -rw-r--r-- | kernel/debug/kdb/kdb_debugger.c | 4 | ||||
| -rw-r--r-- | kernel/debug/kdb/kdb_main.c | 4 | 
3 files changed, 14 insertions, 3 deletions
| diff --git a/kernel/debug/debug_core.c b/kernel/debug/debug_core.c index 1adf62b39b96..acd749736822 100644 --- a/kernel/debug/debug_core.c +++ b/kernel/debug/debug_core.c @@ -471,6 +471,7 @@ static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs,  	int cpu;  	int trace_on = 0;  	int online_cpus = num_online_cpus(); +	u64 time_left;  	kgdb_info[ks->cpu].enter_kgdb++;  	kgdb_info[ks->cpu].exception_state |= exception_state; @@ -595,9 +596,13 @@ return_normal:  	/*  	 * Wait for the other CPUs to be notified and be waiting for us:  	 */ -	while (kgdb_do_roundup && (atomic_read(&masters_in_kgdb) + -				atomic_read(&slaves_in_kgdb)) != online_cpus) +	time_left = loops_per_jiffy * HZ; +	while (kgdb_do_roundup && --time_left && +	       (atomic_read(&masters_in_kgdb) + atomic_read(&slaves_in_kgdb)) != +		   online_cpus)  		cpu_relax(); +	if (!time_left) +		pr_crit("KGDB: Timed out waiting for secondary CPUs.\n");  	/*  	 * At this point the primary processor is completely diff --git a/kernel/debug/kdb/kdb_debugger.c b/kernel/debug/kdb/kdb_debugger.c index 8859ca34dcfe..15e1a7af5dd0 100644 --- a/kernel/debug/kdb/kdb_debugger.c +++ b/kernel/debug/kdb/kdb_debugger.c @@ -129,6 +129,10 @@ int kdb_stub(struct kgdb_state *ks)  		ks->pass_exception = 1;  		KDB_FLAG_SET(CATASTROPHIC);  	} +	/* set CATASTROPHIC if the system contains unresponsive processors */ +	for_each_online_cpu(i) +		if (!kgdb_info[i].enter_kgdb) +			KDB_FLAG_SET(CATASTROPHIC);  	if (KDB_STATE(SSBPT) && reason == KDB_REASON_SSTEP) {  		KDB_STATE_CLEAR(SSBPT);  		KDB_STATE_CLEAR(DOING_SS); diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c index 8d84979cbe05..f191bddf64b8 100644 --- a/kernel/debug/kdb/kdb_main.c +++ b/kernel/debug/kdb/kdb_main.c @@ -2201,6 +2201,8 @@ static void kdb_cpu_status(void)  	for (start_cpu = -1, i = 0; i < NR_CPUS; i++) {  		if (!cpu_online(i)) {  			state = 'F';	/* cpu is offline */ +		} else if (!kgdb_info[i].enter_kgdb) { +			state = 'D';	/* cpu is online but unresponsive */  		} else {  			state = ' ';	/* cpu is responding to kdb */  			if (kdb_task_state_char(KDB_TSK(i)) == 'I') @@ -2254,7 +2256,7 @@ static int kdb_cpu(int argc, const char **argv)  	/*  	 * Validate cpunum  	 */ -	if ((cpunum > NR_CPUS) || !cpu_online(cpunum)) +	if ((cpunum > NR_CPUS) || !kgdb_info[cpunum].enter_kgdb)  		return KDB_BADCPUNUM;  	dbg_switch_cpu = cpunum; | 
