Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 3 May 2010 12:55:38 -0700
From:      Pyun YongHyeon <pyunyh@gmail.com>
To:        Mark Atkinson <atkin901@gmail.com>
Cc:        freebsd-current@freebsd.org
Subject:   Re: exclusive sleep mutex mskc0 (network driver) r = 0 (0xc32c3690) locked @ /usr/src/sys/dev/msk/if_msk.c:3589
Message-ID:  <20100503195538.GF1231@michelle.cdnetworks.com>
In-Reply-To: <hrml0k$lqe$1@dough.gmane.org>
References:  <hrml0k$lqe$1@dough.gmane.org>

next in thread | previous in thread | raw e-mail | index | archive | help

--fUYQa+Pmc3FrFX/N
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Mon, May 03, 2010 at 07:01:56AM -0700, Mark Atkinson wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> I updated to current yesterday and got the following 'witness_warn'
> panic upon executing 'reboot':
> 
> suspending ithread with the following locks held:
> exclusive sleep mutex mskc0 (network driver) r = 0 (0xc32c3690) locked @
> /usr/src/sys/dev/msk/if_msk.c:3589
> panic: witness_warn
> cpuid = 0
> KDB: enter: panic
> Physical memory: 495 MB
> Dumping 80 MB: 65 49 33 17 1
> 
> 
>    3579 static void
>    3580 msk_intr(void *xsc)
>    3581 {
>    3582     struct msk_softc *sc;
>    3583     struct msk_if_softc *sc_if0, *sc_if1;
>    3584     struct ifnet *ifp0, *ifp1;
>    3585     uint32_t status;
>    3586     int domore;
>    3587
>    3588     sc = xsc;
>    3589     MSK_LOCK(sc);

It seems msk(4) didn't honor IFF_DRV_RUNNING in status block update
check so it continued to process received packets.
Would you try attached patch?

--fUYQa+Pmc3FrFX/N
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment; filename="msk.rx.patch"

Index: sys/dev/msk/if_msk.c
===================================================================
--- sys/dev/msk/if_msk.c	(revision 207572)
+++ sys/dev/msk/if_msk.c	(working copy)
@@ -2904,20 +2904,15 @@
 	sc = device_get_softc(dev);
 	MSK_LOCK(sc);
 	for (i = 0; i < sc->msk_num_port; i++) {
-		if (sc->msk_if[i] != NULL)
+		if (sc->msk_if[i] != NULL && sc->msk_if[i]->msk_ifp != NULL &&
+		    ((sc->msk_if[i]->msk_ifp->if_drv_flags &
+		    IFF_DRV_RUNNING) != 0))
 			msk_stop(sc->msk_if[i]);
 	}
+	MSK_UNLOCK(sc);
 
-	/* Disable all interrupts. */
-	CSR_WRITE_4(sc, B0_IMSK, 0);
-	CSR_READ_4(sc, B0_IMSK);
-	CSR_WRITE_4(sc, B0_HWE_IMSK, 0);
-	CSR_READ_4(sc, B0_HWE_IMSK);
-
 	/* Put hardware reset. */
 	CSR_WRITE_2(sc, B0_CTST, CS_RST_SET);
-
-	MSK_UNLOCK(sc);
 	return (0);
 }
 
@@ -3525,6 +3520,8 @@
 			sc_if->msk_csum = status;
 			break;
 		case OP_RXSTAT:
+			if (!(sc_if->msk_ifp->if_drv_flags & IFF_DRV_RUNNING))
+				break;
 			if (sc_if->msk_framesize >
 			    (MCLBYTES - MSK_RX_BUF_ALIGN))
 				msk_jumbo_rxeof(sc_if, status, control, len);

--fUYQa+Pmc3FrFX/N--



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