On Thu, 2008-09-11 at 10:33 -0700, Luis R. Rodriguez wrote: > On Thu, Sep 11, 2008 at 09:53:15AM -0700, Johannes Berg wrote: > > On Thu, 2008-09-11 at 09:50 -0700, Luis R. Rodriguez wrote: > > > > I had actually tried > > > > (http://johannes.sipsolutions.net/patches/kernel/ath9k-sta-node.patch) > > Just a comment so far from the patch. > > > + rcu_read_unlock(); > > + > > + /* the "!an" here is fine even outside RCU lock */ > > Why is that? I fail to see that. Well take the larger bit of code: struct something *an = NULL; ... rcu_read_lock(); sta = ieee80211_find_sta(hw, hdr->addr2); if (sta) an = (void *) sta->drv_priv; if (an) { ath_rx_input(sc, an, hw->conf.ht_conf.ht_supported, skb, status, &st); } rcu_read_unlock(); /* the "!an" here is fine even outside RCU lock */ if (!an || (st != ATH_RX_CONSUMED)) __ieee80211_rx(hw, skb, &rx_status); So at this point it's only checking whether above it had a pointer, it's not accessing it. Think of the "an" variable, after rcu_read_unlock(), as a bool indicating whether or not the code that just happened had access to the node or not. johannes
Attachment:
signature.asc
Description: This is a digitally signed message part