svn commit: r206429 - head/sys/dev/e1000

Bjoern A. Zeeb bz at FreeBSD.org
Sat Apr 10 15:55:08 UTC 2010


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.


More information about the svn-src-all mailing list