add chaos_calmer branch
[15.05/openwrt.git] / package / kernel / mac80211 / patches / 369-brcmfmac-Improve-throughput-by-scheduling-msbug-flow.patch
1 From: Hante Meuleman <meuleman@broadcom.com>
2 Date: Wed, 20 May 2015 14:09:48 +0200
3 Subject: [PATCH] brcmfmac: Improve throughput by scheduling msbug flow worker.
4
5 The tx flow worker in msgbuf gets scheduled at tx till a certain
6 threshold has been reached. Then the tx completes will take over
7 the scheduling. When amsdu and ampdu is used the frames are
8 transferred wireless in a very bulky fashion, in combination
9 with this scheduling algorithm and buffer limiters in the stack
10 this can result in limited throughput. This change causes the
11 flow worker to be scheduled more frequently from tx.
12
13 Reviewed-by: Arend Van Spriel <arend@broadcom.com>
14 Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
15 Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
16 Reviewed-by: Daniel (Deognyoun) Kim <dekim@broadcom.com>
17 Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
18 Signed-off-by: Arend van Spriel <arend@broadcom.com>
19 Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
20 ---
21
22 --- a/drivers/net/wireless/brcm80211/brcmfmac/flowring.c
23 +++ b/drivers/net/wireless/brcm80211/brcmfmac/flowring.c
24 @@ -249,8 +249,8 @@ void brcmf_flowring_delete(struct brcmf_
25  }
26  
27  
28 -void brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid,
29 -                           struct sk_buff *skb)
30 +u32 brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid,
31 +                          struct sk_buff *skb)
32  {
33         struct brcmf_flowring_ring *ring;
34  
35 @@ -271,6 +271,7 @@ void brcmf_flowring_enqueue(struct brcmf
36                 if (skb_queue_len(&ring->skblist) < BRCMF_FLOWRING_LOW)
37                         brcmf_flowring_block(flow, flowid, false);
38         }
39 +       return skb_queue_len(&ring->skblist);
40  }
41  
42  
43 --- a/drivers/net/wireless/brcm80211/brcmfmac/flowring.h
44 +++ b/drivers/net/wireless/brcm80211/brcmfmac/flowring.h
45 @@ -64,8 +64,8 @@ u32 brcmf_flowring_create(struct brcmf_f
46  void brcmf_flowring_delete(struct brcmf_flowring *flow, u8 flowid);
47  void brcmf_flowring_open(struct brcmf_flowring *flow, u8 flowid);
48  u8 brcmf_flowring_tid(struct brcmf_flowring *flow, u8 flowid);
49 -void brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid,
50 -                           struct sk_buff *skb);
51 +u32 brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid,
52 +                          struct sk_buff *skb);
53  struct sk_buff *brcmf_flowring_dequeue(struct brcmf_flowring *flow, u8 flowid);
54  void brcmf_flowring_reinsert(struct brcmf_flowring *flow, u8 flowid,
55                              struct sk_buff *skb);
56 --- a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
57 +++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
58 @@ -73,7 +73,7 @@
59  #define BRCMF_MSGBUF_TX_FLUSH_CNT1             32
60  #define BRCMF_MSGBUF_TX_FLUSH_CNT2             96
61  
62 -#define BRCMF_MSGBUF_DELAY_TXWORKER_THRS       64
63 +#define BRCMF_MSGBUF_DELAY_TXWORKER_THRS       96
64  #define BRCMF_MSGBUF_TRICKLE_TXWORKER_THRS     32
65  
66  struct msgbuf_common_hdr {
67 @@ -797,6 +797,8 @@ static int brcmf_msgbuf_txdata(struct br
68         struct brcmf_flowring *flow = msgbuf->flow;
69         struct ethhdr *eh = (struct ethhdr *)(skb->data);
70         u32 flowid;
71 +       u32 queue_count;
72 +       bool force;
73  
74         flowid = brcmf_flowring_lookup(flow, eh->h_dest, skb->priority, ifidx);
75         if (flowid == BRCMF_FLOWRING_INVALID_ID) {
76 @@ -804,8 +806,9 @@ static int brcmf_msgbuf_txdata(struct br
77                 if (flowid == BRCMF_FLOWRING_INVALID_ID)
78                         return -ENOMEM;
79         }
80 -       brcmf_flowring_enqueue(flow, flowid, skb);
81 -       brcmf_msgbuf_schedule_txdata(msgbuf, flowid, false);
82 +       queue_count = brcmf_flowring_enqueue(flow, flowid, skb);
83 +       force = ((queue_count % BRCMF_MSGBUF_TRICKLE_TXWORKER_THRS) == 0);
84 +       brcmf_msgbuf_schedule_txdata(msgbuf, flowid, force);
85  
86         return 0;
87  }