Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 28 Jul 2012 15:39:41 -0700
From:      Garrett Cooper <yanegomi@gmail.com>
To:        Arnaud Lacombe <lacombar@gmail.com>
Cc:        Adrian Chadd <adrian@freebsd.org>, Dimitry Andric <dim@freebsd.org>, current@freebsd.org
Subject:   Re: panic: _mtx_lock_sleep: recursed on non-recursive mutex em0 @ /usr/src/sys/dev/e1000/if_lem.c:881
Message-ID:  <CAGH67wT_YaXyEkAAWvQ54ro2MFBiMvbo-vWx592BmG0p6CNpKw@mail.gmail.com>
In-Reply-To: <CACqU3MWjePb5mswxh6=gMnHG9VF8ezjgtZwX6Ehk8hVo6Y8bog@mail.gmail.com>
References:  <20120726154610.GC1587@albert.catwhisker.org> <5012E233.3050007@FreeBSD.org> <CAJ-Vmo=Tgg-sYVB5b1RhP0adCYJLrp%2B4W4nvpN6M6giTnBjw7w@mail.gmail.com> <CACqU3MVLuf%2BH-ujVhTqod10uWTioeC0eLgM_fgVHUeH22o55Sg@mail.gmail.com> <CAJ-VmomrNdDJKTp8DW5AyffkGEhWvCdu23Q17%2Bm-LnEL-Ujq1g@mail.gmail.com> <CACqU3MWjePb5mswxh6=gMnHG9VF8ezjgtZwX6Ehk8hVo6Y8bog@mail.gmail.com>

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

[-- Attachment #1 --]
On Sat, Jul 28, 2012 at 2:41 PM, Arnaud Lacombe <lacombar@gmail.com> wrote:
> Hi,
>
> On Sat, Jul 28, 2012 at 4:04 PM, Adrian Chadd <adrian@freebsd.org> wrote:
>> On 28 July 2012 12:09, Arnaud Lacombe <lacombar@gmail.com> wrote:
>>
>>> How would a single ATH_LOCK() helps here ? AFAICS, the panic seem to
>>> be a classical fallout from direct dispatch where you can re-enter the
>>> driver from the driver itself through the network stack.
>>
>> Take a look at iwn. It has a single lock - IWN_LOCK() - which it
>> releases before punting the frame up the stack.
>>
> oh, I see. So, what happens in lem(4) is that we enter the stack with
> RX unlocked, but TX and CORE are still locked. The whole locking of
> lem(4) seems rather inconsistent. Through DEVICE_POLLING, lem_rxeof()
> is called with TX and CORE unlocked. Through EN_LEGACY_IRQ it is
> called with TX and CORE locked, and from MSI interrupt handler, is is
> caller with TX unlocked (CORE assumed to be unlock). I'd assume that
> lem(4) is just poorly maintained[0]... I would make a huge shot in the
> dark by proposing the completely untested attached patch :/
>
>  - Arnaud
>
> [0]: like code claiming support for Intel 82574 when this chipset
> *cannot* be used by lem(4), as there is no E1000_DEV_ID_82574* entries
> in `lem_vendor_info_array'.

    Close, but you missed a spot. The attached patch (based on your's)
works, i.e. no longer panics at boot on my vbox instance.
Thanks!
-Garrett

[-- Attachment #2 --]
--- //depot/user/gcooper/atf-head/src/sys/dev/e1000/if_lem.c	2012-07-25 17:11:00.000000000 0000
+++ /scratch/p4/user/gcooper/atf-head/src/sys/dev/e1000/if_lem.c	2012-07-25 17:11:00.000000000 0000
@@ -1294,12 +1294,13 @@
 	struct adapter	*adapter = arg;
 	struct ifnet	*ifp = adapter->ifp;
 	u32		reg_icr;
-
+	int locked;
 
 	if (ifp->if_capenable & IFCAP_POLLING)
 		return;
 
 	EM_CORE_LOCK(adapter);
+	locked = 1;
 	reg_icr = E1000_READ_REG(&adapter->hw, E1000_ICR);
 	if (reg_icr & E1000_ICR_RXO)
 		adapter->rx_overruns++;
@@ -1320,9 +1321,11 @@
 		    lem_local_timer, adapter);
 		goto out;
 	}
+	EM_CORE_UNLOCK(adapter);
+	locked = 0;
 
+	lem_rxeof(adapter, -1, NULL);
 	EM_TX_LOCK(adapter);
-	lem_rxeof(adapter, -1, NULL);
 	lem_txeof(adapter);
 	if (ifp->if_drv_flags & IFF_DRV_RUNNING &&
 	    !IFQ_DRV_IS_EMPTY(&ifp->if_snd))
@@ -1330,7 +1333,9 @@
 	EM_TX_UNLOCK(adapter);
 
 out:
-	EM_CORE_UNLOCK(adapter);
+	if (locked)
+		EM_CORE_UNLOCK(adapter);
+
 	return;
 }
 
help

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