lkml.org 
[lkml]   [2016]   [May]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.2.y-ckt 41/53] net_sched: introduce qdisc_replace() helper
    Date
    4.2.8-ckt11 -stable review patch.  If anyone has any objections, please let me know.

    ---8<------------------------------------------------------------

    From: WANG Cong <xiyou.wangcong@gmail.com>

    [ Upstream commit 86a7996cc8a078793670d82ed97d5a99bb4e8496 ]

    Remove nearly duplicated code and prepare for the following patch.

    Cc: Jamal Hadi Salim <jhs@mojatatu.com>
    Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>
    Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    include/net/sch_generic.h | 17 +++++++++++++++++
    net/sched/sch_cbq.c | 7 +------
    net/sched/sch_drr.c | 6 +-----
    net/sched/sch_dsmark.c | 8 +-------
    net/sched/sch_hfsc.c | 6 +-----
    net/sched/sch_htb.c | 9 +--------
    net/sched/sch_multiq.c | 8 +-------
    net/sched/sch_netem.c | 10 +---------
    net/sched/sch_prio.c | 8 +-------
    net/sched/sch_qfq.c | 6 +-----
    net/sched/sch_red.c | 7 +------
    net/sched/sch_sfb.c | 7 +------
    net/sched/sch_tbf.c | 8 +-------
    13 files changed, 29 insertions(+), 78 deletions(-)

    diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
    index 49dda38..bdec252 100644
    --- a/include/net/sch_generic.h
    +++ b/include/net/sch_generic.h
    @@ -685,6 +685,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)
    {
    diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c
    index beeb75f..17ad79e 100644
    --- a/net/sched/sch_cbq.c
    +++ b/net/sched/sch_cbq.c
    @@ -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;
    }

    diff --git a/net/sched/sch_drr.c b/net/sched/sch_drr.c
    index 3387060..d4b3f82 100644
    --- a/net/sched/sch_drr.c
    +++ b/net/sched/sch_drr.c
    @@ -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;
    }

    diff --git a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c
    index 66700a6..d2084e7 100644
    --- a/net/sched/sch_dsmark.c
    +++ b/net/sched/sch_dsmark.c
    @@ -67,13 +67,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;
    }

    diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c
    index e6c7416..134f7d2 100644
    --- a/net/sched/sch_hfsc.c
    +++ b/net/sched/sch_hfsc.c
    @@ -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;
    }

    diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c
    index f1acb0f..520ffe9 100644
    --- a/net/sched/sch_htb.c
    +++ b/net/sched/sch_htb.c
    @@ -1165,14 +1165,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;
    }

    diff --git a/net/sched/sch_multiq.c b/net/sched/sch_multiq.c
    index 42dd218..f36ff83 100644
    --- a/net/sched/sch_multiq.c
    +++ b/net/sched/sch_multiq.c
    @@ -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;
    }

    diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c
    index 5abd1d9..0a6ddaf 100644
    --- a/net/sched/sch_netem.c
    +++ b/net/sched/sch_netem.c
    @@ -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;
    }

    diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c
    index 8e5cd34..a677f54 100644
    --- a/net/sched/sch_prio.c
    +++ b/net/sched/sch_prio.c
    @@ -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;
    }

    diff --git a/net/sched/sch_qfq.c b/net/sched/sch_qfq.c
    index b8d73bc..ba0fcc3 100644
    --- a/net/sched/sch_qfq.c
    +++ b/net/sched/sch_qfq.c
    @@ -618,11 +618,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;
    }

    diff --git a/net/sched/sch_red.c b/net/sched/sch_red.c
    index 6c0534c..d5abcee 100644
    --- a/net/sched/sch_red.c
    +++ b/net/sched/sch_red.c
    @@ -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;
    }

    diff --git a/net/sched/sch_sfb.c b/net/sched/sch_sfb.c
    index 4b81519..7dac64c 100644
    --- a/net/sched/sch_sfb.c
    +++ b/net/sched/sch_sfb.c
    @@ -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;
    }

    diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c
    index a4afde1..56a1aef 100644
    --- a/net/sched/sch_tbf.c
    +++ b/net/sched/sch_tbf.c
    @@ -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;
    }

    --
    2.7.4
    \
     
     \ /
      Last update: 2016-05-24 20:21    [W:6.174 / U:0.368 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site