pkt_sched: Add 'deactivated' state.
This new state lets dev_deactivate() mark a qdisc as having been deactivated. dev_queue_xmit() and ing_filter() check for this bit and do not try to process the qdisc if the bit is set. dev_deactivate() polls the qdisc after setting the bit, waiting for both __QDISC_STATE_RUNNING and __QDISC_STATE_SCHED to clear. This isn't perfect yet, but subsequent changesets will make it so. This part is just one piece of the puzzle. Signed-off-by: David S. Miller <davem@davemloft.net>
Šī revīzija ir iekļauta:
@@ -597,6 +597,9 @@ static void transition_one_qdisc(struct net_device *dev,
|
||||
struct Qdisc *new_qdisc = dev_queue->qdisc_sleeping;
|
||||
int *need_watchdog_p = _need_watchdog;
|
||||
|
||||
if (!(new_qdisc->flags & TCQ_F_BUILTIN))
|
||||
clear_bit(__QDISC_STATE_DEACTIVATED, &new_qdisc->state);
|
||||
|
||||
rcu_assign_pointer(dev_queue->qdisc, new_qdisc);
|
||||
if (need_watchdog_p && new_qdisc != &noqueue_qdisc)
|
||||
*need_watchdog_p = 1;
|
||||
@@ -640,6 +643,9 @@ static void dev_deactivate_queue(struct net_device *dev,
|
||||
if (qdisc) {
|
||||
spin_lock_bh(qdisc_lock(qdisc));
|
||||
|
||||
if (!(qdisc->flags & TCQ_F_BUILTIN))
|
||||
set_bit(__QDISC_STATE_DEACTIVATED, &qdisc->state);
|
||||
|
||||
dev_queue->qdisc = qdisc_default;
|
||||
qdisc_reset(qdisc);
|
||||
|
||||
|
Atsaukties uz šo jaunā problēmā
Block a user