Message ID | 1544184650-14124-2-git-send-email-jouni@codeaurora.org (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Johannes Berg |
Headers | show |
Series | [1/5] cfg80211: Parsing of Multiple BSSID information in scanning | expand |
Hi Sara, Thank you for the patch! Yet something to improve: [auto build test ERROR on mac80211-next/master] [also build test ERROR on v4.20-rc5 next-20181207] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Jouni-Malinen/cfg80211-Parsing-of-Multiple-BSSID-information-in-scanning/20181208-040803 base: https://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git master config: i386-randconfig-x011-201848 (attached as .config) compiler: gcc-7 (Debian 7.3.0-1) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=i386 All errors (new ones prefixed by >>): In file included from net/wireless/nl80211.h:9:0, from net/wireless/ibss.c:14: net/wireless/core.h: In function 'cfg80211_hold_bss': >> net/wireless/core.h:184:20: error: inlining failed in call to always_inline 'cfg80211_hold_bss': recursive inlining static inline void cfg80211_hold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~ net/wireless/core.h:188:3: note: called from here cfg80211_hold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ net/wireless/core.h: In function 'cfg80211_unhold_bss': >> net/wireless/core.h:193:20: error: inlining failed in call to always_inline 'cfg80211_unhold_bss': recursive inlining static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~~~ net/wireless/core.h:198:3: note: called from here cfg80211_unhold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ net/wireless/core.h: In function '__cfg80211_clear_ibss.constprop': >> net/wireless/core.h:193:20: error: inlining failed in call to always_inline 'cfg80211_unhold_bss': recursive inlining static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~~~ net/wireless/core.h:198:3: note: called from here cfg80211_unhold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ net/wireless/core.h: In function '__cfg80211_ibss_joined': >> net/wireless/core.h:193:20: error: inlining failed in call to always_inline 'cfg80211_unhold_bss': recursive inlining static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~~~ net/wireless/core.h:198:3: note: called from here cfg80211_unhold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ >> net/wireless/core.h:184:20: error: inlining failed in call to always_inline 'cfg80211_hold_bss': recursive inlining static inline void cfg80211_hold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~ net/wireless/core.h:188:3: note: called from here cfg80211_hold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ -- In file included from net/wireless/nl80211.h:9:0, from net/wireless/sme.c:21: net/wireless/core.h: In function 'cfg80211_hold_bss': >> net/wireless/core.h:184:20: error: inlining failed in call to always_inline 'cfg80211_hold_bss': recursive inlining static inline void cfg80211_hold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~ net/wireless/core.h:188:3: note: called from here cfg80211_hold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ net/wireless/core.h: In function 'cfg80211_unhold_bss': >> net/wireless/core.h:193:20: error: inlining failed in call to always_inline 'cfg80211_unhold_bss': recursive inlining static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~~~ net/wireless/core.h:198:3: note: called from here cfg80211_unhold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ net/wireless/core.h: In function '__cfg80211_connect_result': >> net/wireless/core.h:184:20: error: inlining failed in call to always_inline 'cfg80211_hold_bss': recursive inlining static inline void cfg80211_hold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~ net/wireless/core.h:188:3: note: called from here cfg80211_hold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ >> net/wireless/core.h:193:20: error: inlining failed in call to always_inline 'cfg80211_unhold_bss': recursive inlining static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~~~ net/wireless/core.h:198:3: note: called from here cfg80211_unhold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ >> net/wireless/core.h:193:20: error: inlining failed in call to always_inline 'cfg80211_unhold_bss': recursive inlining static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~~~ net/wireless/core.h:198:3: note: called from here cfg80211_unhold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ net/wireless/core.h: In function 'cfg80211_connect_done': >> net/wireless/core.h:184:20: error: inlining failed in call to always_inline 'cfg80211_hold_bss': recursive inlining static inline void cfg80211_hold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~ net/wireless/core.h:188:3: note: called from here cfg80211_hold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ net/wireless/core.h: In function '__cfg80211_roamed': >> net/wireless/core.h:193:20: error: inlining failed in call to always_inline 'cfg80211_unhold_bss': recursive inlining static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~~~ net/wireless/core.h:198:3: note: called from here cfg80211_unhold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ >> net/wireless/core.h:184:20: error: inlining failed in call to always_inline 'cfg80211_hold_bss': recursive inlining static inline void cfg80211_hold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~ net/wireless/core.h:188:3: note: called from here cfg80211_hold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ net/wireless/core.h: In function '__cfg80211_disconnected': >> net/wireless/core.h:193:20: error: inlining failed in call to always_inline 'cfg80211_unhold_bss': recursive inlining static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~~~ net/wireless/core.h:198:3: note: called from here cfg80211_unhold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ net/wireless/core.h: In function 'cfg80211_connect': >> net/wireless/core.h:193:20: error: inlining failed in call to always_inline 'cfg80211_unhold_bss': recursive inlining static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~~~ net/wireless/core.h:198:3: note: called from here cfg80211_unhold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ -- In file included from net/wireless/nl80211.h:9:0, from net/wireless/core.c:26: net/wireless/core.h: In function 'cfg80211_unhold_bss': >> net/wireless/core.h:193:20: error: inlining failed in call to always_inline 'cfg80211_unhold_bss': recursive inlining static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~~~ net/wireless/core.h:198:3: note: called from here cfg80211_unhold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ net/wireless/core.h: In function 'cfg80211_netdev_notifier_call': >> net/wireless/core.h:193:20: error: inlining failed in call to always_inline 'cfg80211_unhold_bss': recursive inlining static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~~~ net/wireless/core.h:198:3: note: called from here cfg80211_unhold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ -- In file included from net/wireless/mlme.c:18:0: net/wireless/core.h: In function 'cfg80211_hold_bss': >> net/wireless/core.h:184:20: error: inlining failed in call to always_inline 'cfg80211_hold_bss': recursive inlining static inline void cfg80211_hold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~ net/wireless/core.h:188:3: note: called from here cfg80211_hold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ net/wireless/core.h: In function 'cfg80211_unhold_bss': >> net/wireless/core.h:193:20: error: inlining failed in call to always_inline 'cfg80211_unhold_bss': recursive inlining static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~~~ net/wireless/core.h:198:3: note: called from here cfg80211_unhold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ net/wireless/core.h: In function 'cfg80211_rx_assoc_resp': >> net/wireless/core.h:193:20: error: inlining failed in call to always_inline 'cfg80211_unhold_bss': recursive inlining static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~~~ net/wireless/core.h:198:3: note: called from here cfg80211_unhold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ net/wireless/core.h: In function 'cfg80211_assoc_timeout': >> net/wireless/core.h:193:20: error: inlining failed in call to always_inline 'cfg80211_unhold_bss': recursive inlining static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~~~ net/wireless/core.h:198:3: note: called from here cfg80211_unhold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ net/wireless/core.h: In function 'cfg80211_abandon_assoc': >> net/wireless/core.h:193:20: error: inlining failed in call to always_inline 'cfg80211_unhold_bss': recursive inlining static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~~~ net/wireless/core.h:198:3: note: called from here cfg80211_unhold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ net/wireless/core.h: In function 'cfg80211_mlme_assoc': >> net/wireless/core.h:184:20: error: inlining failed in call to always_inline 'cfg80211_hold_bss': recursive inlining static inline void cfg80211_hold_bss(struct cfg80211_internal_bss *bss) ^~~~~~~~~~~~~~~~~ net/wireless/core.h:188:3: note: called from here cfg80211_hold_bss(container_of(bss->transmitted_bss, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct cfg80211_internal_bss, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pub)); ~~~~~ vim +/cfg80211_hold_bss +184 net/wireless/core.h 19957bb3 Johannes Berg 2009-07-02 183 19957bb3 Johannes Berg 2009-07-02 @184 static inline void cfg80211_hold_bss(struct cfg80211_internal_bss *bss) 19957bb3 Johannes Berg 2009-07-02 185 { 19957bb3 Johannes Berg 2009-07-02 186 atomic_inc(&bss->hold); ac02934e Sara Sharon 2018-12-07 187 if (bss->transmitted_bss) ac02934e Sara Sharon 2018-12-07 @188 cfg80211_hold_bss(container_of(bss->transmitted_bss, ac02934e Sara Sharon 2018-12-07 189 struct cfg80211_internal_bss, ac02934e Sara Sharon 2018-12-07 190 pub)); 19957bb3 Johannes Berg 2009-07-02 191 } 19957bb3 Johannes Berg 2009-07-02 192 19957bb3 Johannes Berg 2009-07-02 @193 static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss) 19957bb3 Johannes Berg 2009-07-02 194 { 19957bb3 Johannes Berg 2009-07-02 195 int r = atomic_dec_return(&bss->hold); 19957bb3 Johannes Berg 2009-07-02 196 WARN_ON(r < 0); ac02934e Sara Sharon 2018-12-07 197 if (bss->transmitted_bss) ac02934e Sara Sharon 2018-12-07 198 cfg80211_unhold_bss(container_of(bss->transmitted_bss, ac02934e Sara Sharon 2018-12-07 199 struct cfg80211_internal_bss, ac02934e Sara Sharon 2018-12-07 200 pub)); 19957bb3 Johannes Berg 2009-07-02 201 } 19957bb3 Johannes Berg 2009-07-02 202 :::::: The code at line 184 was first introduced by commit :::::: 19957bb399e2722719c0e20c9ae91cf8b6aaff04 cfg80211: keep track of BSSes :::::: TO: Johannes Berg <johannes@sipsolutions.net> :::::: CC: John W. Linville <linville@tuxdriver.com> --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
diff --git a/net/wireless/core.h b/net/wireless/core.h index d58c56a..b1afc4b 100644 --- a/net/wireless/core.h +++ b/net/wireless/core.h @@ -153,6 +153,7 @@ struct cfg80211_internal_bss { struct list_head list; struct list_head hidden_list; struct list_head nontrans_list; + struct cfg80211_bss *transmitted_bss; struct rb_node rbn; u64 ts_boottime; unsigned long ts; @@ -183,12 +184,20 @@ static inline struct cfg80211_internal_bss *bss_from_pub(struct cfg80211_bss *pu static inline void cfg80211_hold_bss(struct cfg80211_internal_bss *bss) { atomic_inc(&bss->hold); + if (bss->transmitted_bss) + cfg80211_hold_bss(container_of(bss->transmitted_bss, + struct cfg80211_internal_bss, + pub)); } static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss) { int r = atomic_dec_return(&bss->hold); WARN_ON(r < 0); + if (bss->transmitted_bss) + cfg80211_unhold_bss(container_of(bss->transmitted_bss, + struct cfg80211_internal_bss, + pub)); } diff --git a/net/wireless/scan.c b/net/wireless/scan.c index 559f56d..6f2fed2 100644 --- a/net/wireless/scan.c +++ b/net/wireless/scan.c @@ -109,6 +109,12 @@ static inline void bss_ref_get(struct cfg80211_registered_device *rdev, pub); bss->refcount++; } + if (bss->transmitted_bss) { + bss = container_of(bss->transmitted_bss, + struct cfg80211_internal_bss, + pub); + bss->refcount++; + } } static inline void bss_ref_put(struct cfg80211_registered_device *rdev, @@ -125,6 +131,18 @@ static inline void bss_ref_put(struct cfg80211_registered_device *rdev, if (hbss->refcount == 0) bss_free(hbss); } + + if (bss->transmitted_bss) { + struct cfg80211_internal_bss *tbss; + + tbss = container_of(bss->transmitted_bss, + struct cfg80211_internal_bss, + pub); + tbss->refcount--; + if (tbss->refcount == 0) + bss_free(tbss); + } + bss->refcount--; if (bss->refcount == 0) bss_free(bss); @@ -1028,6 +1046,7 @@ static bool cfg80211_combine_bsses(struct cfg80211_registered_device *rdev, static struct cfg80211_internal_bss * cfg80211_bss_update(struct cfg80211_registered_device *rdev, struct cfg80211_internal_bss *tmp, + struct cfg80211_bss *trans_bss, bool signal_valid) { struct cfg80211_internal_bss *found = NULL; @@ -1184,6 +1203,17 @@ cfg80211_bss_update(struct cfg80211_registered_device *rdev, goto drop; } + /* This must be before the call to bss_ref_get */ + if (trans_bss) { + struct cfg80211_internal_bss *pbss = + container_of(trans_bss, + struct cfg80211_internal_bss, + pub); + + new->transmitted_bss = trans_bss; + bss_ref_get(rdev, pbss); + } + list_add_tail(&new->list, &rdev->bss_list); rdev->bss_entries++; rb_insert_bss(rdev, new); @@ -1339,7 +1369,8 @@ cfg80211_inform_single_bss_data(struct wiphy *wiphy, signal_valid = abs(data->chan->center_freq - channel->center_freq) <= wiphy->max_adj_channel_rssi_comp; - res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, signal_valid); + res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, trans_bss, + signal_valid); if (!res) return NULL; @@ -1657,7 +1688,8 @@ cfg80211_inform_single_bss_frame_data(struct wiphy *wiphy, signal_valid = abs(data->chan->center_freq - channel->center_freq) <= wiphy->max_adj_channel_rssi_comp; - res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, signal_valid); + res = cfg80211_bss_update(wiphy_to_rdev(wiphy), &tmp, trans_bss, + signal_valid); if (!res) return NULL;