projects
/
powerpc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'for-linus' of git://one.firstfloor.org/home/andi/git/linux-2.6
[powerpc.git]
/
net
/
sched
/
sch_tbf.c
diff --git
a/net/sched/sch_tbf.c
b/net/sched/sch_tbf.c
index
2562a60
..
5386295
100644
(file)
--- a/
net/sched/sch_tbf.c
+++ b/
net/sched/sch_tbf.c
@@
-32,6
+32,7
@@
#include <linux/etherdevice.h>
#include <linux/notifier.h>
#include <net/ip.h>
#include <linux/etherdevice.h>
#include <linux/notifier.h>
#include <net/ip.h>
+#include <net/netlink.h>
#include <net/route.h>
#include <linux/skbuff.h>
#include <net/sock.h>
#include <net/route.h>
#include <linux/skbuff.h>
#include <net/sock.h>
@@
-127,8
+128,8
@@
struct tbf_sched_data
long tokens; /* Current number of B tokens */
long ptokens; /* Current number of P tokens */
psched_time_t t_c; /* Time check-point */
long tokens; /* Current number of B tokens */
long ptokens; /* Current number of P tokens */
psched_time_t t_c; /* Time check-point */
- struct timer_list wd_timer; /* Watchdog timer */
struct Qdisc *qdisc; /* Inner qdisc, default - bfifo queue */
struct Qdisc *qdisc; /* Inner qdisc, default - bfifo queue */
+ struct qdisc_watchdog watchdog; /* Watchdog timer */
};
#define L2T(q,L) ((q)->R_tab->data[(L)>>(q)->R_tab->rate.cell_log])
};
#define L2T(q,L) ((q)->R_tab->data[(L)>>(q)->R_tab->rate.cell_log])
@@
-185,14
+186,6
@@
static unsigned int tbf_drop(struct Qdisc* sch)
return len;
}
return len;
}
-static void tbf_watchdog(unsigned long arg)
-{
- struct Qdisc *sch = (struct Qdisc*)arg;
-
- sch->flags &= ~TCQ_F_THROTTLED;
- netif_schedule(sch->dev);
-}
-
static struct sk_buff *tbf_dequeue(struct Qdisc* sch)
{
struct tbf_sched_data *q = qdisc_priv(sch);
static struct sk_buff *tbf_dequeue(struct Qdisc* sch)
{
struct tbf_sched_data *q = qdisc_priv(sch);
@@
-202,13
+195,12
@@
static struct sk_buff *tbf_dequeue(struct Qdisc* sch)
if (skb) {
psched_time_t now;
if (skb) {
psched_time_t now;
- long toks
, delay
;
+ long toks;
long ptoks = 0;
unsigned int len = skb->len;
long ptoks = 0;
unsigned int len = skb->len;
- PSCHED_GET_TIME(now);
-
- toks = PSCHED_TDIFF_SAFE(now, q->t_c, q->buffer);
+ now = psched_get_time();
+ toks = psched_tdiff_bounded(now, q->t_c, q->buffer);
if (q->P_tab) {
ptoks = toks + q->ptokens;
if (q->P_tab) {
ptoks = toks + q->ptokens;
@@
-230,12
+222,8
@@
static struct sk_buff *tbf_dequeue(struct Qdisc* sch)
return skb;
}
return skb;
}
- delay = PSCHED_US2JIFFIE(max_t(long, -toks, -ptoks));
-
- if (delay == 0)
- delay = 1;
-
- mod_timer(&q->wd_timer, jiffies+delay);
+ qdisc_watchdog_schedule(&q->watchdog,
+ now + max_t(long, -toks, -ptoks));
/* Maybe we have a shorter packet in the queue,
which can be sent now. It sounds cool,
/* Maybe we have a shorter packet in the queue,
which can be sent now. It sounds cool,
@@
-250,11
+238,10
@@
static struct sk_buff *tbf_dequeue(struct Qdisc* sch)
if (q->qdisc->ops->requeue(skb, q->qdisc) != NET_XMIT_SUCCESS) {
/* When requeue fails skb is dropped */
if (q->qdisc->ops->requeue(skb, q->qdisc) != NET_XMIT_SUCCESS) {
/* When requeue fails skb is dropped */
-
sch->q.qlen--
;
+
qdisc_tree_decrease_qlen(q->qdisc, 1)
;
sch->qstats.drops++;
}
sch->qstats.drops++;
}
- sch->flags |= TCQ_F_THROTTLED;
sch->qstats.overlimits++;
}
return NULL;
sch->qstats.overlimits++;
}
return NULL;
@@
-266,17
+253,16
@@
static void tbf_reset(struct Qdisc* sch)
qdisc_reset(q->qdisc);
sch->q.qlen = 0;
qdisc_reset(q->qdisc);
sch->q.qlen = 0;
-
PSCHED_GET_TIME(q->t_c
);
+
q->t_c = psched_get_time(
);
q->tokens = q->buffer;
q->ptokens = q->mtu;
q->tokens = q->buffer;
q->ptokens = q->mtu;
- sch->flags &= ~TCQ_F_THROTTLED;
- del_timer(&q->wd_timer);
+ qdisc_watchdog_cancel(&q->watchdog);
}
static struct Qdisc *tbf_create_dflt_qdisc(struct Qdisc *sch, u32 limit)
{
struct Qdisc *q;
}
static struct Qdisc *tbf_create_dflt_qdisc(struct Qdisc *sch, u32 limit)
{
struct Qdisc *q;
-
struct rtattr *rta;
+ struct rtattr *rta;
int ret;
q = qdisc_create_dflt(sch->dev, &bfifo_qdisc_ops,
int ret;
q = qdisc_create_dflt(sch->dev, &bfifo_qdisc_ops,
@@
-285,7
+271,7
@@
static struct Qdisc *tbf_create_dflt_qdisc(struct Qdisc *sch, u32 limit)
rta = kmalloc(RTA_LENGTH(sizeof(struct tc_fifo_qopt)), GFP_KERNEL);
if (rta) {
rta->rta_type = RTM_NEWQDISC;
rta = kmalloc(RTA_LENGTH(sizeof(struct tc_fifo_qopt)), GFP_KERNEL);
if (rta) {
rta->rta_type = RTM_NEWQDISC;
- rta->rta_len = RTA_LENGTH(sizeof(struct tc_fifo_qopt));
+ rta->rta_len = RTA_LENGTH(sizeof(struct tc_fifo_qopt));
((struct tc_fifo_qopt *)RTA_DATA(rta))->limit = limit;
ret = q->ops->change(q, rta);
((struct tc_fifo_qopt *)RTA_DATA(rta))->limit = limit;
ret = q->ops->change(q, rta);
@@
-348,8
+334,10
@@
static int tbf_change(struct Qdisc* sch, struct rtattr *opt)
}
sch_tree_lock(sch);
}
sch_tree_lock(sch);
- if (child)
+ if (child) {
+ qdisc_tree_decrease_qlen(q->qdisc, q->qdisc->q.qlen);
qdisc_destroy(xchg(&q->qdisc, child));
qdisc_destroy(xchg(&q->qdisc, child));
+ }
q->limit = qopt->limit;
q->mtu = qopt->mtu;
q->max_size = max_size;
q->limit = qopt->limit;
q->mtu = qopt->mtu;
q->max_size = max_size;
@@
-375,11
+363,8
@@
static int tbf_init(struct Qdisc* sch, struct rtattr *opt)
if (opt == NULL)
return -EINVAL;
if (opt == NULL)
return -EINVAL;
- PSCHED_GET_TIME(q->t_c);
- init_timer(&q->wd_timer);
- q->wd_timer.function = tbf_watchdog;
- q->wd_timer.data = (unsigned long)sch;
-
+ q->t_c = psched_get_time();
+ qdisc_watchdog_init(&q->watchdog, sch);
q->qdisc = &noop_qdisc;
return tbf_change(sch, opt);
q->qdisc = &noop_qdisc;
return tbf_change(sch, opt);
@@
-389,7
+374,7
@@
static void tbf_destroy(struct Qdisc *sch)
{
struct tbf_sched_data *q = qdisc_priv(sch);
{
struct tbf_sched_data *q = qdisc_priv(sch);
-
del_timer(&q->wd_timer
);
+
qdisc_watchdog_cancel(&q->watchdog
);
if (q->P_tab)
qdisc_put_rtab(q->P_tab);
if (q->P_tab)
qdisc_put_rtab(q->P_tab);
@@
-402,7
+387,7
@@
static void tbf_destroy(struct Qdisc *sch)
static int tbf_dump(struct Qdisc *sch, struct sk_buff *skb)
{
struct tbf_sched_data *q = qdisc_priv(sch);
static int tbf_dump(struct Qdisc *sch, struct sk_buff *skb)
{
struct tbf_sched_data *q = qdisc_priv(sch);
- unsigned char
*b = skb->tail
;
+ unsigned char
*b = skb_tail_pointer(skb)
;
struct rtattr *rta;
struct tc_tbf_qopt opt;
struct rtattr *rta;
struct tc_tbf_qopt opt;
@@
-418,12
+403,12
@@
static int tbf_dump(struct Qdisc *sch, struct sk_buff *skb)
opt.mtu = q->mtu;
opt.buffer = q->buffer;
RTA_PUT(skb, TCA_TBF_PARMS, sizeof(opt), &opt);
opt.mtu = q->mtu;
opt.buffer = q->buffer;
RTA_PUT(skb, TCA_TBF_PARMS, sizeof(opt), &opt);
- rta->rta_len = skb
->tail
- b;
+ rta->rta_len = skb
_tail_pointer(skb)
- b;
return skb->len;
rtattr_failure:
return skb->len;
rtattr_failure:
-
skb_trim(skb, b - skb->data
);
+
nlmsg_trim(skb, b
);
return -1;
}
return -1;
}
@@
-451,8
+436,8
@@
static int tbf_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
sch_tree_lock(sch);
*old = xchg(&q->qdisc, new);
sch_tree_lock(sch);
*old = xchg(&q->qdisc, new);
+ qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
qdisc_reset(*old);
qdisc_reset(*old);
- sch->q.qlen = 0;
sch_tree_unlock(sch);
return 0;
sch_tree_unlock(sch);
return 0;
@@
-473,7
+458,7
@@
static void tbf_put(struct Qdisc *sch, unsigned long arg)
{
}
{
}
-static int tbf_change_class(struct Qdisc *sch, u32 classid, u32 parentid,
+static int tbf_change_class(struct Qdisc *sch, u32 classid, u32 parentid,
struct rtattr **tca, unsigned long *arg)
{
return -ENOSYS;
struct rtattr **tca, unsigned long *arg)
{
return -ENOSYS;