diff options
author | Michal Kazior <michal.kazior@tieto.com> | 2016-04-27 12:59:13 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-04-28 23:03:38 +0200 |
commit | b43e7199a9061562e28c72192a1d07e00ec4e97f (patch) | |
tree | 420b211911111c7603cfcff2f9ace377e32afa42 /include/net/fq_impl.h | |
parent | tipc: remove an unnecessary NULL check (diff) | |
download | linux-b43e7199a9061562e28c72192a1d07e00ec4e97f.tar.xz linux-b43e7199a9061562e28c72192a1d07e00ec4e97f.zip |
fq: split out backlog update logic
mac80211 (which will be the first user of the
fq.h) recently started to support software A-MSDU
aggregation. It glues skbuffs together into a
single one so the backlog accounting needs to be
more fine-grained.
To avoid backlog sorting logic duplication split
it up for re-use.
Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/fq_impl.h')
-rw-r--r-- | include/net/fq_impl.h | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/include/net/fq_impl.h b/include/net/fq_impl.h index 02eab7c51adb..163f3ed0f05a 100644 --- a/include/net/fq_impl.h +++ b/include/net/fq_impl.h @@ -120,6 +120,24 @@ static struct fq_flow *fq_flow_classify(struct fq *fq, return flow; } +static void fq_recalc_backlog(struct fq *fq, + struct fq_tin *tin, + struct fq_flow *flow) +{ + struct fq_flow *i; + + if (list_empty(&flow->backlogchain)) + list_add_tail(&flow->backlogchain, &fq->backlogs); + + i = flow; + list_for_each_entry_continue_reverse(i, &fq->backlogs, + backlogchain) + if (i->backlog > flow->backlog) + break; + + list_move(&flow->backlogchain, &i->backlogchain); +} + static void fq_tin_enqueue(struct fq *fq, struct fq_tin *tin, struct sk_buff *skb, @@ -127,7 +145,6 @@ static void fq_tin_enqueue(struct fq *fq, fq_flow_get_default_t get_default_func) { struct fq_flow *flow; - struct fq_flow *i; lockdep_assert_held(&fq->lock); @@ -139,16 +156,7 @@ static void fq_tin_enqueue(struct fq *fq, tin->backlog_packets++; fq->backlog++; - if (list_empty(&flow->backlogchain)) - list_add_tail(&flow->backlogchain, &fq->backlogs); - - i = flow; - list_for_each_entry_continue_reverse(i, &fq->backlogs, - backlogchain) - if (i->backlog > flow->backlog) - break; - - list_move(&flow->backlogchain, &i->backlogchain); + fq_recalc_backlog(fq, tin, flow); if (list_empty(&flow->flowchain)) { flow->deficit = fq->quantum; |