mwifiex: remove list traversal in mwifiex_num_pkts_in_txq
authorYogesh Ashok Powar <yogeshp@marvell.com>
Mon, 6 Jun 2011 09:19:32 +0000 (14:49 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 7 Jun 2011 18:44:02 +0000 (14:44 -0400)
Instead of counting the number of packets in txq
for particular RA list before AMSDU creation,
maintain a counter which will keep track of the
same.

This will reduce some MIPS while generating AMSDU
traffic as we only have to check the counter instead
of traversing through skb list.

Signed-off-by: Yogesh Ashok Powar <yogeshp@marvell.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/mwifiex/11n_aggr.c
drivers/net/wireless/mwifiex/main.h
drivers/net/wireless/mwifiex/wmm.c

index f807447e4d993cf1fae0befdd13e57b4aa25f764..84d2c76eca8a64073dd1cde1c51ba82338630335 100644 (file)
@@ -193,8 +193,10 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv,
                else
                        skb_src = NULL;
 
-               if (skb_src)
+               if (skb_src) {
                        pra_list->total_pkts_size -= skb_src->len;
+                       pra_list->total_pkts--;
+               }
 
                atomic_dec(&priv->wmm.tx_pkts_queued);
 
@@ -258,6 +260,7 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv,
                skb_queue_tail(&pra_list->skb_head, skb_aggr);
 
                pra_list->total_pkts_size += skb_aggr->len;
+               pra_list->total_pkts++;
 
                atomic_inc(&priv->wmm.tx_pkts_queued);
 
index 89f98701b701021ed734885907392ddaf752e461..57b183af72d796f7f38df47cb936d414147dc5e8 100644 (file)
@@ -181,6 +181,7 @@ struct mwifiex_ra_list_tbl {
        struct sk_buff_head skb_head;
        u8 ra[ETH_ALEN];
        u32 total_pkts_size;
+       u32 total_pkts;
        u32 is_11n_enabled;
 };
 
index 91634daec306c093928a7718c176d734b7bf07aa..67b2d0b78c71f2a9899851aea28036b16b084b55 100644 (file)
@@ -121,6 +121,7 @@ mwifiex_wmm_allocate_ralist_node(struct mwifiex_adapter *adapter, u8 *ra)
        memcpy(ra_list->ra, ra, ETH_ALEN);
 
        ra_list->total_pkts_size = 0;
+       ra_list->total_pkts = 0;
 
        dev_dbg(adapter->dev, "info: allocated ra_list %p\n", ra_list);
 
@@ -645,6 +646,7 @@ mwifiex_wmm_add_buf_txqueue(struct mwifiex_adapter *adapter,
        skb_queue_tail(&ra_list->skb_head, skb);
 
        ra_list->total_pkts_size += skb->len;
+       ra_list->total_pkts++;
 
        atomic_inc(&priv->wmm.tx_pkts_queued);
 
@@ -970,28 +972,6 @@ mwifiex_wmm_get_highest_priolist_ptr(struct mwifiex_adapter *adapter,
        return NULL;
 }
 
-/*
- * This function gets the number of packets in the Tx queue of a
- * particular RA list.
- */
-static int
-mwifiex_num_pkts_in_txq(struct mwifiex_private *priv,
-                       struct mwifiex_ra_list_tbl *ptr, int max_buf_size)
-{
-       int count = 0, total_size = 0;
-       struct sk_buff *skb, *tmp;
-
-       skb_queue_walk_safe(&ptr->skb_head, skb, tmp) {
-               total_size += skb->len;
-               if (total_size < max_buf_size)
-                       ++count;
-               else
-                       break;
-       }
-
-       return count;
-}
-
 /*
  * This function sends a single packet to firmware for transmission.
  */
@@ -1019,6 +999,7 @@ mwifiex_send_single_packet(struct mwifiex_private *priv,
        dev_dbg(adapter->dev, "data: dequeuing the packet %p %p\n", ptr, skb);
 
        ptr->total_pkts_size -= skb->len;
+       ptr->total_pkts--;
 
        if (!skb_queue_empty(&ptr->skb_head))
                skb_next = skb_peek(&ptr->skb_head);
@@ -1044,6 +1025,7 @@ mwifiex_send_single_packet(struct mwifiex_private *priv,
                skb_queue_tail(&ptr->skb_head, skb);
 
                ptr->total_pkts_size += skb->len;
+               ptr->total_pkts++;
                tx_info->flags |= MWIFIEX_BUF_FLAG_REQUEUED_PKT;
                spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock,
                                       ra_list_flags);
@@ -1231,9 +1213,9 @@ mwifiex_dequeue_tx_packet(struct mwifiex_adapter *adapter)
                }
 /* Minimum number of AMSDU */
 #define MIN_NUM_AMSDU 2
+
                if (mwifiex_is_amsdu_allowed(priv, tid) &&
-                   (mwifiex_num_pkts_in_txq(priv, ptr, adapter->tx_buf_size) >=
-                    MIN_NUM_AMSDU))
+                               (ptr->total_pkts >= MIN_NUM_AMSDU))
                        mwifiex_11n_aggregate_pkt(priv, ptr, INTF_HEADER_LEN,
                                                  ptr_index, flags);
                        /* ra_list_spinlock has been freed in