1
0

0036-wifi-ath11k-fix-SAC-bug-on-peer-addition-with-sta-ba.patch 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. From 60b7d62ba8cdbd073997bff0f1cdae8d844002c0 Mon Sep 17 00:00:00 2001
  2. From: Christian Marangi <ansuelsmth@gmail.com>
  3. Date: Thu, 9 Feb 2023 23:26:22 +0100
  4. Subject: [PATCH] wifi: ath11k: fix SAC bug on peer addition with sta band
  5. migration
  6. Fix sleep in atomic context warning detected by Smatch static checker
  7. analyzer.
  8. Following the locking pattern for peer_rhash_add lock tbl_mtx_lock mutex
  9. always even if sta is not transitioning to another band.
  10. This is peer_add function and a more secure locking should not cause
  11. performance regression.
  12. Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.5.0.1-01208-QCAHKSWPL_SILICONZ-1
  13. Fixes: d673cb6fe6c0 ("wifi: ath11k: fix peer addition/deletion error on sta band migration")
  14. Reported-by: Dan Carpenter <error27@gmail.com>
  15. Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
  16. Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
  17. Link: https://lore.kernel.org/r/20230209222622.1751-1-ansuelsmth@gmail.com
  18. ---
  19. drivers/net/wireless/ath/ath11k/peer.c | 5 +++--
  20. 1 file changed, 3 insertions(+), 2 deletions(-)
  21. --- a/drivers/net/wireless/ath/ath11k/peer.c
  22. +++ b/drivers/net/wireless/ath/ath11k/peer.c
  23. @@ -382,22 +382,23 @@ int ath11k_peer_create(struct ath11k *ar
  24. return -ENOBUFS;
  25. }
  26. + mutex_lock(&ar->ab->tbl_mtx_lock);
  27. spin_lock_bh(&ar->ab->base_lock);
  28. peer = ath11k_peer_find_by_addr(ar->ab, param->peer_addr);
  29. if (peer) {
  30. if (peer->vdev_id == param->vdev_id) {
  31. spin_unlock_bh(&ar->ab->base_lock);
  32. + mutex_unlock(&ar->ab->tbl_mtx_lock);
  33. return -EINVAL;
  34. }
  35. /* Assume sta is transitioning to another band.
  36. * Remove here the peer from rhash.
  37. */
  38. - mutex_lock(&ar->ab->tbl_mtx_lock);
  39. ath11k_peer_rhash_delete(ar->ab, peer);
  40. - mutex_unlock(&ar->ab->tbl_mtx_lock);
  41. }
  42. spin_unlock_bh(&ar->ab->base_lock);
  43. + mutex_unlock(&ar->ab->tbl_mtx_lock);
  44. ret = ath11k_wmi_send_peer_create_cmd(ar, param);
  45. if (ret) {