Skip to content

Commit

Permalink
net_sched: introduce qdisc_replace() helper
Browse files Browse the repository at this point in the history
Remove nearly duplicated code and prepare for the following patch.

Cc: Jamal Hadi Salim <[email protected]>
Acked-by: Jamal Hadi Salim <[email protected]>
Signed-off-by: Cong Wang <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
congwang authored and davem330 committed Feb 29, 2016
1 parent f12d33f commit 86a7996
Show file tree
Hide file tree
Showing 13 changed files with 29 additions and 78 deletions.
17 changes: 17 additions & 0 deletions include/net/sch_generic.h
Original file line number Diff line number Diff line change
Expand Up @@ -707,6 +707,23 @@ static inline void qdisc_reset_queue(struct Qdisc *sch)
sch->qstats.backlog = 0;
}

static inline struct Qdisc *qdisc_replace(struct Qdisc *sch, struct Qdisc *new,
struct Qdisc **pold)
{
struct Qdisc *old;

sch_tree_lock(sch);
old = *pold;
*pold = new;
if (old != NULL) {
qdisc_tree_decrease_qlen(old, old->q.qlen);
qdisc_reset(old);
}
sch_tree_unlock(sch);

return old;
}

static inline unsigned int __qdisc_queue_drop(struct Qdisc *sch,
struct sk_buff_head *list)
{
Expand Down
7 changes: 1 addition & 6 deletions net/sched/sch_cbq.c
Original file line number Diff line number Diff line change
Expand Up @@ -1624,13 +1624,8 @@ static int cbq_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
new->reshape_fail = cbq_reshape_fail;
#endif
}
sch_tree_lock(sch);
*old = cl->q;
cl->q = new;
qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
qdisc_reset(*old);
sch_tree_unlock(sch);

*old = qdisc_replace(sch, new, &cl->q);
return 0;
}

Expand Down
6 changes: 1 addition & 5 deletions net/sched/sch_drr.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,11 +226,7 @@ static int drr_graft_class(struct Qdisc *sch, unsigned long arg,
new = &noop_qdisc;
}

sch_tree_lock(sch);
drr_purge_queue(cl);
*old = cl->qdisc;
cl->qdisc = new;
sch_tree_unlock(sch);
*old = qdisc_replace(sch, new, &cl->qdisc);
return 0;
}

Expand Down
8 changes: 1 addition & 7 deletions net/sched/sch_dsmark.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,13 +73,7 @@ static int dsmark_graft(struct Qdisc *sch, unsigned long arg,
new = &noop_qdisc;
}

sch_tree_lock(sch);
*old = p->q;
p->q = new;
qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
qdisc_reset(*old);
sch_tree_unlock(sch);

*old = qdisc_replace(sch, new, &p->q);
return 0;
}

Expand Down
6 changes: 1 addition & 5 deletions net/sched/sch_hfsc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1215,11 +1215,7 @@ hfsc_graft_class(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
new = &noop_qdisc;
}

sch_tree_lock(sch);
hfsc_purge_queue(sch, cl);
*old = cl->qdisc;
cl->qdisc = new;
sch_tree_unlock(sch);
*old = qdisc_replace(sch, new, &cl->qdisc);
return 0;
}

Expand Down
9 changes: 1 addition & 8 deletions net/sched/sch_htb.c
Original file line number Diff line number Diff line change
Expand Up @@ -1163,14 +1163,7 @@ static int htb_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
cl->common.classid)) == NULL)
return -ENOBUFS;

sch_tree_lock(sch);
*old = cl->un.leaf.q;
cl->un.leaf.q = new;
if (*old != NULL) {
qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
qdisc_reset(*old);
}
sch_tree_unlock(sch);
*old = qdisc_replace(sch, new, &cl->un.leaf.q);
return 0;
}

Expand Down
8 changes: 1 addition & 7 deletions net/sched/sch_multiq.c
Original file line number Diff line number Diff line change
Expand Up @@ -303,13 +303,7 @@ static int multiq_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
if (new == NULL)
new = &noop_qdisc;

sch_tree_lock(sch);
*old = q->queues[band];
q->queues[band] = new;
qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
qdisc_reset(*old);
sch_tree_unlock(sch);

*old = qdisc_replace(sch, new, &q->queues[band]);
return 0;
}

Expand Down
10 changes: 1 addition & 9 deletions net/sched/sch_netem.c
Original file line number Diff line number Diff line change
Expand Up @@ -1037,15 +1037,7 @@ static int netem_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
{
struct netem_sched_data *q = qdisc_priv(sch);

sch_tree_lock(sch);
*old = q->qdisc;
q->qdisc = new;
if (*old) {
qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
qdisc_reset(*old);
}
sch_tree_unlock(sch);

*old = qdisc_replace(sch, new, &q->qdisc);
return 0;
}

Expand Down
8 changes: 1 addition & 7 deletions net/sched/sch_prio.c
Original file line number Diff line number Diff line change
Expand Up @@ -268,13 +268,7 @@ static int prio_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
if (new == NULL)
new = &noop_qdisc;

sch_tree_lock(sch);
*old = q->queues[band];
q->queues[band] = new;
qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
qdisc_reset(*old);
sch_tree_unlock(sch);

*old = qdisc_replace(sch, new, &q->queues[band]);
return 0;
}

Expand Down
6 changes: 1 addition & 5 deletions net/sched/sch_qfq.c
Original file line number Diff line number Diff line change
Expand Up @@ -617,11 +617,7 @@ static int qfq_graft_class(struct Qdisc *sch, unsigned long arg,
new = &noop_qdisc;
}

sch_tree_lock(sch);
qfq_purge_queue(cl);
*old = cl->qdisc;
cl->qdisc = new;
sch_tree_unlock(sch);
*old = qdisc_replace(sch, new, &cl->qdisc);
return 0;
}

Expand Down
7 changes: 1 addition & 6 deletions net/sched/sch_red.c
Original file line number Diff line number Diff line change
Expand Up @@ -313,12 +313,7 @@ static int red_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
if (new == NULL)
new = &noop_qdisc;

sch_tree_lock(sch);
*old = q->qdisc;
q->qdisc = new;
qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
qdisc_reset(*old);
sch_tree_unlock(sch);
*old = qdisc_replace(sch, new, &q->qdisc);
return 0;
}

Expand Down
7 changes: 1 addition & 6 deletions net/sched/sch_sfb.c
Original file line number Diff line number Diff line change
Expand Up @@ -606,12 +606,7 @@ static int sfb_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
if (new == NULL)
new = &noop_qdisc;

sch_tree_lock(sch);
*old = q->qdisc;
q->qdisc = new;
qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
qdisc_reset(*old);
sch_tree_unlock(sch);
*old = qdisc_replace(sch, new, &q->qdisc);
return 0;
}

Expand Down
8 changes: 1 addition & 7 deletions net/sched/sch_tbf.c
Original file line number Diff line number Diff line change
Expand Up @@ -502,13 +502,7 @@ static int tbf_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
if (new == NULL)
new = &noop_qdisc;

sch_tree_lock(sch);
*old = q->qdisc;
q->qdisc = new;
qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
qdisc_reset(*old);
sch_tree_unlock(sch);

*old = qdisc_replace(sch, new, &q->qdisc);
return 0;
}

Expand Down

0 comments on commit 86a7996

Please sign in to comment.