svn commit: r279928 - head/sys/powerpc/pseries
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Thu Mar 12 17:01:31 UTC 2015
Author: nwhitehorn
Date: Thu Mar 12 17:01:30 2015
New Revision: 279928
URL: https://svnweb.freebsd.org/changeset/base/279928
Log:
The H_VIO_SIGNAL hypercall only enables interrupts for future received
packets and does not schedule interrupts for any packets currently
enqueued. Close two races where enqueued packets may not ever trigger
interrupts. The first of these, at adapter initialization time, was
especially severe since a rush of enqueued packets could actually fill
the receive buffer completely, stalling the interface forever.
MFC after: 2 weeks
Modified:
head/sys/powerpc/pseries/phyp_llan.c
Modified: head/sys/powerpc/pseries/phyp_llan.c
==============================================================================
--- head/sys/powerpc/pseries/phyp_llan.c Thu Mar 12 16:19:18 2015 (r279927)
+++ head/sys/powerpc/pseries/phyp_llan.c Thu Mar 12 17:01:30 2015 (r279928)
@@ -273,6 +273,9 @@ llan_init(void *xsc)
sc->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
mtx_unlock(&sc->io_lock);
+
+ /* Check for pending receives scheduled before interrupt enable */
+ llan_intr(sc);
}
static int
@@ -335,6 +338,7 @@ llan_intr(void *xsc)
struct mbuf *m;
mtx_lock(&sc->io_lock);
+restart:
phyp_hcall(H_VIO_SIGNAL, sc->unit, 0);
while ((sc->rx_buf[sc->rx_dma_slot].control >> 7) == sc->rx_valid_val) {
@@ -369,6 +373,15 @@ llan_intr(void *xsc)
}
phyp_hcall(H_VIO_SIGNAL, sc->unit, 1);
+
+ /*
+ * H_VIO_SIGNAL enables interrupts for future packets only.
+ * Make sure none were queued between the end of the loop and the
+ * enable interrupts call.
+ */
+ if ((sc->rx_buf[sc->rx_dma_slot].control >> 7) == sc->rx_valid_val)
+ goto restart;
+
mtx_unlock(&sc->io_lock);
}
More information about the svn-src-all
mailing list