Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 30 Sep 2011 16:16:47 +0800
From:      Adrian Chadd <adrian@freebsd.org>
To:        Edgar Martinez <emartinez@kbcnetworks.com>
Cc:        "freebsd-wireless@freebsd.org" <freebsd-wireless@freebsd.org>
Subject:   Re: PANIC - SWBMISS (9.0-CURRENT)
Message-ID:  <CAJ-VmonnftZxAnyucoPjzyk5tuqaUz47-GePn=LeVAOv8NURyQ@mail.gmail.com>
In-Reply-To: <CAJ-Vmo=_-honfPqHAzP_ZfRS=xorwqb3fhiOXO4rAqkt2f1Rbg@mail.gmail.com>
References:  <CAJ-VmomKosb%2B32HPFbEc68WpoZj-iNfna_6m0Rr4-_B3ZkAyOw@mail.gmail.com> <957EB052144AA64AB39F7AB268783201022F835FD4@VA3DIAXVS881.RED001.local> <CAJ-VmomMZC09KPXJSfSEZCKR1xqoLXAexS469_1qakO0yMVEEw@mail.gmail.com> <CAJ-Vmo=_-honfPqHAzP_ZfRS=xorwqb3fhiOXO4rAqkt2f1Rbg@mail.gmail.com>

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

[-- Attachment #1 --]
Ok. Can you please give this patch a whirl.

It turns out that for now, the net80211 common lock is recursive so I
can hold said lock for a while. This likely needs to be fixed.

Thanks,


Adrian

[-- Attachment #2 --]
Index: net80211/ieee80211_sta.c
===================================================================
--- net80211/ieee80211_sta.c	(revision 225772)
+++ net80211/ieee80211_sta.c	(working copy)
@@ -109,6 +109,8 @@
 {
 	struct ieee80211com *ic = vap->iv_ic;
 
+	IEEE80211_LOCK_ASSERT(ic);
+
 	KASSERT((ic->ic_flags & IEEE80211_F_SCAN) == 0, ("scanning"));
 	KASSERT(vap->iv_state >= IEEE80211_S_RUN,
 	    ("wrong state %s", ieee80211_state_name[vap->iv_state]));
Index: net80211/ieee80211_tdma.c
===================================================================
--- net80211/ieee80211_tdma.c	(revision 225772)
+++ net80211/ieee80211_tdma.c	(working copy)
@@ -285,7 +285,10 @@
 tdma_beacon_miss(struct ieee80211vap *vap)
 {
 	struct ieee80211_tdma_state *ts = vap->iv_tdma;
+	struct ieee80211com *ic = vap->iv_ic;
 
+	IEEE80211_LOCK_ASSERT(ic);
+
 	KASSERT((vap->iv_ic->ic_flags & IEEE80211_F_SCAN) == 0, ("scanning"));
 	KASSERT(vap->iv_state == IEEE80211_S_RUN,
 	    ("wrong state %d", vap->iv_state));
Index: net80211/ieee80211_proto.c
===================================================================
--- net80211/ieee80211_proto.c	(revision 225772)
+++ net80211/ieee80211_proto.c	(working copy)
@@ -193,7 +193,7 @@
 	vap->iv_rtsthreshold = IEEE80211_RTS_DEFAULT;
 	vap->iv_fragthreshold = IEEE80211_FRAG_DEFAULT;
 	vap->iv_bmiss_max = IEEE80211_BMISS_MAX;
-	callout_init(&vap->iv_swbmiss, CALLOUT_MPSAFE);
+	callout_init_mtx(&vap->iv_swbmiss, IEEE80211_LOCK_OBJ(ic), 0);
 	callout_init(&vap->iv_mgtsend, CALLOUT_MPSAFE);
 	TASK_INIT(&vap->iv_nstate_task, 0, ieee80211_newstate_cb, vap);
 	TASK_INIT(&vap->iv_swbmiss_task, 0, beacon_swmiss, vap);
@@ -1403,7 +1403,7 @@
 	struct ieee80211com *ic = arg;
 	struct ieee80211vap *vap;
 
-	/* XXX locking */
+	IEEE80211_LOCK(ic);
 	TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) {
 		/*
 		 * We only pass events through for sta vap's in RUN state;
@@ -1415,18 +1415,21 @@
 		    vap->iv_bmiss != NULL)
 			vap->iv_bmiss(vap);
 	}
+	IEEE80211_UNLOCK(ic);
 }
 
 static void
 beacon_swmiss(void *arg, int npending)
 {
 	struct ieee80211vap *vap = arg;
+	struct ieee80211com *ic = vap->iv_ic;
 
-	if (vap->iv_state != IEEE80211_S_RUN)
-		return;
-
-	/* XXX Call multiple times if npending > zero? */
-	vap->iv_bmiss(vap);
+	IEEE80211_LOCK(ic);
+	if (vap->iv_state == IEEE80211_S_RUN) {
+		/* XXX Call multiple times if npending > zero? */
+		vap->iv_bmiss(vap);
+	}
+	IEEE80211_UNLOCK(ic);
 }
 
 /*
@@ -1440,6 +1443,8 @@
 	struct ieee80211vap *vap = arg;
 	struct ieee80211com *ic = vap->iv_ic;
 
+	IEEE80211_LOCK_ASSERT(ic);
+
 	/* XXX sleep state? */
 	KASSERT(vap->iv_state == IEEE80211_S_RUN,
 	    ("wrong state %d", vap->iv_state));

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAJ-VmonnftZxAnyucoPjzyk5tuqaUz47-GePn=LeVAOv8NURyQ>