|
@@ -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;
|