wil6210: optimize wil_release_reorder_frames
authorVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Tue, 27 May 2014 11:45:50 +0000 (14:45 +0300)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 29 May 2014 17:10:32 +0000 (13:10 -0400)
In case of receiving frame with sequence number far greater than current,
wil_release_reorder_frames() will iterate many times over empty buffer.

Optimize this case by checking buffer emptiness and simply update
head_seq_num without iterating.

Suggested-by: Vladimir Shulman <Vladimir.Shulman@Wilocity.com>
Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/wil6210/rx_reorder.c

index ec29954bd44dd1d8de1cf46ce736cc4f8157127e..747ae127587763d0bbdd652f674749960cadb1f8 100644 (file)
@@ -49,10 +49,17 @@ static void wil_release_reorder_frames(struct wil6210_priv *wil,
 {
        int index;
 
-       while (seq_less(r->head_seq_num, hseq)) {
+       /* note: this function is never called with
+        * hseq preceding r->head_seq_num, i.e it is always true
+        * !seq_less(hseq, r->head_seq_num)
+        * and thus on loop exit it should be
+        * r->head_seq_num == hseq
+        */
+       while (seq_less(r->head_seq_num, hseq) && r->stored_mpdu_num) {
                index = reorder_index(r, r->head_seq_num);
                wil_release_reorder_frame(wil, r, index);
        }
+       r->head_seq_num = hseq;
 }
 
 static void wil_reorder_release(struct wil6210_priv *wil,