lkml.org 
[lkml]   [2020]   [May]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 087/312] net_sched: keep backlog updated with qlen
    Date
    From: WANG Cong <xiyou.wangcong@gmail.com>

    commit a27758ffaf96f89002129eedb2cc172d254099f8 upstream.

    For gso_skb we only update qlen, backlog should be updated too.

    Note, it is correct to just update these stats at one layer,
    because the gso_skb is cached there.

    Reported-by: Stas Nichiporovich <stasn77@gmail.com>
    Fixes: 2ccccf5fb43f ("net_sched: update hierarchical backlog too")
    Cc: 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: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    include/net/sch_generic.h | 5 ++++-
    net/sched/sch_generic.c | 2 ++
    2 files changed, 6 insertions(+), 1 deletion(-)

    --- a/include/net/sch_generic.h
    +++ b/include/net/sch_generic.h
    @@ -674,9 +674,11 @@ static inline struct sk_buff *qdisc_peek
    /* we can reuse ->gso_skb because peek isn't called for root qdiscs */
    if (!sch->gso_skb) {
    sch->gso_skb = sch->dequeue(sch);
    - if (sch->gso_skb)
    + if (sch->gso_skb) {
    /* it's still part of the queue */
    + qdisc_qstats_backlog_inc(sch, sch->gso_skb);
    sch->q.qlen++;
    + }
    }

    return sch->gso_skb;
    @@ -689,6 +691,7 @@ static inline struct sk_buff *qdisc_dequ

    if (skb) {
    sch->gso_skb = NULL;
    + qdisc_qstats_backlog_dec(sch, skb);
    sch->q.qlen--;
    } else {
    skb = sch->dequeue(sch);
    --- a/net/sched/sch_generic.c
    +++ b/net/sched/sch_generic.c
    @@ -49,6 +49,7 @@ static inline int dev_requeue_skb(struct
    {
    q->gso_skb = skb;
    q->qstats.requeues++;
    + qdisc_qstats_backlog_inc(q, skb);
    q->q.qlen++; /* it's still part of the queue */
    __netif_schedule(q);

    @@ -92,6 +93,7 @@ static struct sk_buff *dequeue_skb(struc
    txq = skb_get_tx_queue(txq->dev, skb);
    if (!netif_xmit_frozen_or_stopped(txq)) {
    q->gso_skb = NULL;
    + qdisc_qstats_backlog_dec(q, skb);
    q->q.qlen--;
    } else
    skb = NULL;

    \
     
     \ /
      Last update: 2020-05-08 14:41    [W:2.328 / U:0.324 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site