Patch "mac80211: avoid excessive stack usage in sta_info" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
mac80211: avoid excessive stack usage in sta_info
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
mac80211-avoid-excessive-stack-usage-in-sta_info.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
0ef049dc1167fe834d0ad5d63f89eddc5c70f6e4Mon Sep 17 00:00:00 2001
From: Arnd Bergmann <[email protected]>
Date: Tue, 26 Jan 2016 23:05:31 +0100
Subject: mac80211: avoid excessive stack usage in sta_info
From: Arnd Bergmann <[email protected]>
commit 0ef049dc1167fe834d0ad5d63f89eddc5c70f6e4 upstream.
When CONFIG_OPTIMIZE_INLINING is set, the sta_info_insert_finish function consumes more stack than normally, exceeding the 1024 byte limit on ARM:
net/mac80211/sta_info.c: In function 'sta_info_insert_finish':net/mac80211/sta_info.c:561:1: error: the frame size of 1080 bytes is larger than 1024 bytes [-Werror=frame-larger-than=]
It turns out that there are two functions that put a 'struct station_info' on the stack: __sta_info_destroy_part2 and sta_info_insert_finish, and this structure alone requires up to 792 bytes.
Hoping that both are called rarely enough, this replaces the on-stack structure with a dynamic allocation, which unfortunately requires some suboptimal error handling for out-of-memory.
The __sta_info_destroy_part2 function is actually affected by the stack usage twice because it calls cfg80211_del_sta_sinfo(), which has another instance of struct station_info on its stack.
--- net/mac80211/sta_info.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-)
net/mac80211/sta_info.c +16 -8
@@ -484,11 +484,17 @@ static int sta_info_insert_finish(struct {struct ieee80211_local *local = sta->local;struct ieee80211_sub_if_data *sdata = sta->sdata; -struct station_info sinfo; +struct station_info *sinfo;int err =0 ;lockdep_assert_held (&local->sta_mtx); + sinfo =kzalloc (sizeof (struct station_info ),GFP_KERNEL ); +if (!sinfo) { + err = -ENOMEM ; + goto out_err; + } +/* check if STA exists already */ if (sta_info_get_bss (sdata, sta->sta.addr)) { err = -EEXIST ;
@@ -522,10 +528,9 @@ static int sta_info_insert_finish(structieee80211_sta_debugfs_add (sta);rate_control_add_sta_debugfs (sta); -memset (&sinfo,0 ,sizeof (sinfo)); - sinfo.filled =0 ; - sinfo.generation = local->sta_generation; -cfg80211_new_sta (sdata->dev, sta->sta.addr, &sinfo,GFP_KERNEL ); + sinfo->generation = local->sta_generation; +cfg80211_new_sta (sdata->dev, sta->sta.addr, sinfo,GFP_KERNEL ); +kfree (sinfo);sta_dbg (sdata,"Inserted STA %pM\n" , sta->sta.addr);
@@ -885,7 +890,7 @@ static void __sta_info_destroy_part2(str {struct ieee80211_local *local = sta->local;struct ieee80211_sub_if_data *sdata = sta->sdata; -struct station_info sinfo = {}; +struct station_info *sinfo;int ret;/*
@@ -923,8 +928,11 @@ static void __sta_info_destroy_part2(strsta_dbg (sdata,"Removed STA %pM\n" , sta->sta.addr); -sta_set_sinfo (sta, &sinfo); -cfg80211_del_sta_sinfo (sdata->dev, sta->sta.addr, &sinfo,GFP_KERNEL ); + sinfo =kzalloc (sizeof (*sinfo),GFP_KERNEL ); +if (sinfo) +sta_set_sinfo (sta, sinfo); +cfg80211_del_sta_sinfo (sdata->dev, sta->sta.addr, sinfo,GFP_KERNEL ); +kfree (sinfo);rate_control_remove_sta_debugfs (sta);ieee80211_sta_debugfs_remove (sta);
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/mac80211-avoid-excessive-stack-usage-in-sta_info.patch queue-4.4/farsync-fix-off-by-one-bug-in-fst_add_one.patch queue-4.4/pcmcia-db1xxx_ss-fix-last-irq_to_gpio-user.patch queue-4.4/ath9k-fix-buffer-overrun-for-ar9287.patch queue-4.4/iio-st_magn-always-define-st_magn_trigger_set_state.patch queue-4.4/hwmon-max1111-return-enodev-from-max1111_read_channel-if-not-instantiated.patch queue-4.4/mlx4-add-missing-braces-in-verify_qp_parameters.patch