diff options
author | Patrick McHardy <kaber@trash.net> | 2009-09-04 02:41:18 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-09-06 05:07:03 -0400 |
commit | af356afa010f3cd2c8b8fcc3bce90f7a7b7ec02a (patch) | |
tree | 302d938363bbaec3e69a58e36dbf8a304b24144c /net/core/rtnetlink.c | |
parent | 5b9a9ccfad8553dbf7a9b17ba78bad70215ed0e2 (diff) |
net_sched: reintroduce dev->qdisc for use by sch_api
Currently the multiqueue integration with the qdisc API suffers from
a few problems:
- with multiple queues, all root qdiscs use the same handle. This means
they can't be exposed to userspace in a backwards compatible fashion.
- all API operations always refer to queue number 0. Newly created
qdiscs are automatically shared between all queues, its not possible
to address individual queues or restore multiqueue behaviour once a
shared qdisc has been attached.
- Dumps only contain the root qdisc of queue 0, in case of non-shared
qdiscs this means the statistics are incomplete.
This patch reintroduces dev->qdisc, which points to the (single) root qdisc
from userspace's point of view. Currently it either points to the first
(non-shared) default qdisc, or a qdisc shared between all queues. The
following patches will introduce a classful dummy qdisc, which will be used
as root qdisc and contain the per-queue qdiscs as children.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/rtnetlink.c')
-rw-r--r-- | net/core/rtnetlink.c | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index bbcba2a41018..eb42873f2a3a 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -606,7 +606,6 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, | |||
606 | int type, u32 pid, u32 seq, u32 change, | 606 | int type, u32 pid, u32 seq, u32 change, |
607 | unsigned int flags) | 607 | unsigned int flags) |
608 | { | 608 | { |
609 | struct netdev_queue *txq; | ||
610 | struct ifinfomsg *ifm; | 609 | struct ifinfomsg *ifm; |
611 | struct nlmsghdr *nlh; | 610 | struct nlmsghdr *nlh; |
612 | const struct net_device_stats *stats; | 611 | const struct net_device_stats *stats; |
@@ -637,9 +636,8 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, | |||
637 | if (dev->master) | 636 | if (dev->master) |
638 | NLA_PUT_U32(skb, IFLA_MASTER, dev->master->ifindex); | 637 | NLA_PUT_U32(skb, IFLA_MASTER, dev->master->ifindex); |
639 | 638 | ||
640 | txq = netdev_get_tx_queue(dev, 0); | 639 | if (dev->qdisc) |
641 | if (txq->qdisc_sleeping) | 640 | NLA_PUT_STRING(skb, IFLA_QDISC, dev->qdisc->ops->id); |
642 | NLA_PUT_STRING(skb, IFLA_QDISC, txq->qdisc_sleeping->ops->id); | ||
643 | 641 | ||
644 | if (dev->ifalias) | 642 | if (dev->ifalias) |
645 | NLA_PUT_STRING(skb, IFLA_IFALIAS, dev->ifalias); | 643 | NLA_PUT_STRING(skb, IFLA_IFALIAS, dev->ifalias); |