aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/sta_info.h
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2010-06-10 04:21:38 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-06-14 15:39:27 -0400
commita87f736d942c86255e3088c606f0e3eab6bbf784 (patch)
tree74d3d63dca9fc982fcb7c165247d6924c021b4ef /net/mac80211/sta_info.h
parentc1475ca99edcc7216ddc45838ab2c3281c14ba22 (diff)
mac80211: use RCU for RX aggregation
Currently we allocate some memory for each RX aggregation session and additionally keep a flag indicating whether or not it is valid. By using RCU to protect the pointer and making sure that the memory is fully set up before it becomes visible to the RX path, we can remove the need for the bool that indicates validity, as well as for locking on the RX path since it is always synchronised against itself, and we can guarantee that all other modifications are done when the structure is not visible to the RX path. The net result is that since we remove locking requirements from the RX path, we can in the future use any kind of lock for the setup and teardown code paths. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/sta_info.h')
-rw-r--r--net/mac80211/sta_info.h14
1 files changed, 11 insertions, 3 deletions
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
index 786bbd3103b1..16864a6045b4 100644
--- a/net/mac80211/sta_info.h
+++ b/net/mac80211/sta_info.h
@@ -102,8 +102,18 @@ struct tid_ampdu_tx {
102 * @buf_size: buffer size for incoming A-MPDUs 102 * @buf_size: buffer size for incoming A-MPDUs
103 * @timeout: reset timer value (in TUs). 103 * @timeout: reset timer value (in TUs).
104 * @dialog_token: dialog token for aggregation session 104 * @dialog_token: dialog token for aggregation session
105 * @rcu_head: RCU head used for freeing this struct
106 *
107 * This structure is protected by RCU and the per-station
108 * spinlock. Assignments to the array holding it must hold
109 * the spinlock, only the RX path can access it under RCU
110 * lock-free. The RX path, since it is single-threaded,
111 * can even modify the structure without locking since the
112 * only other modifications to it are done when the struct
113 * can not yet or no longer be found by the RX path.
105 */ 114 */
106struct tid_ampdu_rx { 115struct tid_ampdu_rx {
116 struct rcu_head rcu_head;
107 struct sk_buff **reorder_buf; 117 struct sk_buff **reorder_buf;
108 unsigned long *reorder_time; 118 unsigned long *reorder_time;
109 struct timer_list session_timer; 119 struct timer_list session_timer;
@@ -118,8 +128,7 @@ struct tid_ampdu_rx {
118/** 128/**
119 * struct sta_ampdu_mlme - STA aggregation information. 129 * struct sta_ampdu_mlme - STA aggregation information.
120 * 130 *
121 * @tid_active_rx: TID's state in Rx session state machine. 131 * @tid_rx: aggregation info for Rx per TID -- RCU protected
122 * @tid_rx: aggregation info for Rx per TID
123 * @tid_state_tx: TID's state in Tx session state machine. 132 * @tid_state_tx: TID's state in Tx session state machine.
124 * @tid_tx: aggregation info for Tx per TID 133 * @tid_tx: aggregation info for Tx per TID
125 * @addba_req_num: number of times addBA request has been sent. 134 * @addba_req_num: number of times addBA request has been sent.
@@ -127,7 +136,6 @@ struct tid_ampdu_rx {
127 */ 136 */
128struct sta_ampdu_mlme { 137struct sta_ampdu_mlme {
129 /* rx */ 138 /* rx */
130 bool tid_active_rx[STA_TID_NUM];
131 struct tid_ampdu_rx *tid_rx[STA_TID_NUM]; 139 struct tid_ampdu_rx *tid_rx[STA_TID_NUM];
132 /* tx */ 140 /* tx */
133 u8 tid_state_tx[STA_TID_NUM]; 141 u8 tid_state_tx[STA_TID_NUM];