Skip to content
  • Eric Dumazet's avatar
    net_sched: fix THROTTLED/RUNNING race · ef352e7c
    Eric Dumazet authored
    commit fd245a4a (net_sched: move TCQ_F_THROTTLED flag)
    added a race.
    
    qdisc_watchdog() is run from softirq, so special care should be taken or
    we can lose one state transition (THROTTLED/RUNNING)
    
    Prior to fd245a4a, we were manipulating q->flags (qdisc->flags &=
    ~TCQ_F_THROTTLED;) and this manipulation could only race with
    qdisc_warn_nonwc().
    
    Since we want to avoid atomic ops in qdisc fast path - it was the
    meaning of commit 37112105
    
     (QDISC_STATE_RUNNING dont need atomic
    bit ops) - fix is to move THROTTLE bit into 'state' field, this one
    being manipulated with SMP and IRQ safe operations.
    
    Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    ef352e7c