pkt_sched: Fix qdisc state in net_tx_action()
net_tx_action() can skip __QDISC_STATE_SCHED bit clearing while qdisc is neither ran nor rescheduled, which may cause endless loop in dev_deactivate(). Reported-by: Denys Fedoryshchenko <denys@visp.net.lb> Tested-by: Denys Fedoryshchenko <denys@visp.net.lb> Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> Acked-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
e3b802ba88
commit
e8a83e10d7
@@ -1991,8 +1991,13 @@ static void net_tx_action(struct softirq_action *h)
|
|||||||
spin_unlock(root_lock);
|
spin_unlock(root_lock);
|
||||||
} else {
|
} else {
|
||||||
if (!test_bit(__QDISC_STATE_DEACTIVATED,
|
if (!test_bit(__QDISC_STATE_DEACTIVATED,
|
||||||
&q->state))
|
&q->state)) {
|
||||||
__netif_reschedule(q);
|
__netif_reschedule(q);
|
||||||
|
} else {
|
||||||
|
smp_mb__before_clear_bit();
|
||||||
|
clear_bit(__QDISC_STATE_SCHED,
|
||||||
|
&q->state);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user