⬢ DragonFlyBSD Kernel Audit
DF-4159 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/netif/xe/if_xe.c
+++ b/sys/dev/netif/xe/if_xe.c
@@ -753,16 +753,19 @@ xe_intr(void *xscp)
 
 	if (len == 0) {
 	  IFNET_STAT_INC(ifp, iqdrops, 1);
+	  XE_OUTW(XE_DO, 0x8000);	/* release packet: avoid RX livelock */
 	  continue;
 	}
 
 	MGETHDR(mbp, M_NOWAIT, MT_DATA);
 	if (mbp == NULL) {
 	  IFNET_STAT_INC(ifp, iqdrops, 1);
+	  XE_OUTW(XE_DO, 0x8000);	/* release packet: avoid RX livelock */
 	  continue;
 	}
 
 	if (len + 3 > MHLEN) {
 	  MCLGET(mbp, M_NOWAIT);
 	  if ((mbp->m_flags & M_EXT) == 0) {
 	    m_freem(mbp);
 	    IFNET_STAT_INC(ifp, iqdrops, 1);
+	    XE_OUTW(XE_DO, 0x8000);	/* release packet: avoid RX livelock */
 	    continue;
 	  }
 	}