From: Johannes Berg <johannes@sipsolutions.net>
To: Michael Buesch <mb@bu3sch.de>
Cc: bcm43xx-dev@lists.berlios.de,
David Ellingsworth <david@identd.dyndns.org>,
linux-wireless@vger.kernel.org
Subject: Re: mac80211 local_bh_enable called with IRQs disabled (was: b43legacy kernel warning)
Date: Wed, 18 Jun 2008 12:02:47 +0200 [thread overview]
Message-ID: <1213783367.1312.2.camel@johannes.berg> (raw)
In-Reply-To: <200806172320.18778.mb@bu3sch.de>
On Tue, 2008-06-17 at 23:20 +0200, Michael Buesch wrote:
> On Tuesday 17 June 2008 22:59:52 David Ellingsworth wrote:
> > I ran into this error today from a kernel I built last night based on
> > the latest wireless-testing branch. Correct me if I'm wrong, but it
> > looks to be b43legacy related. I'm a bit new to kernel debugging but
> > can try to provide additional information if instructions on how to do
> > so are provided.
>
> No, this is a mac80211 bug
Can you try the patch below?
johannes
--- everything.orig/net/mac80211/sta_info.h 2008-06-18 10:07:24.000000000 +0200
+++ everything/net/mac80211/sta_info.h 2008-06-18 11:58:32.000000000 +0200
@@ -164,6 +164,7 @@ struct sta_ampdu_mlme {
* @aid: STA's unique AID (1..2007, 0 = not assigned yet),
* only used in AP (and IBSS?) mode
* @flags: STA flags, see &enum ieee80211_sta_info_flags
+ * @flaglock: spinlock for flags accesses
* @ps_tx_buf: buffer of frames to transmit to this station
* when it leaves power saving state
* @tx_filtered: buffer of frames we already tried to transmit
@@ -186,6 +187,7 @@ struct sta_info {
struct rate_control_ref *rate_ctrl;
void *rate_ctrl_priv;
spinlock_t lock;
+ spinlock_t flaglock;
struct ieee80211_ht_info ht_info;
u64 supp_rates[IEEE80211_NUM_BANDS];
u8 addr[ETH_ALEN];
@@ -198,7 +200,10 @@ struct sta_info {
*/
u8 pin_status;
- /* frequently updated information, locked with lock spinlock */
+ /*
+ * frequently updated, locked with own spinlock (flaglock),
+ * use the accessors defined below
+ */
u32 flags;
/*
@@ -293,34 +298,41 @@ static inline enum plink_state sta_plink
static inline void set_sta_flags(struct sta_info *sta, const u32 flags)
{
- spin_lock_bh(&sta->lock);
+ unsigned long irqfl;
+
+ spin_lock_irqsave(&sta->flaglock, irqfl);
sta->flags |= flags;
- spin_unlock_bh(&sta->lock);
+ spin_unlock_irqrestore(&sta->flaglock, irqfl);
}
static inline void clear_sta_flags(struct sta_info *sta, const u32 flags)
{
- spin_lock_bh(&sta->lock);
+ unsigned long irqfl;
+
+ spin_lock_irqsave(&sta->flaglock, irqfl);
sta->flags &= ~flags;
- spin_unlock_bh(&sta->lock);
+ spin_unlock_irqrestore(&sta->flaglock, irqfl);
}
static inline void set_and_clear_sta_flags(struct sta_info *sta,
const u32 set, const u32 clear)
{
- spin_lock_bh(&sta->lock);
+ unsigned long irqfl;
+
+ spin_lock_irqsave(&sta->flaglock, irqfl);
sta->flags |= set;
sta->flags &= ~clear;
- spin_unlock_bh(&sta->lock);
+ spin_unlock_irqrestore(&sta->flaglock, irqfl);
}
static inline u32 test_sta_flags(struct sta_info *sta, const u32 flags)
{
u32 ret;
+ unsigned long irqfl;
- spin_lock_bh(&sta->lock);
+ spin_lock_irqsave(&sta->flaglock, irqfl);
ret = sta->flags & flags;
- spin_unlock_bh(&sta->lock);
+ spin_unlock_irqrestore(&sta->flaglock, irqfl);
return ret;
}
@@ -329,11 +341,12 @@ static inline u32 test_and_clear_sta_fla
const u32 flags)
{
u32 ret;
+ unsigned long irqfl;
- spin_lock_bh(&sta->lock);
+ spin_lock_irqsave(&sta->flaglock, irqfl);
ret = sta->flags & flags;
sta->flags &= ~flags;
- spin_unlock_bh(&sta->lock);
+ spin_unlock_irqrestore(&sta->flaglock, irqfl);
return ret;
}
@@ -341,10 +354,11 @@ static inline u32 test_and_clear_sta_fla
static inline u32 get_sta_flags(struct sta_info *sta)
{
u32 ret;
+ unsigned long irqfl;
- spin_lock_bh(&sta->lock);
+ spin_lock_irqsave(&sta->flaglock, irqfl);
ret = sta->flags;
- spin_unlock_bh(&sta->lock);
+ spin_unlock_irqrestore(&sta->flaglock, irqfl);
return ret;
}
--- everything.orig/net/mac80211/sta_info.c 2008-06-18 11:56:44.000000000 +0200
+++ everything/net/mac80211/sta_info.c 2008-06-18 11:56:58.000000000 +0200
@@ -235,6 +235,7 @@ struct sta_info *sta_info_alloc(struct i
return NULL;
spin_lock_init(&sta->lock);
+ spin_lock_init(&sta->flaglock);
memcpy(sta->addr, addr, ETH_ALEN);
sta->local = local;
next prev parent reply other threads:[~2008-06-18 10:03 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <30353c3d0806171359k6d7be389g23dfc809f288d2f1@mail.gmail.com>
2008-06-17 21:20 ` mac80211 local_bh_enable called with IRQs disabled (was: b43legacy kernel warning) Michael Buesch
2008-06-18 10:02 ` Johannes Berg [this message]
2008-06-18 12:30 ` David Ellingsworth
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1213783367.1312.2.camel@johannes.berg \
--to=johannes@sipsolutions.net \
--cc=bcm43xx-dev@lists.berlios.de \
--cc=david@identd.dyndns.org \
--cc=linux-wireless@vger.kernel.org \
--cc=mb@bu3sch.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox