Skip to content

Commit

Permalink
mwifiex: remove list traversal in mwifiex_num_pkts_in_txq
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Yogesh Ashok Powar authored and John W. Linville committed Jun 7, 2011
1 parent 4858682 commit fcf2176
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 25 deletions.
5 changes: 4 additions & 1 deletion drivers/net/wireless/mwifiex/11n_aggr.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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);

Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/mwifiex/main.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};

Expand Down
30 changes: 6 additions & 24 deletions drivers/net/wireless/mwifiex/wmm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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.
*/
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit fcf2176

Please sign in to comment.