I ran into a stack frame size warning in code that hasn't changed much
recently, no idea why I didn't spot this earlier despite build many
thousand randconfigs.

drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c: In function 
'ieee80211_rx_mgt_rsl':
drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c:2563:1: error: the frame size 
of 1676 bytes is larger than 1024 bytes [-Werror=frame-larger-than=]

We have a couple of other copies of the same function in the kernel,
and they simply don't put a gigantic structure on the stack, so I'm
changing this copy to do the same as the others, replacing the
stack variable with a GFP_ATOMIC allocation.

Signed-off-by: Arnd Bergmann <a...@arndb.de>
---
This one is not important, as it only seems to show up in rare
configurations. I'd suggest adding it to staging-next for 4.14
after the merge window.
---
 drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c | 62 +++++++++++------------
 1 file changed, 31 insertions(+), 31 deletions(-)

diff --git a/drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c 
b/drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c
index 780059c3eb60..59274d6c982f 100644
--- a/drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c
+++ b/drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c
@@ -2324,12 +2324,12 @@ static inline int is_beacon(__le16 fc)
        return (WLAN_FC_GET_STYPE(le16_to_cpu(fc)) == IEEE80211_STYPE_BEACON);
 }
 
-static inline void ieee80211_process_probe_response(
+static void ieee80211_process_probe_response(
        struct ieee80211_device *ieee,
        struct ieee80211_probe_response *beacon,
        struct ieee80211_rx_stats *stats)
 {
-       struct ieee80211_network network;
+       struct ieee80211_network *network;
        struct ieee80211_network *target;
        struct ieee80211_network *oldest = NULL;
 #ifdef CONFIG_IEEE80211_DEBUG
@@ -2341,7 +2341,7 @@ static inline void ieee80211_process_probe_response(
        u16 capability;
        //u8 wmm_info;
 
-       memset(&network, 0, sizeof(struct ieee80211_network));
+       network = kzalloc(sizeof(*network), GFP_ATOMIC);
        capability = le16_to_cpu(beacon->capability);
        IEEE80211_DEBUG_SCAN(
                "'%s' (%pM): %c%c%c%c %c%c%c%c-%c%c%c%c %c%c%c%c\n",
@@ -2364,7 +2364,7 @@ static inline void ieee80211_process_probe_response(
                (capability & (1 << 0x1)) ? '1' : '0',
                (capability & (1 << 0x0)) ? '1' : '0');
 
-       if (ieee80211_network_init(ieee, beacon, &network, stats)) {
+       if (ieee80211_network_init(ieee, beacon, network, stats)) {
                IEEE80211_DEBUG_SCAN("Dropped '%s' (%pM) via %s.\n",
                                     escape_essid(info_element->data,
                                                  info_element->len),
@@ -2381,7 +2381,7 @@ static inline void ieee80211_process_probe_response(
        //       then wireless adapter should do active scan from ch1~11 and
        //       passive scan from ch12~14
 
-       if (!IsLegalChannel(ieee, network.channel))
+       if (!IsLegalChannel(ieee, network->channel))
                return;
        if (ieee->bGlobalDomain)
        {
@@ -2390,8 +2390,8 @@ static inline void ieee80211_process_probe_response(
                        // Case 1: Country code
                        if(IS_COUNTRY_IE_VALID(ieee) )
                        {
-                               if (!IsLegalChannel(ieee, network.channel)) {
-                                       printk("GetScanInfo(): For Country 
code, filter probe response at channel(%d).\n", network.channel);
+                               if (!IsLegalChannel(ieee, network->channel)) {
+                                       printk("GetScanInfo(): For Country 
code, filter probe response at channel(%d).\n", network->channel);
                                        return;
                                }
                        }
@@ -2399,9 +2399,9 @@ static inline void ieee80211_process_probe_response(
                        else
                        {
                                // Filter over channel ch12~14
-                               if (network.channel > 11)
+                               if (network->channel > 11)
                                {
-                                       printk("GetScanInfo(): For Global 
Domain, filter probe response at channel(%d).\n", network.channel);
+                                       printk("GetScanInfo(): For Global 
Domain, filter probe response at channel(%d).\n", network->channel);
                                        return;
                                }
                        }
@@ -2411,8 +2411,8 @@ static inline void ieee80211_process_probe_response(
                        // Case 1: Country code
                        if(IS_COUNTRY_IE_VALID(ieee) )
                        {
-                               if (!IsLegalChannel(ieee, network.channel)) {
-                                       printk("GetScanInfo(): For Country 
code, filter beacon at channel(%d).\n",network.channel);
+                               if (!IsLegalChannel(ieee, network->channel)) {
+                                       printk("GetScanInfo(): For Country 
code, filter beacon at channel(%d).\n",network->channel);
                                        return;
                                }
                        }
@@ -2420,9 +2420,9 @@ static inline void ieee80211_process_probe_response(
                        else
                        {
                                // Filter over channel ch12~14
-                               if (network.channel > 14)
+                               if (network->channel > 14)
                                {
-                                       printk("GetScanInfo(): For Global 
Domain, filter beacon at channel(%d).\n",network.channel);
+                                       printk("GetScanInfo(): For Global 
Domain, filter beacon at channel(%d).\n",network->channel);
                                        return;
                                }
                        }
@@ -2441,8 +2441,8 @@ static inline void ieee80211_process_probe_response(
 
        spin_lock_irqsave(&ieee->lock, flags);
 
-       if (is_same_network(&ieee->current_network, &network, ieee)) {
-               update_network(&ieee->current_network, &network);
+       if (is_same_network(&ieee->current_network, network, ieee)) {
+               update_network(&ieee->current_network, network);
                if ((ieee->current_network.mode == IEEE_N_24G || 
ieee->current_network.mode == IEEE_G)
                && ieee->current_network.berp_info_valid){
                if(ieee->current_network.erp_value& ERP_UseProtection)
@@ -2456,11 +2456,11 @@ static inline void ieee80211_process_probe_response(
                                ieee->LinkDetectInfo.NumRecvBcnInPeriod++;
                }
                else //hidden AP
-                       network.flags = (~NETWORK_EMPTY_ESSID & 
network.flags)|(NETWORK_EMPTY_ESSID & ieee->current_network.flags);
+                       network->flags = (~NETWORK_EMPTY_ESSID & 
network->flags)|(NETWORK_EMPTY_ESSID & ieee->current_network.flags);
        }
 
        list_for_each_entry(target, &ieee->network_list, list) {
-               if (is_same_network(target, &network, ieee))
+               if (is_same_network(target, network, ieee))
                        break;
                if ((oldest == NULL) ||
                    (target->last_scanned < oldest->last_scanned))
@@ -2489,16 +2489,16 @@ static inline void ieee80211_process_probe_response(
 
 #ifdef CONFIG_IEEE80211_DEBUG
                IEEE80211_DEBUG_SCAN("Adding '%s' (%pM) via %s.\n",
-                                    escape_essid(network.ssid,
-                                                 network.ssid_len),
-                                    network.bssid,
+                                    escape_essid(network->ssid,
+                                                 network->ssid_len),
+                                    network->bssid,
                                     fc == IEEE80211_STYPE_PROBE_RESP ?
                                     "PROBE RESPONSE" : "BEACON");
 #endif
-               memcpy(target, &network, sizeof(*target));
+               memcpy(target, network, sizeof(*target));
                list_add_tail(&target->list, &ieee->network_list);
                if(ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE)
-                       ieee80211_softmac_new_net(ieee,&network);
+                       ieee80211_softmac_new_net(ieee,network);
        } else {
                IEEE80211_DEBUG_SCAN("Updating '%s' (%pM) via %s.\n",
                                     escape_essid(target->ssid,
@@ -2514,22 +2514,22 @@ static inline void ieee80211_process_probe_response(
                renew = !time_after(target->last_scanned + ieee->scan_age, 
jiffies);
                //YJ,add,080819,for hidden ap
                if(is_beacon(beacon->header.frame_ctl) == 0)
-                       network.flags = (~NETWORK_EMPTY_ESSID & 
network.flags)|(NETWORK_EMPTY_ESSID & target->flags);
-               //if(strncmp(network.ssid, "linksys-c",9) == 0)
-               //      printk("====>2 network.ssid=%s FLAG=%d target.ssid=%s 
FLAG=%d\n", network.ssid, network.flags, target->ssid, target->flags);
-               if(((network.flags & NETWORK_EMPTY_ESSID) == 
NETWORK_EMPTY_ESSID) \
-                   && (((network.ssid_len > 0) && (strncmp(target->ssid, 
network.ssid, network.ssid_len)))\
-                   ||((ieee->current_network.ssid_len == 
network.ssid_len)&&(strncmp(ieee->current_network.ssid, network.ssid, 
network.ssid_len) == 0)&&(ieee->state == IEEE80211_NOLINK))))
+                       network->flags = (~NETWORK_EMPTY_ESSID & 
network->flags)|(NETWORK_EMPTY_ESSID & target->flags);
+               //if(strncmp(network->ssid, "linksys-c",9) == 0)
+               //      printk("====>2 network->ssid=%s FLAG=%d target.ssid=%s 
FLAG=%d\n", network->ssid, network->flags, target->ssid, target->flags);
+               if(((network->flags & NETWORK_EMPTY_ESSID) == 
NETWORK_EMPTY_ESSID) \
+                   && (((network->ssid_len > 0) && (strncmp(target->ssid, 
network->ssid, network->ssid_len)))\
+                   ||((ieee->current_network.ssid_len == 
network->ssid_len)&&(strncmp(ieee->current_network.ssid, network->ssid, 
network->ssid_len) == 0)&&(ieee->state == IEEE80211_NOLINK))))
                        renew = 1;
                //YJ,add,080819,for hidden ap,end
 
-               update_network(target, &network);
+               update_network(target, network);
                if(renew && (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE))
-                       ieee80211_softmac_new_net(ieee,&network);
+                       ieee80211_softmac_new_net(ieee,network);
        }
 
        spin_unlock_irqrestore(&ieee->lock, flags);
-       if 
(is_beacon(beacon->header.frame_ctl)&&is_same_network(&ieee->current_network, 
&network, ieee)&&\
+       if 
(is_beacon(beacon->header.frame_ctl)&&is_same_network(&ieee->current_network, 
network, ieee)&&\
                (ieee->state == IEEE80211_LINKED)) {
                if (ieee->handle_beacon != NULL) {
                        
ieee->handle_beacon(ieee->dev,beacon,&ieee->current_network);
-- 
2.9.0

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to