brcmfmac: Improve throughput by scheduling msbug flow worker.
authorHante Meuleman <meuleman@broadcom.com>
Wed, 20 May 2015 12:09:48 +0000 (14:09 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 26 May 2015 11:09:54 +0000 (14:09 +0300)
The tx flow worker in msgbuf gets scheduled at tx till a certain
threshold has been reached. Then the tx completes will take over
the scheduling. When amsdu and ampdu is used the frames are
transferred wireless in a very bulky fashion, in combination
with this scheduling algorithm and buffer limiters in the stack
this can result in limited throughput. This change causes the
flow worker to be scheduled more frequently from tx.

Reviewed-by: Arend Van Spriel <arend@broadcom.com>
Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Daniel (Deognyoun) Kim <dekim@broadcom.com>
Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/brcm80211/brcmfmac/flowring.c
drivers/net/wireless/brcm80211/brcmfmac/flowring.h
drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c

index eb1325371d3a3aa9eba03e5ba83e65135f218f4e..59440631fec50637fc3f35e162defb230d1f420c 100644 (file)
@@ -249,8 +249,8 @@ void brcmf_flowring_delete(struct brcmf_flowring *flow, u8 flowid)
 }
 
 
-void brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid,
-                           struct sk_buff *skb)
+u32 brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid,
+                          struct sk_buff *skb)
 {
        struct brcmf_flowring_ring *ring;
 
@@ -271,6 +271,7 @@ void brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid,
                if (skb_queue_len(&ring->skblist) < BRCMF_FLOWRING_LOW)
                        brcmf_flowring_block(flow, flowid, false);
        }
+       return skb_queue_len(&ring->skblist);
 }
 
 
index a34cd394c616c0a11f861c06f18030d3c7129133..5551861a44bc427bca80d096f7809db6c2f12b42 100644 (file)
@@ -64,8 +64,8 @@ u32 brcmf_flowring_create(struct brcmf_flowring *flow, u8 da[ETH_ALEN],
 void brcmf_flowring_delete(struct brcmf_flowring *flow, u8 flowid);
 void brcmf_flowring_open(struct brcmf_flowring *flow, u8 flowid);
 u8 brcmf_flowring_tid(struct brcmf_flowring *flow, u8 flowid);
-void brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid,
-                           struct sk_buff *skb);
+u32 brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid,
+                          struct sk_buff *skb);
 struct sk_buff *brcmf_flowring_dequeue(struct brcmf_flowring *flow, u8 flowid);
 void brcmf_flowring_reinsert(struct brcmf_flowring *flow, u8 flowid,
                             struct sk_buff *skb);
index 4ec9811f49c87744458ed16cdcec32422432dc3f..b182f53e1c206237fe3a63897db2f748ce3e7d6b 100644 (file)
@@ -73,7 +73,7 @@
 #define BRCMF_MSGBUF_TX_FLUSH_CNT1             32
 #define BRCMF_MSGBUF_TX_FLUSH_CNT2             96
 
-#define BRCMF_MSGBUF_DELAY_TXWORKER_THRS       64
+#define BRCMF_MSGBUF_DELAY_TXWORKER_THRS       96
 #define BRCMF_MSGBUF_TRICKLE_TXWORKER_THRS     32
 
 struct msgbuf_common_hdr {
@@ -797,6 +797,8 @@ static int brcmf_msgbuf_txdata(struct brcmf_pub *drvr, int ifidx,
        struct brcmf_flowring *flow = msgbuf->flow;
        struct ethhdr *eh = (struct ethhdr *)(skb->data);
        u32 flowid;
+       u32 queue_count;
+       bool force;
 
        flowid = brcmf_flowring_lookup(flow, eh->h_dest, skb->priority, ifidx);
        if (flowid == BRCMF_FLOWRING_INVALID_ID) {
@@ -804,8 +806,9 @@ static int brcmf_msgbuf_txdata(struct brcmf_pub *drvr, int ifidx,
                if (flowid == BRCMF_FLOWRING_INVALID_ID)
                        return -ENOMEM;
        }
-       brcmf_flowring_enqueue(flow, flowid, skb);
-       brcmf_msgbuf_schedule_txdata(msgbuf, flowid, false);
+       queue_count = brcmf_flowring_enqueue(flow, flowid, skb);
+       force = ((queue_count % BRCMF_MSGBUF_TRICKLE_TXWORKER_THRS) == 0);
+       brcmf_msgbuf_schedule_txdata(msgbuf, flowid, force);
 
        return 0;
 }