Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 12 Mar 2015 17:01:30 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r279928 - head/sys/powerpc/pseries
Message-ID:  <201503121701.t2CH1UVT004090@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201503121701.t2CH1UVT004090>