2008-04-01 01:02:22

by Luis Carlos Cobo

[permalink] [raw]
Subject: [PATCH] mac80211: fix spinlock recursion on sta expiration


Signed-off-by: Luis Carlos Cobo <[email protected]>
---
net/mac80211/ieee80211_sta.c | 2 +-
net/mac80211/sta_info.c | 2 +-
net/mac80211/sta_info.h | 1 +
3 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/net/mac80211/ieee80211_sta.c b/net/mac80211/ieee80211_sta.c
index f9cf2f1..cfe6fcc 100644
--- a/net/mac80211/ieee80211_sta.c
+++ b/net/mac80211/ieee80211_sta.c
@@ -3081,7 +3081,7 @@ static void ieee80211_sta_expire(struct net_device *dev, unsigned long exp_time)
if (time_after(jiffies, sta->last_rx + exp_time)) {
printk(KERN_DEBUG "%s: expiring inactive STA %s\n",
dev->name, print_mac(mac, sta->addr));
- sta_info_unlink(&sta);
+ __sta_info_unlink(&sta);
if (sta)
list_add(&sta->list, &tmp_list);
}
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
index f708367..ba02b43 100644
--- a/net/mac80211/sta_info.c
+++ b/net/mac80211/sta_info.c
@@ -409,7 +409,7 @@ static struct sta_info *__sta_info_unpin(struct sta_info *sta)
return ret;
}

-static void __sta_info_unlink(struct sta_info **sta)
+void __sta_info_unlink(struct sta_info **sta)
{
struct ieee80211_local *local = (*sta)->local;
struct ieee80211_sub_if_data *sdata = (*sta)->sdata;
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
index 5e39a41..d4d6dcb 100644
--- a/net/mac80211/sta_info.h
+++ b/net/mac80211/sta_info.h
@@ -347,6 +347,7 @@ int sta_info_insert(struct sta_info *sta);
* has already unlinked it.
*/
void sta_info_unlink(struct sta_info **sta);
+void __sta_info_unlink(struct sta_info **sta);

void sta_info_destroy(struct sta_info *sta);
void sta_info_set_tim_bit(struct sta_info *sta);
--
1.5.4.3





2008-04-01 12:01:31

by Johannes Berg

[permalink] [raw]
Subject: Re: [PATCH] mac80211: fix spinlock recursion on sta expiration


On Mon, 2008-03-31 at 15:21 -0700, Luis Carlos Cobo wrote:
> Signed-off-by: Luis Carlos Cobo <[email protected]>

Woah. Good catch. I hope it doesn't conflict with the other fixes I just
posted.

Acked-by: Johannes Berg <[email protected]>

> ---
> net/mac80211/ieee80211_sta.c | 2 +-
> net/mac80211/sta_info.c | 2 +-
> net/mac80211/sta_info.h | 1 +
> 3 files changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/net/mac80211/ieee80211_sta.c b/net/mac80211/ieee80211_sta.c
> index f9cf2f1..cfe6fcc 100644
> --- a/net/mac80211/ieee80211_sta.c
> +++ b/net/mac80211/ieee80211_sta.c
> @@ -3081,7 +3081,7 @@ static void ieee80211_sta_expire(struct net_device *dev, unsigned long exp_time)
> if (time_after(jiffies, sta->last_rx + exp_time)) {
> printk(KERN_DEBUG "%s: expiring inactive STA %s\n",
> dev->name, print_mac(mac, sta->addr));
> - sta_info_unlink(&sta);
> + __sta_info_unlink(&sta);
> if (sta)
> list_add(&sta->list, &tmp_list);
> }
> diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
> index f708367..ba02b43 100644
> --- a/net/mac80211/sta_info.c
> +++ b/net/mac80211/sta_info.c
> @@ -409,7 +409,7 @@ static struct sta_info *__sta_info_unpin(struct sta_info *sta)
> return ret;
> }
>
> -static void __sta_info_unlink(struct sta_info **sta)
> +void __sta_info_unlink(struct sta_info **sta)
> {
> struct ieee80211_local *local = (*sta)->local;
> struct ieee80211_sub_if_data *sdata = (*sta)->sdata;
> diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
> index 5e39a41..d4d6dcb 100644
> --- a/net/mac80211/sta_info.h
> +++ b/net/mac80211/sta_info.h
> @@ -347,6 +347,7 @@ int sta_info_insert(struct sta_info *sta);
> * has already unlinked it.
> */
> void sta_info_unlink(struct sta_info **sta);
> +void __sta_info_unlink(struct sta_info **sta);
>
> void sta_info_destroy(struct sta_info *sta);
> void sta_info_set_tim_bit(struct sta_info *sta);


Attachments:
signature.asc (828.00 B)
This is a digitally signed message part