mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 07:12:09 +00:00
[NET_SCHED]: ingress: switch back to using ingress_lock
Switch ingress queueing back to use ingress_lock. qdisc_lock_tree now locks both the ingress and egress qdiscs on the device. All changes to data that might be used on both ingress and egress needs to be protected by using qdisc_lock_tree instead of manually taking dev->queue_lock. Additionally the qdisc stats_lock needs to be initialized to ingress_lock for ingress qdiscs. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
0463d4ae25
commit
fd44de7cc1
5 changed files with 26 additions and 23 deletions
|
@ -500,12 +500,16 @@ qdisc_create(struct net_device *dev, u32 handle, struct rtattr **tca, int *errp)
|
|||
|
||||
if (handle == TC_H_INGRESS) {
|
||||
sch->flags |= TCQ_F_INGRESS;
|
||||
sch->stats_lock = &dev->ingress_lock;
|
||||
handle = TC_H_MAKE(TC_H_INGRESS, 0);
|
||||
} else if (handle == 0) {
|
||||
handle = qdisc_alloc_handle(dev);
|
||||
err = -ENOMEM;
|
||||
if (handle == 0)
|
||||
goto err_out3;
|
||||
} else {
|
||||
sch->stats_lock = &dev->queue_lock;
|
||||
if (handle == 0) {
|
||||
handle = qdisc_alloc_handle(dev);
|
||||
err = -ENOMEM;
|
||||
if (handle == 0)
|
||||
goto err_out3;
|
||||
}
|
||||
}
|
||||
|
||||
sch->handle = handle;
|
||||
|
@ -654,9 +658,9 @@ static int tc_get_qdisc(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
|
|||
return err;
|
||||
if (q) {
|
||||
qdisc_notify(skb, n, clid, q, NULL);
|
||||
spin_lock_bh(&dev->queue_lock);
|
||||
qdisc_lock_tree(dev);
|
||||
qdisc_destroy(q);
|
||||
spin_unlock_bh(&dev->queue_lock);
|
||||
qdisc_unlock_tree(dev);
|
||||
}
|
||||
} else {
|
||||
qdisc_notify(skb, n, clid, NULL, q);
|
||||
|
@ -789,17 +793,17 @@ graft:
|
|||
err = qdisc_graft(dev, p, clid, q, &old_q);
|
||||
if (err) {
|
||||
if (q) {
|
||||
spin_lock_bh(&dev->queue_lock);
|
||||
qdisc_lock_tree(dev);
|
||||
qdisc_destroy(q);
|
||||
spin_unlock_bh(&dev->queue_lock);
|
||||
qdisc_unlock_tree(dev);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
qdisc_notify(skb, n, clid, old_q, q);
|
||||
if (old_q) {
|
||||
spin_lock_bh(&dev->queue_lock);
|
||||
qdisc_lock_tree(dev);
|
||||
qdisc_destroy(old_q);
|
||||
spin_unlock_bh(&dev->queue_lock);
|
||||
qdisc_unlock_tree(dev);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue