From patchwork Tue Dec 9 10:21:18 2008 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jarek Poplawski X-Patchwork-Id: 12908 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by ozlabs.org (Postfix) with ESMTP id 5BFA4DDF1E for ; Tue, 9 Dec 2008 21:21:29 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752661AbYLIKVZ (ORCPT ); Tue, 9 Dec 2008 05:21:25 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752658AbYLIKVY (ORCPT ); Tue, 9 Dec 2008 05:21:24 -0500 Received: from ug-out-1314.google.com ([66.249.92.170]:44025 "EHLO ug-out-1314.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752656AbYLIKVX (ORCPT ); Tue, 9 Dec 2008 05:21:23 -0500 Received: by ug-out-1314.google.com with SMTP id 39so1033647ugf.37 for ; Tue, 09 Dec 2008 02:21:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:date:from:to:cc:subject :message-id:mime-version:content-type:content-disposition:x-mutt-fcc :x-mutt-fcc:x-mutt-fcc:user-agent; bh=TC5r9Eg42WieA3RufLACYHNjcXWrFfOQ6X+Eiv/Qsyw=; b=anv+B5kbbafuENvCQo7HEl+KxiKJoPoe/Zyj5551ch5JYR780ZLCiQbfWZWh1QO6JL 98tQ6jFEyQG47Jem7yXMA5mddXsdhAMKNjaf8y/7eEk+PYLBEGf92lUBDZFcBxjbFyIz ovOWa9byxa90U5fKH1tsPZ3Jbe/yH/mUOe6kY= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=date:from:to:cc:subject:message-id:mime-version:content-type :content-disposition:x-mutt-fcc:user-agent; b=FIXICW8ioLIkgi8wTfi/tnr9Tmvnq1+9ejCkdYkHll4Nf9oW4xGiSjSffctyJpmNfA btbCRFBm3Tm6tfOzfvanvPD7V/cKzEnE3TJZjjg0Jc8Vli9vAzCdURm/suevj57Xmqkb mJXQQodaRnGULmMxs9IySDyN3VUdgbXNZMx+c= Received: by 10.66.252.18 with SMTP id z18mr3142400ugh.30.1228818082363; Tue, 09 Dec 2008 02:21:22 -0800 (PST) Received: from ff.dom.local (bv170.internetdsl.tpnet.pl [80.53.205.170]) by mx.google.com with ESMTPS id 34sm6735166ugh.10.2008.12.09.02.21.21 (version=SSLv3 cipher=RC4-MD5); Tue, 09 Dec 2008 02:21:22 -0800 (PST) Date: Tue, 9 Dec 2008 10:21:18 +0000 From: Jarek Poplawski To: David Miller Cc: Martin Devera , Patrick McHardy , netdev@vger.kernel.org Subject: [PATCH 2/6] pkt_sched: sch_htb: Consider used jiffies in htb_dequeue() Message-ID: <20081209102118.GB14862@ff.dom.local> MIME-Version: 1.0 Content-Disposition: inline X-Mutt-Fcc: =outbox X-Mutt-Fcc: =outbox X-Mutt-Fcc: =outbox User-Agent: Mutt/1.5.18 (2008-05-17) Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Next event time should consider jiffies used for recounting. Otherwise qdisc_watchdog_schedule() triggers hrtimer immediately with the event in the past, and may cause very high ksoftirqd cpu usage (if highres is on). This patch charges jiffies globally, so we can skip this in htb_do_events(). Signed-off-by: Jarek Poplawski --- net/sched/sch_htb.c | 14 ++++++++++++-- 1 files changed, 12 insertions(+), 2 deletions(-) diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index d6eb4a7..102866d 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c @@ -685,8 +685,11 @@ static psched_time_t htb_do_events(struct htb_sched *q, int level) if (cl->cmode != HTB_CAN_SEND) htb_add_to_wait_tree(q, cl, diff); } - /* too much load - let's continue on next jiffie (including above) */ - return q->now + 2 * PSCHED_TICKS_PER_SEC / HZ; + /* + * Too much load - let's continue on next jiffie. + * (Used jiffies are charged later.) + */ + return q->now + 1; } /* Returns class->node+prio from id-tree where classe's id is >= id. NULL @@ -845,6 +848,7 @@ static struct sk_buff *htb_dequeue(struct Qdisc *sch) struct htb_sched *q = qdisc_priv(sch); int level; psched_time_t next_event; + unsigned long start_at; /* try to dequeue direct packets as high prio (!) to minimize cpu work */ skb = __skb_dequeue(&q->direct_queue); @@ -857,6 +861,7 @@ static struct sk_buff *htb_dequeue(struct Qdisc *sch) if (!sch->q.qlen) goto fin; q->now = psched_get_time(); + start_at = jiffies; next_event = q->now + 5 * PSCHED_TICKS_PER_SEC; @@ -889,6 +894,11 @@ static struct sk_buff *htb_dequeue(struct Qdisc *sch) } } sch->qstats.overlimits++; + /* charge used jiffies */ + start_at = jiffies - start_at; + if (start_at > 0) + next_event += start_at * PSCHED_TICKS_PER_SEC / HZ; + qdisc_watchdog_schedule(&q->watchdog, next_event); fin: return skb;