⬢ DragonFlyBSD Kernel Audit
DF-3906 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/netif/xl/if_xl.c	2026-09-16 22:58:01.972006667 +0000
+++ b4/sys/dev/netif/xl/if_xl.c	2026-09-16 22:58:44.679456864 +0000
@@ -2374,7 +2374,16 @@
 {
 	struct xl_softc	*sc = xsc;
 
-	lwkt_serialize_enter(sc->arpcom.ac_if.if_serializer);
+	if (!lwkt_serialize_try(sc->arpcom.ac_if.if_serializer)) {
+		/*
+		 * Never park the softclock thread on the serializer:
+		 * xl_stop() tears this callout down with the synchronous
+		 * callout_stop() while holding the same serializer
+		 * (if_xl.c:3169) -> AB-BA deadlock.  Retry next tick.
+		 */
+		callout_reset(&sc->xl_stat_timer, 1, xl_stats_update, sc);
+		return;
+	}
 	xl_stats_update_serialized(xsc);
 	lwkt_serialize_exit(sc->arpcom.ac_if.if_serializer);
 }