Commit b43e7199 authored by Michal Kazior's avatar Michal Kazior Committed by David S. Miller

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: default avatarMichal Kazior <michal.kazior@tieto.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b4358657
...@@ -120,6 +120,24 @@ static struct fq_flow *fq_flow_classify(struct fq *fq, ...@@ -120,6 +120,24 @@ static struct fq_flow *fq_flow_classify(struct fq *fq,
return flow; 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, static void fq_tin_enqueue(struct fq *fq,
struct fq_tin *tin, struct fq_tin *tin,
struct sk_buff *skb, struct sk_buff *skb,
...@@ -127,7 +145,6 @@ static void fq_tin_enqueue(struct fq *fq, ...@@ -127,7 +145,6 @@ static void fq_tin_enqueue(struct fq *fq,
fq_flow_get_default_t get_default_func) fq_flow_get_default_t get_default_func)
{ {
struct fq_flow *flow; struct fq_flow *flow;
struct fq_flow *i;
lockdep_assert_held(&fq->lock); lockdep_assert_held(&fq->lock);
...@@ -139,16 +156,7 @@ static void fq_tin_enqueue(struct fq *fq, ...@@ -139,16 +156,7 @@ static void fq_tin_enqueue(struct fq *fq,
tin->backlog_packets++; tin->backlog_packets++;
fq->backlog++; fq->backlog++;
if (list_empty(&flow->backlogchain)) fq_recalc_backlog(fq, tin, flow);
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);
if (list_empty(&flow->flowchain)) { if (list_empty(&flow->flowchain)) {
flow->deficit = fq->quantum; flow->deficit = fq->quantum;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment