[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20080723222631.GA2397@ami.dom.local>
Date: Thu, 24 Jul 2008 00:26:32 +0200
From: Jarek Poplawski <jarkao2@...il.com>
To: denys@...p.net.lb
Cc: netdev@...r.kernel.org
Subject: Re: NMI lockup, 2.6.26 release
(take 2)
Hmm... this should be more accurate.
Jarek P.
---
net/sched/sch_htb.c | 28 +++++++++++++++++++++++-----
1 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c
index 3fb58f4..fdc84c3 100644
--- a/net/sched/sch_htb.c
+++ b/net/sched/sch_htb.c
@@ -169,7 +169,8 @@ struct htb_sched {
int rate2quantum; /* quant = rate / rate2quantum */
psched_time_t now; /* cached dequeue time */
- struct qdisc_watchdog watchdog;
+ //struct qdisc_watchdog watchdog;
+ struct timer_list timer; /* send delay timer */
/* non shaped skbs; let them go directly thru */
struct sk_buff_head direct_queue;
@@ -893,6 +894,14 @@ next:
return skb;
}
+static void htb_timer(unsigned long arg)
+{
+ struct Qdisc *sch = (struct Qdisc*)arg;
+ sch->flags &= ~TCQ_F_THROTTLED;
+ wmb();
+ netif_schedule(sch->dev);
+}
+
static struct sk_buff *htb_dequeue(struct Qdisc *sch)
{
struct sk_buff *skb = NULL;
@@ -943,7 +952,9 @@ static struct sk_buff *htb_dequeue(struct Qdisc *sch)
}
}
sch->qstats.overlimits++;
- qdisc_watchdog_schedule(&q->watchdog, next_event);
+ //qdisc_watchdog_schedule(&q->watchdog, next_event);
+ mod_timer(&q->timer, (unsigned long)next_event * HZ /
+ PSCHED_TICKS_PER_SEC);
fin:
return skb;
}
@@ -996,7 +1007,9 @@ static void htb_reset(struct Qdisc *sch)
}
}
- qdisc_watchdog_cancel(&q->watchdog);
+ //qdisc_watchdog_cancel(&q->watchdog);
+ sch->flags &= ~TCQ_F_THROTTLED;
+ del_timer(&q->timer);
__skb_queue_purge(&q->direct_queue);
sch->q.qlen = 0;
memset(q->row, 0, sizeof(q->row));
@@ -1047,7 +1060,11 @@ static int htb_init(struct Qdisc *sch, struct nlattr *opt)
for (i = 0; i < TC_HTB_NUMPRIO; i++)
INIT_LIST_HEAD(q->drops + i);
- qdisc_watchdog_init(&q->watchdog, sch);
+ //qdisc_watchdog_init(&q->watchdog, sch);
+ q->timer.function = htb_timer;
+ q->timer.data = (unsigned long)sch;
+ init_timer(&q->timer);
+
skb_queue_head_init(&q->direct_queue);
q->direct_qlen = sch->dev->tx_queue_len;
@@ -1262,7 +1279,8 @@ static void htb_destroy(struct Qdisc *sch)
{
struct htb_sched *q = qdisc_priv(sch);
- qdisc_watchdog_cancel(&q->watchdog);
+ //qdisc_watchdog_cancel(&q->watchdog);
+ del_timer_sync(&q->timer);
/* This line used to be after htb_destroy_class call below
and surprisingly it worked in 2.4. But it must precede it
because filter need its target class alive to be able to call
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists