Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: change "panic: i82489_icr_wait: busy" when entering DDB to warning



Hi,

On Wed, Oct 28, 2015 at 12:56 AM, Christoph Badura <bad%bsd.de@localhost> wrote:

> I get an annoying recursive "panic: i82489_icr_wait: busy" when invoking
> DDB from the console on my Dell PE1400SC machines. C.f. the console log at
> the end.

Could you try the attached patch.

Regards,
-- 
Kimihiro Nonaka
diff --git a/sys/arch/amd64/amd64/db_interface.c b/sys/arch/amd64/amd64/db_interface.c
index 5b07bf197f3..df64670046f 100644
--- a/sys/arch/amd64/amd64/db_interface.c
+++ b/sys/arch/amd64/amd64/db_interface.c
@@ -131,11 +131,25 @@ db_suspend_others(void)
 	win = (ddb_cpu == cpu_me);
 	__cpu_simple_unlock(&db_lock);
 	if (win) {
+		CPU_INFO_ITERATOR cii;
+		struct cpu_info *ci, *self = curcpu();
+		bool do_ipi = false;
+
+		for (CPU_INFO_FOREACH(cii, ci)) {
+			if (ci == self)
+				continue;
+			if ((ci->ci_flags & CPUF_RUNNING) == 0)
+				continue;
+			do_ipi = true;
+			break;
+		}
+		if (do_ipi) {
 #ifdef XEN
-		xen_broadcast_ipi(XEN_IPI_DDB);
+			xen_broadcast_ipi(XEN_IPI_DDB);
 #else
-		x86_ipi(ddb_vec, LAPIC_DEST_ALLEXCL, LAPIC_DLMODE_FIXED);
+			x86_ipi(ddb_vec, LAPIC_DEST_ALLEXCL, LAPIC_DLMODE_FIXED);
 #endif /* XEN */
+		}
 
 	}
 	ddb_mp_online = x86_mp_online;
diff --git a/sys/arch/i386/i386/db_interface.c b/sys/arch/i386/i386/db_interface.c
index 5b51554eefa..c8580801de7 100644
--- a/sys/arch/i386/i386/db_interface.c
+++ b/sys/arch/i386/i386/db_interface.c
@@ -142,11 +142,25 @@ db_suspend_others(void)
 	win = (ddb_cpu == cpu_me);
 	__cpu_simple_unlock(&db_lock);
 	if (win) {
+		CPU_INFO_ITERATOR cii;
+		struct cpu_info *ci, *self = curcpu();
+		bool do_ipi = false;
+
+		for (CPU_INFO_FOREACH(cii, ci)) {
+			if (ci == self)
+				continue;
+			if ((ci->ci_flags & CPUF_RUNNING) == 0)
+				continue;
+			do_ipi = true;
+			break;
+		}
+		if (do_ipi) {
 #ifdef XEN
-		xen_broadcast_ipi(XEN_IPI_DDB);
+			xen_broadcast_ipi(XEN_IPI_DDB);
 #else
-		x86_ipi(ddb_vec, LAPIC_DEST_ALLEXCL, LAPIC_DLMODE_FIXED);
+			x86_ipi(ddb_vec, LAPIC_DEST_ALLEXCL, LAPIC_DLMODE_FIXED);
 #endif /* XEN */
+		}
 	}
 	ddb_mp_online = x86_mp_online;
 	x86_mp_online = false;


Home | Main Index | Thread Index | Old Index