diff --git a/kernel/kgdb.c b/kernel/kgdb.c
index 85b7e5b934a7f9d23c17d2bfe43c1a70c7c03b04..4d1b3c232377a7c0e07a6c702d5590fbfd873fbb 100644
--- a/kernel/kgdb.c
+++ b/kernel/kgdb.c
@@ -561,18 +561,6 @@ static void kgdb_wait(struct pt_regs *regs)
 	smp_wmb();
 	atomic_set(&cpu_in_kgdb[cpu], 1);
 
-	/*
-	 * The primary CPU must be active to enter here, but this is
-	 * guard in case the primary CPU had not been selected if
-	 * this was an entry via nmi.
-	 */
-	while (atomic_read(&kgdb_active) == -1)
-		cpu_relax();
-
-	/* Wait till primary CPU goes completely into the debugger. */
-	while (!atomic_read(&cpu_in_kgdb[atomic_read(&kgdb_active)]))
-		cpu_relax();
-
 	/* Wait till primary CPU is done with debugging */
 	while (atomic_read(&passive_cpu_wait[cpu]))
 		cpu_relax();
@@ -1447,18 +1435,18 @@ kgdb_handle_exception(int evector, int signo, int ecode, struct pt_regs *regs)
 			atomic_set(&passive_cpu_wait[i], 1);
 	}
 
-#ifdef CONFIG_SMP
-	/* Signal the other CPUs to enter kgdb_wait() */
-	if ((!kgdb_single_step || !kgdb_contthread) && kgdb_do_roundup)
-		kgdb_roundup_cpus(flags);
-#endif
-
 	/*
 	 * spin_lock code is good enough as a barrier so we don't
 	 * need one here:
 	 */
 	atomic_set(&cpu_in_kgdb[ks->cpu], 1);
 
+#ifdef CONFIG_SMP
+	/* Signal the other CPUs to enter kgdb_wait() */
+	if ((!kgdb_single_step || !kgdb_contthread) && kgdb_do_roundup)
+		kgdb_roundup_cpus(flags);
+#endif
+
 	/*
 	 * Wait for the other CPUs to be notified and be waiting for us:
 	 */
@@ -1514,7 +1502,8 @@ int kgdb_nmicallback(int cpu, void *regs)
 {
 #ifdef CONFIG_SMP
 	if (!atomic_read(&cpu_in_kgdb[cpu]) &&
-			atomic_read(&kgdb_active) != cpu) {
+			atomic_read(&kgdb_active) != cpu &&
+			atomic_read(&cpu_in_kgdb[atomic_read(&kgdb_active)])) {
 		kgdb_wait((struct pt_regs *)regs);
 		return 0;
 	}