• Patrick McHardy's avatar
    [PKT_SCHED]: Unline inner qdiscs immediately in qdisc_destroy() · b4cd3f93
    Patrick McHardy authored
    Before the RCU change distruction of the qdisc and all inner
    qdiscs happend immediately and under the rtnl semaphore. This
    made sure nothing holding the rtnl semaphore could end up with
    invalid memory. This is not true anymore, inner qdiscs found on
    dev->qdisc_list can be suddenly destroyed by the RCU callback.
    nothing can find them until they get destroyed.
    
    This also makes semantics sane again, an inner qdiscs should not
    be user-visible once the containing qdisc has been destroyed. The
    second part (locking in qdisc_lookup) is not really required, but
    currently the only purpose of qdisc_tree_lock seems to be to protect
    dev->qdisc_list, which is also protected by the rtnl. The rtnl is
    especially relied on for making sure nobody frees a qdisc while it
    is used in user-context, so qdisc_tree_lock looks unnecessary. I'm
    currently reviewing all qdisc locking, if this turns out to be right
    I will remove qdisc_tree_lock entirely in a follow-up patch, but for
    now I left it in for consistency.
    Signed-off-by: default avatarPatrick McHardy <kaber@trash.net>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    b4cd3f93
sch_api.c 29.4 KB