[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20080723210940.GB14788@ami.dom.local>
Date: Wed, 23 Jul 2008 23:09:40 +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
On Wed, Jul 23, 2008 at 10:47:17PM +0300, denys@...p.net.lb wrote:
> Seems none of patches help with issue.
> I will recheck if i apply them correctly.
It's a pity! On the other hand it looks like you have something really
special...
But, since all these reports stop at hrtimers, my proposal is to check
where it could hit without them. I attach a patch for debugging, which
turns back a timer instead of hrtimer watchdog. Alas I didn't test it,
so be cautious. (This should work with 2.6.26 or .25, I hope.)
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 /
+ PSCHED_TICKS_PER_SEC * HZ);
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