Date: Sat, 10 Apr 2010 15:53:42 +0000 (UTC) From: "Bjoern A. Zeeb" <bz@FreeBSD.org> To: Jack F Vogel <jfv@FreeBSD.org> Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r206429 - head/sys/dev/e1000 Message-ID: <20100410155034.X40281@maildrop.int.zabbadoz.net> In-Reply-To: <201004091842.o39IgFbb031014@svn.freebsd.org> References: <201004091842.o39IgFbb031014@svn.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, 9 Apr 2010, Jack F Vogel wrote: > Author: jfv > Date: Fri Apr 9 18:42:15 2010 > New Revision: 206429 > URL: http://svn.freebsd.org/changeset/base/206429 > > Log: > Incorporate suggested improvements from yongari. > > Also, from feedback, make the multiqueue code an > option (EM_MULTIQUEUE) that is off by default. > Problems have been seen with UDP when its on. > > Modified: > head/sys/dev/e1000/if_em.c > head/sys/dev/e1000/if_em.h > > Modified: head/sys/dev/e1000/if_em.c > ============================================================================== > --- head/sys/dev/e1000/if_em.c Fri Apr 9 18:02:19 2010 (r206428) > +++ head/sys/dev/e1000/if_em.c Fri Apr 9 18:42:15 2010 (r206429) .. > @@ -1427,28 +1443,23 @@ em_handle_que(void *context, int pending > struct ifnet *ifp = adapter->ifp; > struct tx_ring *txr = adapter->tx_rings; > struct rx_ring *rxr = adapter->rx_rings; > - u32 loop = EM_MAX_LOOP; > - bool more_rx, more_tx; > + bool more_rx; > > > if (ifp->if_drv_flags & IFF_DRV_RUNNING) { > + more_rx = em_rxeof(rxr, adapter->rx_process_limit); > EM_TX_LOCK(txr); > - do { > - more_rx = em_rxeof(rxr, adapter->rx_process_limit); Booting with NFS root I got a panic: 208089 Trying to mount root from nfs: .. 208107 panic: mutex em0:rx(0) not owned at /zoo/bz/HEAD_clean.svn/sys/dev/e1000/if_em.c:4093 .. 208138 db> where 208139 Tracing pid 0 tid 100050 td 0xffffff0001c43ab0 208140 kdb_enter() at kdb_enter+0x3d 208141 panic() at panic+0x1cc 208142 _mtx_assert() at _mtx_assert+0x7d 208143 em_rxeof() at em_rxeof+0x3b 208144 em_handle_que() at em_handle_que+0x4a 208145 taskqueue_run() at taskqueue_run+0xeb 208146 taskqueue_thread_loop() at taskqueue_thread_loop+0x50 208147 fork_exit() at fork_exit+0x14a 208148 fork_trampoline() at fork_trampoline+0xe 208149 --- trap 0, rip = 0, rsp = 0xffffff80001c9d30, rbp = 0 --- Not sure if this would be the correct fix locking wise but it might; at least this is where em_rxeof() get's called w/o the locking and triggers the assert. Index: sys/dev/e1000/if_em.c =================================================================== --- sys/dev/e1000/if_em.c (revision 206455) +++ sys/dev/e1000/if_em.c (working copy) @@ -1447,7 +1447,9 @@ em_handle_que(void *context, int pending) if (ifp->if_drv_flags & IFF_DRV_RUNNING) { + EM_RX_LOCK(rxr); more_rx = em_rxeof(rxr, adapter->rx_process_limit); + EM_RX_UNLOCK(rxr); EM_TX_LOCK(txr); em_txeof(txr); #ifdef EM_MULTIQUEUE -- Bjoern A. Zeeb It will not break if you know what you are doing.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20100410155034.X40281>