diff options
author | Patrick McHardy <kaber@trash.net> | 2009-09-04 02:41:20 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-09-06 05:07:05 -0400 |
commit | 589983cd21f4a2e4ed74a958805a90fa676845c5 (patch) | |
tree | 21ce556958da203400d3e9d30911ff330be39e90 /net/sched/sch_generic.c | |
parent | af356afa010f3cd2c8b8fcc3bce90f7a7b7ec02a (diff) |
net_sched: move dev_graft_qdisc() to sch_generic.c
It will be used in a following patch by the multiqueue qdisc.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched/sch_generic.c')
-rw-r--r-- | net/sched/sch_generic.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index a91f079fb47a..e7c47ceb0098 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
@@ -623,6 +623,31 @@ void qdisc_destroy(struct Qdisc *qdisc) | |||
623 | } | 623 | } |
624 | EXPORT_SYMBOL(qdisc_destroy); | 624 | EXPORT_SYMBOL(qdisc_destroy); |
625 | 625 | ||
626 | /* Attach toplevel qdisc to device queue. */ | ||
627 | struct Qdisc *dev_graft_qdisc(struct netdev_queue *dev_queue, | ||
628 | struct Qdisc *qdisc) | ||
629 | { | ||
630 | struct Qdisc *oqdisc = dev_queue->qdisc_sleeping; | ||
631 | spinlock_t *root_lock; | ||
632 | |||
633 | root_lock = qdisc_lock(oqdisc); | ||
634 | spin_lock_bh(root_lock); | ||
635 | |||
636 | /* Prune old scheduler */ | ||
637 | if (oqdisc && atomic_read(&oqdisc->refcnt) <= 1) | ||
638 | qdisc_reset(oqdisc); | ||
639 | |||
640 | /* ... and graft new one */ | ||
641 | if (qdisc == NULL) | ||
642 | qdisc = &noop_qdisc; | ||
643 | dev_queue->qdisc_sleeping = qdisc; | ||
644 | rcu_assign_pointer(dev_queue->qdisc, &noop_qdisc); | ||
645 | |||
646 | spin_unlock_bh(root_lock); | ||
647 | |||
648 | return oqdisc; | ||
649 | } | ||
650 | |||
626 | static void attach_one_default_qdisc(struct net_device *dev, | 651 | static void attach_one_default_qdisc(struct net_device *dev, |
627 | struct netdev_queue *dev_queue, | 652 | struct netdev_queue *dev_queue, |
628 | void *_unused) | 653 | void *_unused) |