From patchwork Mon Jul 10 14:05:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 107297 Delivered-To: patch@linaro.org Received: by 10.140.101.44 with SMTP id t41csp3467643qge; Mon, 10 Jul 2017 07:06:25 -0700 (PDT) X-Received: by 10.99.121.1 with SMTP id u1mr15353826pgc.20.1499695585251; Mon, 10 Jul 2017 07:06:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1499695585; cv=none; d=google.com; s=arc-20160816; b=rCz3UT2jO3kHgO+4MLf9pu1sYEf8yzT2IG/xVOrvjlRM0rh+WK+sXGapWjKwsgH21r mg0FUWaaT0po73JLULOrG5zUYG/scHkz0cKoa8YadWS8LY+lQdEYpjGpjXhRnQUtivtr ZjAfr4rIOhTrljzGiwk3Q906uQdeoefl4AYEGL4Th17ZiKvnJr/71qi/jjVk1e+v23ye ncxlotkKXz4GTnfX8InrpJSwIsbBQmbE7bT0A1wbp0FJpThKBBUejZc8Wvb9hXvvZdNp B4Ex1F7gD0i/2ikaz09vFGYr6qBMHpB192hnapMQ9omGKUC80VPVEyBA9Cjjfs4Khyky 368w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :arc-authentication-results; bh=Apntw3x/EwJeSW7f6CbOeifARA2sQPco9G7wJZe9Hu0=; b=HMwjXKhszWZXfXtv4LwtpPQoGQX53Wz/a2ZHYpFgFiq2IWXwKcEbR2Xk9cKC8PfS3Z WaYKZPgK6wdnAaSXfxG6oSd9JJN9MZmkDpo1PsJi0je29aTJQ4m9QR8nnVCDOOcvbup0 o0Wf1ZnRCH0jOL1deT8wMQG2OWJWpAHvgo3bdMq3+00yakU5Q8qUvT/wLOrXUUDK2/QZ yCi+KbFxkbUWwiGR7bewCroWT6z2WRA+H5SqN5+DagOvT5Nw+AhDOcBMaIBeqrYhLriG 07N/P6XVruG8Vmie4AFEUs1IWiBXW//RhtnIJyiMirpIo1fhO6CEnq0ArHYp/bK0/Kes tjtw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d9si9201041pln.48.2017.07.10.07.06.24; Mon, 10 Jul 2017 07:06:25 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932321AbdGJOGR (ORCPT + 25 others); Mon, 10 Jul 2017 10:06:17 -0400 Received: from mout.kundenserver.de ([212.227.126.133]:53998 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932221AbdGJOGQ (ORCPT ); Mon, 10 Jul 2017 10:06:16 -0400 Received: from wuerfel.lan ([5.56.224.194]) by mrelayeu.kundenserver.de (mreue004 [212.227.15.129]) with ESMTPA (Nemesis) id 0MCdZW-1dLFvk2ppC-009NZZ; Mon, 10 Jul 2017 16:05:54 +0200 From: Arnd Bergmann To: Greg Kroah-Hartman Cc: Dan Carpenter , Arnd Bergmann , "David S. Miller" , simran singhal , Bhumika Goyal , Johannes Berg , Tobias Klauser , Elise Lennion , Sebastian Haas , Jakub Jedelsky , devel@driverdev.osuosl.org, linux-kernel@vger.kernel.org Subject: [PATCH v2] staging: rtl8192u: reduce stack frame size in ieee80211_rx_mgt_rsl Date: Mon, 10 Jul 2017 16:05:28 +0200 Message-Id: <20170710140544.1976918-1-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 X-Provags-ID: V03:K0:vi/Z9PmkZk74oy/jWZmNYPu24WdlDqklM+S99SID7OpQ5PjrAOj cxSA/dqKsLfSUkzaBRnwYoNJut2z1Xx8rGIUr1KDejoqWoF2z04nOqZZt23KtQwt0cyNOtb Hsev6idk44mh50ii+0dPtdlpuWuObEJGOi4sM3SVUhWMH9ec240kBdyoaBSrHfTb/iKf+X1 1obBffiF8OsEkXeDpoZ7w== X-UI-Out-Filterresults: notjunk:1; V01:K0:mvE+Gt5bACE=:Yxg/P52pvYWdo39wtFv0qR +M3SLcHumMGsMKCH4jkCORNacbAN3c4liaUblqjbq9BnxXqybREeSZR5nGXQzGjVrFTHXVzlD BF/GBLiCLXq8cGiMFMaJF12WQDU/Fsf1Xbzo8zoAIn4ZZRVYGTsQ1yJ9AXWFHvcIOyNj3sTmv 3xYxWYAVkGeX4Fcq4tMCMvYYsc1dGe+6sQzSLtP4iJ1PR+ujeUie+mRAlUXyp8Et2lyQuFCpo +J48B70Y38ttrGVgiQ79VjzQSVxHaMKx/bafzTospDBbXbZO5bZ9n5J4uj0sF66Ub5SC68RX4 DdDd4D0+weWeTcJi0cTPRTAjLYk2Zsvb+PU3ZtmPBUuylJ70dctjfBPlemoVKKB1tAXOFyc5a obvsIJ0t5LD9zIizD8Ng0mYBTastzhWKgXsuiTytktYDprUrUDnYOlKvqM5KJQxZdOmyFrhqJ mpx99UleBYkgD29Bw3vEPv2H8epk0UPRex9qiT+NdXajnVhxCkW1nbzGFPY2l3IFjriif6VU4 ZRw4m+ZwKUuJ8029mhAPTBxqAgqj6jqMCQbKUtsC7lbmur9bgyCQnbGjLiNkeCewIT7pdXeO3 FRz/8Pa5ORh48e8pVS9c5O659s0j4XDGCM+OPURa9ArTEPWGktJGhvtgw7VfajydPqDkLv1eh Z2DetYC5z32gF+EQwEArt2kL6vyE9ohmdwVuSwwBUYBfagtm2uVqU8YzaSjvFqlaa8YY= Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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. v2: fix missing kfree() as pointed out by Dan Carpenter. --- drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c | 78 ++++++++++++----------- 1 file changed, 42 insertions(+), 36 deletions(-) -- 2.9.0 diff --git a/drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c b/drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c index 780059c3eb60..7c8f28d7a07f 100644 --- a/drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c +++ b/drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c @@ -2329,7 +2329,7 @@ static inline void ieee80211_process_probe_response( 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,10 @@ 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); + if (!network) + goto out; + 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,14 +2367,14 @@ 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), beacon->header.addr3, fc == IEEE80211_STYPE_PROBE_RESP ? "PROBE RESPONSE" : "BEACON"); - return; + goto out; } // For Asus EeePc request, @@ -2381,8 +2384,8 @@ 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)) - return; + if (!IsLegalChannel(ieee, network->channel)) + goto out; if (ieee->bGlobalDomain) { if (fc == IEEE80211_STYPE_PROBE_RESP) @@ -2390,19 +2393,19 @@ 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); - return; + if (!IsLegalChannel(ieee, network->channel)) { + printk("GetScanInfo(): For Country code, filter probe response at channel(%d).\n", network->channel); + goto out; } } // Case 2: No any country code. 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); - return; + printk("GetScanInfo(): For Global Domain, filter probe response at channel(%d).\n", network->channel); + goto out; } } } @@ -2411,19 +2414,19 @@ 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); - return; + if (!IsLegalChannel(ieee, network->channel)) { + printk("GetScanInfo(): For Country code, filter beacon at channel(%d).\n",network->channel); + goto out; } } // Case 2: No any country code. 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); - return; + printk("GetScanInfo(): For Global Domain, filter beacon at channel(%d).\n",network->channel); + goto out; } } } @@ -2441,8 +2444,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 +2459,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 +2492,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,27 +2517,30 @@ 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); } } + +out: + kfree(network); } void ieee80211_rx_mgt(struct ieee80211_device *ieee,