pkt_sched 01/02: remove unnecessary xchg() in packet schedulers
Subsystems (4)
These two patches get rid of the xchg() usage in net/sched with exception of teql, where they might actually be needed (I didn't really check since it uses them in different contexts then other packet schedulers and thus it doesn't really belong in this patchset anyways).
The patches apply on top of the DRR patch.
commit 7f23be11b3d23ca23822a3e65b7eda10ec129e9a
Author: Patrick McHardy <[email protected]> Date: Wed Nov 19 18:58:17 2008 +0100
pkt_sched: remove unnecessary xchg() in packet schedulers
The use of xchg() hasn't been necessary since 2.2.something when proper locking was added to packet schedulers.
net/sched/sch_atm.c +2 -1
@@ -102,7 +102,8 @@ static int atm_tc_graft(struct Qdisc *sch, unsigned long arg,return -EINVAL ;if (!new) new = &noop_qdisc; - *old =xchg (&flow->q, new); + *old = flow->q; + flow->q = new;if (*old)qdisc_reset (*old);return 0 ;
net/sched/sch_cbq.c +4 -3
@@ -1635,7 +1635,8 @@ static int cbq_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,#endif }sch_tree_lock (sch); - *old =xchg (&cl->q, new); + *old = cl->q; + cl->q = new;qdisc_tree_decrease_qlen (*old, (*old)->q.qlen);qdisc_reset (*old);sch_tree_unlock (sch);
@@ -1776,8 +1777,8 @@ cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **tcbq_deactivate_class (cl);if (rtab) { - rtab =xchg (&cl->R_tab, rtab); -qdisc_put_rtab (rtab); +qdisc_put_rtab (cl->R_tab); + cl->R_tab = rtab; }if (tb[TCA_CBQ_LSSOPT ])
net/sched/sch_drr.c +2 -1
@@ -208,7 +208,8 @@ static int drr_graft_class(struct Qdisc *sch, unsigned long arg,sch_tree_lock (sch);drr_purge_queue (cl); - *old =xchg (&cl->qdisc, new); + *old = cl->qdisc; + cl->qdisc = new;sch_tree_unlock (sch);return 0 ; }
net/sched/sch_dsmark.c +2 -1
@@ -68,7 +68,8 @@ static int dsmark_graft(struct Qdisc *sch, unsigned long arg, }sch_tree_lock (sch); - *old =xchg (&p->q, new); + *old = p->q; + p->q = new;qdisc_tree_decrease_qlen (*old, (*old)->q.qlen);qdisc_reset (*old);sch_tree_unlock (sch);
net/sched/sch_hfsc.c +2 -1
@@ -1202,7 +1202,8 @@ hfsc_graft_class(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,sch_tree_lock (sch);hfsc_purge_queue (sch, cl); - *old =xchg (&cl->qdisc, new); + *old = cl->qdisc; + cl->qdisc = new;sch_tree_unlock (sch);return 0 ; }
net/sched/sch_htb.c +3 -1
@@ -1100,7 +1100,9 @@ static int htb_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, == NULL)return -ENOBUFS ;sch_tree_lock (sch); -if ((*old =xchg (&cl->un.leaf.q, new)) !=NULL ) { + *old = cl->un.leaf.q; + cl->un.leaf.q = new; +if (*old !=NULL ) {qdisc_tree_decrease_qlen (*old, (*old)->q.qlen);qdisc_reset (*old); }
net/sched/sch_multiq.c +9 -7
@@ -214,7 +214,8 @@ static int multiq_tune(struct Qdisc *sch, struct nlattr *opt) q->bands = qopt->bands;for (i = q->bands; i < q->max_bands; i++) {if (q->queues[i] != &noop_qdisc) { -struct Qdisc *child =xchg (&q->queues[i], &noop_qdisc); +struct Qdisc *child = q->queues[i]; + q->queues[i] = &noop_qdisc;qdisc_tree_decrease_qlen (child, child->q.qlen);qdisc_destroy (child); }
@@ -224,7 +225,7 @@ static int multiq_tune(struct Qdisc *sch, struct nlattr *opt)for (i =0 ; i < q->bands; i++) {if (q->queues[i] == &noop_qdisc) { -struct Qdisc *child; +struct Qdisc *child, *old; child = qdisc_create_dflt(qdisc_dev(sch), sch->dev_queue, &pfifo_qdisc_ops,
@@ -232,12 +233,13 @@ static int multiq_tune(struct Qdisc *sch, struct nlattr *opt) i + 1));if (child) {sch_tree_lock (sch); - child =xchg (&q->queues[i], child); + old = q->queues[i]; + q->queues[i] = child; -if (child != &noop_qdisc) { -qdisc_tree_decrease_qlen (child, - child->q.qlen); -qdisc_destroy (child); +if (old != &noop_qdisc) { +qdisc_tree_decrease_qlen (old, + old->q.qlen); +qdisc_destroy (old); }sch_tree_unlock (sch); }
net/sched/sch_netem.c +2 -3
@@ -331,10 +331,9 @@ static int get_dist_table(struct Qdisc *sch, const struct nlattr *attr) root_lock =qdisc_root_sleeping_lock (sch);spin_lock_bh (root_lock); - d =xchg (&q->delay_dist, d); +kfree (q->delay_dist); + q->delay_dist = d;spin_unlock_bh (root_lock); - -kfree (d);return 0 ; }
net/sched/sch_prio.c +9 -7
@@ -187,7 +187,8 @@ static int prio_tune(struct Qdisc *sch, struct nlattr *opt)memcpy (q->prio2band, qopt->priomap,TC_PRIO_MAX +1 );for (i=q->bands; i<TCQ_PRIO_BANDS ; i++) { -struct Qdisc *child =xchg (&q->queues[i], &noop_qdisc); +struct Qdisc *child = q->queues[i]; + q->queues[i] = &noop_qdisc;if (child != &noop_qdisc) {qdisc_tree_decrease_qlen (child, child->q.qlen);qdisc_destroy (child);
@@ -197,18 +198,19 @@ static int prio_tune(struct Qdisc *sch, struct nlattr *opt)for (i=0 ; i<q->bands; i++) {if (q->queues[i] == &noop_qdisc) { -struct Qdisc *child; +struct Qdisc *child, *old; child =qdisc_create_dflt (qdisc_dev (sch), sch->dev_queue, &pfifo_qdisc_ops,TC_H_MAKE (sch->handle, i +1 ));if (child) {sch_tree_lock (sch); - child =xchg (&q->queues[i], child); + old = q->queues[i]; + q->queues[i] = child; -if (child != &noop_qdisc) { -qdisc_tree_decrease_qlen (child, - child->q.qlen); -qdisc_destroy (child); +if (old != &noop_qdisc) { +qdisc_tree_decrease_qlen (old, + old->q.qlen); +qdisc_destroy (old); }sch_tree_unlock (sch); }
net/sched/sch_red.c +4 -2
@@ -202,7 +202,8 @@ static int red_change(struct Qdisc *sch, struct nlattr *opt) q->limit = ctl->limit;if (child) {qdisc_tree_decrease_qlen (q->qdisc, q->qdisc->q.qlen); -qdisc_destroy (xchg (&q->qdisc, child)); +qdisc_destroy (q->qdisc); + q->qdisc = child; } red_set_parms(&q->parms, ctl->qth_min, ctl->qth_max, ctl->Wlog,
@@ -283,7 +284,8 @@ static int red_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, new = &noop_qdisc;sch_tree_lock (sch); - *old =xchg (&q->qdisc, new); + *old = q->qdisc; + q->qdisc = new;qdisc_tree_decrease_qlen (*old, (*old)->q.qlen);qdisc_reset (*old);sch_tree_unlock (sch);
net/sched/sch_tbf.c +13 -4
@@ -236,6 +236,7 @@ static int tbf_change(struct Qdisc* sch, struct nlattr *opt)struct tc_tbf_qopt *qopt;struct qdisc_rate_table *rtab =NULL ;struct qdisc_rate_table *ptab =NULL ; +struct qdisc_rate_table *tmp;struct Qdisc *child =NULL ;int max_size,n;
@@ -284,7 +285,8 @@ static int tbf_change(struct Qdisc* sch, struct nlattr *opt)sch_tree_lock (sch);if (child) {qdisc_tree_decrease_qlen (q->qdisc, q->qdisc->q.qlen); -qdisc_destroy (xchg (&q->qdisc, child)); +qdisc_destroy (q->qdisc); + q->qdisc = child; } q->limit = qopt->limit; q->mtu = qopt->mtu;
@@ -292,8 +294,14 @@ static int tbf_change(struct Qdisc* sch, struct nlattr *opt) q->buffer = qopt->buffer; q->tokens = q->buffer; q->ptokens = q->mtu; - rtab =xchg (&q->R_tab, rtab); - ptab =xchg (&q->P_tab, ptab); + + tmp = q->R_tab; + q->R_tab = rtab; + rtab = tmp; + + tmp = q->P_tab; + q->P_tab = ptab; + ptab = tmp;sch_tree_unlock (sch); err =0 ; done:
@@ -383,7 +391,8 @@ static int tbf_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, new = &noop_qdisc;sch_tree_lock (sch); - *old =xchg (&q->qdisc, new); + *old = q->qdisc; + q->qdisc = new;qdisc_tree_decrease_qlen (*old, (*old)->q.qlen);qdisc_reset (*old);sch_tree_unlock (sch);
From: Patrick McHardy <[email protected]>
Date: Wed, 19 Nov 2008 19:03:06 +0100
Quoted 10 lines
commit
7f23be11b3d23ca23822a3e65b7eda10ec129e9aAuthor: Patrick McHardy <[email protected]> Date: Wed Nov 19 18:58:17 2008 +0100
pkt_sched: remove unnecessaryxchg()in packet schedulersThe use of
xchg()hasn't been necessary since 2.2.something when proper locking was added to packet schedulers.Signed-off-by Patrick McHardy <[email protected]>
Applied.