On Fri, Oct 05, 2018 at 09:20:01AM +0000, Tony Chuang wrote: > > > + rcu_read_lock(); > > > + > > > + bssid = get_hdr_bssid(hdr); > > > + rtwvif = get_hdr_vif(rtwdev, hdr); > > > + vif = rtwvif ? rtwvif->vif : NULL; > > > + pkt_stat->vif = vif; > > > + if (unlikely(is_broadcast_ether_addr(hdr->addr1) || > > > + is_multicast_ether_addr(hdr->addr1))) > > > + match_bssid = get_hdr_match_bssid(rtwdev, hdr, bssid); > > > + else if (vif) > > > + match_bssid = ether_addr_equal(vif->bss_conf.bssid, bssid); > > > + si = get_hdr_sta(rtwdev, vif, hdr); > > > + macid = si ? si->mac_id : RTW_BC_MC_MACID; > > > + pkt_stat->mac_id = macid; > > > + pkt_stat->si = si; > > > + > > > + if_addr_match = !!vif; > > > + hw_err = pkt_stat->crc_err || pkt_stat->icv_err; > > > + ctl = ieee80211_is_ctl(fc); > > > + is_packet_match_bssid = !hw_err && !ctl && match_bssid; > > > + > > > + if (((match_bssid && if_addr_match) || ieee80211_is_beacon(fc)) && > > > + (!hw_err && !ctl) && (pkt_stat->phy_status && pkt_stat->si)) > > > + ewma_rssi_add(&pkt_stat->si->avg_rssi, pkt_stat->rssi); > > > + > > > + rcu_read_unlock(); > > > > What for rcu_read_lock/unlock is here ? Maybe is needed, > > but perhaps not to protect entire function ? > > > > I thought that the entire function uses pointer si and vif, and hence should be > protected by rcu read lock, am I using the lock in a wrong way? It's fine, it wasn't clear to me what need to be protected. Thanks Stanislaw