lkml.org 
[lkml]   [2023]   [Aug]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 net-next 03/10] net/sched: taprio: try again to report q->qdiscs[] to qdisc_leaf()
    Date
    This is another stab at commit 1461d212ab27 ("net/sched: taprio: make
    qdisc_leaf() see the per-netdev-queue pfifo child qdiscs"), later
    reverted in commit af7b29b1deaa ("Revert "net/sched: taprio: make
    qdisc_leaf() see the per-netdev-queue pfifo child qdiscs"").

    I believe that the problems that caused the revert were fixed, and thus,
    this change is identical to the original patch.

    Its purpose is to properly reject attaching a software taprio child
    qdisc to a software taprio parent. Because unoffloaded taprio currently
    reports itself (the root Qdisc) as the return value from qdisc_leaf(),
    then the process of attaching another taprio as child to a Qdisc class
    of the root will just result in a Qdisc_ops :: change() call for the
    root. Whereas that's not we want. We want Qdisc_ops :: init() to be
    called for the taprio child, in order to give the taprio child a chance
    to check whether its sch->parent is TC_H_ROOT or not (and reject this
    configuration).

    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    ---
    v2->v3: none
    v1->v2: rebase on top of rtnl_dereference() change for txq->qdisc_sleeping

    net/sched/sch_taprio.c | 8 +++++---
    1 file changed, 5 insertions(+), 3 deletions(-)

    diff --git a/net/sched/sch_taprio.c b/net/sched/sch_taprio.c
    index 41944197876a..c9ad585b5dc7 100644
    --- a/net/sched/sch_taprio.c
    +++ b/net/sched/sch_taprio.c
    @@ -2442,12 +2442,14 @@ static int taprio_dump(struct Qdisc *sch, struct sk_buff *skb)

    static struct Qdisc *taprio_leaf(struct Qdisc *sch, unsigned long cl)
    {
    - struct netdev_queue *dev_queue = taprio_queue_get(sch, cl);
    + struct taprio_sched *q = qdisc_priv(sch);
    + struct net_device *dev = qdisc_dev(sch);
    + unsigned int ntx = cl - 1;

    - if (!dev_queue)
    + if (ntx >= dev->num_tx_queues)
    return NULL;

    - return rtnl_dereference(dev_queue->qdisc_sleeping);
    + return q->qdiscs[ntx];
    }

    static unsigned long taprio_find(struct Qdisc *sch, u32 classid)
    --
    2.34.1
    \
     
     \ /
      Last update: 2023-08-01 20:27    [W:3.495 / U:0.200 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site