diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-17 23:53:52 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-17 23:53:52 -0400 |
commit | f205ce83a766c08965ec78342f138cdc00631fba (patch) | |
tree | 7a9d2db6c16594ef7c730ca93a87131cf0abca41 /net/sched/sch_api.c | |
parent | 3dc95666df0e1ae5b7381a8ec97a583bb3ce4306 (diff) | |
parent | b31c50a7f9e93a61d14740dedcbbf2c376998bc7 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (66 commits)
be2net: fix some cmds to use mccq instead of mbox
atl1e: fix 2.6.31-git4 -- ATL1E 0000:03:00.0: DMA-API: device driver frees DMA
pkt_sched: Fix qstats.qlen updating in dump_stats
ipv6: Log the affected address when DAD failure occurs
wl12xx: Fix print_mac() conversion.
af_iucv: fix race when queueing skbs on the backlog queue
af_iucv: do not call iucv_sock_kill() twice
af_iucv: handle non-accepted sockets after resuming from suspend
af_iucv: fix race in __iucv_sock_wait()
iucv: use correct output register in iucv_query_maxconn()
iucv: fix iucv_buffer_cpumask check when calling IUCV functions
iucv: suspend/resume error msg for left over pathes
wl12xx: switch to %pM to print the mac address
b44: the poll handler b44_poll must not enable IRQ unconditionally
ipv6: Ignore route option with ROUTER_PREF_INVALID
bonding: make ab_arp select active slaves as other modes
cfg80211: fix SME connect
rc80211_minstrel: fix contention window calculation
ssb/sdio: fix printk format warnings
p54usb: add Zcomax XG-705A usbid
...
Diffstat (limited to 'net/sched/sch_api.c')
-rw-r--r-- | net/sched/sch_api.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index 692d9a41cd23..903e4188b6ca 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c | |||
@@ -693,13 +693,18 @@ static int qdisc_graft(struct net_device *dev, struct Qdisc *parent, | |||
693 | if (new && i > 0) | 693 | if (new && i > 0) |
694 | atomic_inc(&new->refcnt); | 694 | atomic_inc(&new->refcnt); |
695 | 695 | ||
696 | qdisc_destroy(old); | 696 | if (!ingress) |
697 | qdisc_destroy(old); | ||
697 | } | 698 | } |
698 | 699 | ||
699 | notify_and_destroy(skb, n, classid, dev->qdisc, new); | 700 | if (!ingress) { |
700 | if (new && !new->ops->attach) | 701 | notify_and_destroy(skb, n, classid, dev->qdisc, new); |
701 | atomic_inc(&new->refcnt); | 702 | if (new && !new->ops->attach) |
702 | dev->qdisc = new ? : &noop_qdisc; | 703 | atomic_inc(&new->refcnt); |
704 | dev->qdisc = new ? : &noop_qdisc; | ||
705 | } else { | ||
706 | notify_and_destroy(skb, n, classid, old, new); | ||
707 | } | ||
703 | 708 | ||
704 | if (dev->flags & IFF_UP) | 709 | if (dev->flags & IFF_UP) |
705 | dev_activate(dev); | 710 | dev_activate(dev); |
@@ -804,7 +809,7 @@ qdisc_create(struct net_device *dev, struct netdev_queue *dev_queue, | |||
804 | stab = qdisc_get_stab(tca[TCA_STAB]); | 809 | stab = qdisc_get_stab(tca[TCA_STAB]); |
805 | if (IS_ERR(stab)) { | 810 | if (IS_ERR(stab)) { |
806 | err = PTR_ERR(stab); | 811 | err = PTR_ERR(stab); |
807 | goto err_out3; | 812 | goto err_out4; |
808 | } | 813 | } |
809 | sch->stab = stab; | 814 | sch->stab = stab; |
810 | } | 815 | } |
@@ -833,7 +838,6 @@ qdisc_create(struct net_device *dev, struct netdev_queue *dev_queue, | |||
833 | return sch; | 838 | return sch; |
834 | } | 839 | } |
835 | err_out3: | 840 | err_out3: |
836 | qdisc_put_stab(sch->stab); | ||
837 | dev_put(dev); | 841 | dev_put(dev); |
838 | kfree((char *) sch - sch->padded); | 842 | kfree((char *) sch - sch->padded); |
839 | err_out2: | 843 | err_out2: |
@@ -847,6 +851,7 @@ err_out4: | |||
847 | * Any broken qdiscs that would require a ops->reset() here? | 851 | * Any broken qdiscs that would require a ops->reset() here? |
848 | * The qdisc was never in action so it shouldn't be necessary. | 852 | * The qdisc was never in action so it shouldn't be necessary. |
849 | */ | 853 | */ |
854 | qdisc_put_stab(sch->stab); | ||
850 | if (ops->destroy) | 855 | if (ops->destroy) |
851 | ops->destroy(sch); | 856 | ops->destroy(sch); |
852 | goto err_out3; | 857 | goto err_out3; |
@@ -1111,12 +1116,16 @@ create_n_graft: | |||
1111 | tcm->tcm_parent, tcm->tcm_parent, | 1116 | tcm->tcm_parent, tcm->tcm_parent, |
1112 | tca, &err); | 1117 | tca, &err); |
1113 | else { | 1118 | else { |
1114 | unsigned int ntx = 0; | 1119 | struct netdev_queue *dev_queue; |
1115 | 1120 | ||
1116 | if (p && p->ops->cl_ops && p->ops->cl_ops->select_queue) | 1121 | if (p && p->ops->cl_ops && p->ops->cl_ops->select_queue) |
1117 | ntx = p->ops->cl_ops->select_queue(p, tcm); | 1122 | dev_queue = p->ops->cl_ops->select_queue(p, tcm); |
1123 | else if (p) | ||
1124 | dev_queue = p->dev_queue; | ||
1125 | else | ||
1126 | dev_queue = netdev_get_tx_queue(dev, 0); | ||
1118 | 1127 | ||
1119 | q = qdisc_create(dev, netdev_get_tx_queue(dev, ntx), p, | 1128 | q = qdisc_create(dev, dev_queue, p, |
1120 | tcm->tcm_parent, tcm->tcm_handle, | 1129 | tcm->tcm_parent, tcm->tcm_handle, |
1121 | tca, &err); | 1130 | tca, &err); |
1122 | } | 1131 | } |