Message ID | 20240411165516.4070649-2-kvalo@kernel.org |
---|---|
State | New |
Headers | show |
Series | wifi: ath11k: use RCU when accessing struct inet6_dev::ac_list | expand |
On 4/11/2024 9:55 AM, Kalle Valo wrote: > From: Kalle Valo <quic_kvalo@quicinc.com> > > Commit c3718936ec47 ("ipv6: anycast: complete RCU handling of struct > ifacaddr6") converted struct inet6_dev::ac_list to use RCU but missed that > ath11k also accesses this list. Now sparse warns: > > drivers/net/wireless/ath/ath11k/mac.c:9145:21: warning: incorrect type in assignment (different address spaces) > drivers/net/wireless/ath/ath11k/mac.c:9145:21: expected struct ifacaddr6 *ifaca6 > drivers/net/wireless/ath/ath11k/mac.c:9145:21: got struct ifacaddr6 [noderef] __rcu *ac_list > drivers/net/wireless/ath/ath11k/mac.c:9145:53: warning: incorrect type in assignment (different address spaces) > drivers/net/wireless/ath/ath11k/mac.c:9145:53: expected struct ifacaddr6 *ifaca6 > drivers/net/wireless/ath/ath11k/mac.c:9145:53: got struct ifacaddr6 [noderef] __rcu *aca_next > > Fix it by using rtnl_dereference(). Also add a note that read_lock_bh() calls > rcu_read_lock() which I was not aware of. > > Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.37 > > Fixes: c3718936ec47 ("ipv6: anycast: complete RCU handling of struct ifacaddr6") > Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
Kalle Valo <kvalo@kernel.org> wrote: > From: Kalle Valo <quic_kvalo@quicinc.com> > > Commit c3718936ec47 ("ipv6: anycast: complete RCU handling of struct > ifacaddr6") converted struct inet6_dev::ac_list to use RCU but missed that > ath11k also accesses this list. Now sparse warns: > > drivers/net/wireless/ath/ath11k/mac.c:9145:21: warning: incorrect type in assignment (different address spaces) > drivers/net/wireless/ath/ath11k/mac.c:9145:21: expected struct ifacaddr6 *ifaca6 > drivers/net/wireless/ath/ath11k/mac.c:9145:21: got struct ifacaddr6 [noderef] __rcu *ac_list > drivers/net/wireless/ath/ath11k/mac.c:9145:53: warning: incorrect type in assignment (different address spaces) > drivers/net/wireless/ath/ath11k/mac.c:9145:53: expected struct ifacaddr6 *ifaca6 > drivers/net/wireless/ath/ath11k/mac.c:9145:53: got struct ifacaddr6 [noderef] __rcu *aca_next > > Fix it by using rtnl_dereference(). Also add a note that read_lock_bh() calls > rcu_read_lock() which I was not aware of. > > Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.37 > > Fixes: c3718936ec47 ("ipv6: anycast: complete RCU handling of struct ifacaddr6") > Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> > Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com> Patch applied to wireless.git, thanks. feafe59c8975 wifi: ath11k: use RCU when accessing struct inet6_dev::ac_list
diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c index c32be587000d..4fdd56cd30a1 100644 --- a/drivers/net/wireless/ath/ath11k/mac.c +++ b/drivers/net/wireless/ath/ath11k/mac.c @@ -9112,6 +9112,7 @@ static void ath11k_mac_op_ipv6_changed(struct ieee80211_hw *hw, offload = &arvif->arp_ns_offload; count = 0; + /* Note: read_lock_bh() calls rcu_read_lock() */ read_lock_bh(&idev->lock); memset(offload->ipv6_addr, 0, sizeof(offload->ipv6_addr)); @@ -9142,7 +9143,8 @@ static void ath11k_mac_op_ipv6_changed(struct ieee80211_hw *hw, } /* get anycast address */ - for (ifaca6 = idev->ac_list; ifaca6; ifaca6 = ifaca6->aca_next) { + for (ifaca6 = rcu_dereference(idev->ac_list); ifaca6; + ifaca6 = rcu_dereference(ifaca6->aca_next)) { if (count >= ATH11K_IPV6_MAX_COUNT) goto generate;