All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Dumazet <dada1@cosmosbay.com>
To: unlisted-recipients:; (no To-header on input)
Cc: "Tero.Kristo@nokia.com" <Tero.Kristo@nokia.com>, netdev@vger.kernel.org
Subject: [PATCH] net: use a deferred timer in rt_check_expire
Date: Tue, 19 May 2009 20:56:35 +0200	[thread overview]
Message-ID: <4A1300E3.1000809@cosmosbay.com> (raw)
In-Reply-To: <1F18D6510CF0474A8C9500565A7E41A20544D9255A@NOK-EUMSG-02.mgdnok.nokia.com>

Tero.Kristo@nokia.com a écrit :
>  
> 
>> -----Original Message-----
>> From: ext Eric Dumazet [mailto:dada1@cosmosbay.com] 
>> Sent: 19 May, 2009 12:04
>> To: Kristo Tero (Nokia-D/Tampere)
>> Cc: netdev@vger.kernel.org
>> Subject: Re: Network stack timer hacks for power saving
>>
>> Tero.Kristo@nokia.com a écrit :
>>> Hi,
>>>
>>> I have been looking at network stack timer optimization for power 
>>> saving in embedded ARM environment, basically trying to 
>> avoid as many 
>>> wakeups as possible. I have changed several timers in the network 
>>> stack into deferred ones, i.e. they do not wake up the 
>> device from low 
>>> power modes but instead they are deferred until next wakeup 
>>from some 
>>> other source, like another (non-deferred) timer or some I/O. 
>> Attached 
>>> a patch about the changes I've done, is something like this safe to 
>>> do?
>>>
>>> -Tero


Here is the patch I cooked and tested on a machine where ip_rt_gc_interval 
is set to minimal value (1 second), where equilibrium depends on garbage collection
done in time.

I found that delayed timers could be *really* delayed so I think we must take
into account the elapsed time (in jiffies) between two rt_check_expire()
calls, to "guarantee" a full scan of rt cache in a ip_rt_gc_timeout period.


Not for inclusion, as undergoing work is happening in this function
for a bug correction. I'll redo the patch later once stabilized.

[PATCH] net: use a deferred timer in rt_check_expire

For the sake of power saver lovers, use a deferrable timer to fire rt_check_expire()

As some big routers cache equilibrium depends on garbage collection done in time,
we take into account elapsed time between two rt_check_expire() invocations 
to adjust the amount of slots we have to check.

Based on an initial idea and patch from Tero Kristo

Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
Signed-off-by: Tero Kristo <tero.kristo@nokia.com>
---
 net/ipv4/route.c |   11 ++++++++---
 1 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index c4c60e9..b2c6793 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -131,8 +131,8 @@ static int ip_rt_min_advmss __read_mostly	= 256;
 static int ip_rt_secret_interval __read_mostly	= 10 * 60 * HZ;
 static int rt_chain_length_max __read_mostly	= 20;
 
-static void rt_worker_func(struct work_struct *work);
-static DECLARE_DELAYED_WORK(expires_work, rt_worker_func);
+static struct delayed_work expires_work;
+static unsigned long expires_ljiffies;
 
 /*
  *	Interface to generic destination cache.
@@ -787,9 +787,12 @@ static void rt_check_expire(void)
 	struct rtable *rth, **rthp;
 	unsigned long length = 0, samples = 0;
 	unsigned long sum = 0, sum2 = 0;
+	unsigned long delta;
 	u64 mult;
 
-	mult = ((u64)ip_rt_gc_interval) << rt_hash_log;
+	delta = jiffies - expires_ljiffies;
+	expires_ljiffies = jiffies;
+	mult = ((u64)delta) << rt_hash_log;
 	if (ip_rt_gc_timeout > 1)
 		do_div(mult, ip_rt_gc_timeout);
 	goal = (unsigned int)mult;
@@ -3410,6 +3413,8 @@ int __init ip_rt_init(void)
 	/* All the timers, started at system startup tend
 	   to synchronize. Perturb it a bit.
 	 */
+	INIT_DELAYED_WORK_DEFERRABLE(&expires_work, rt_worker_func);
+	expires_ljiffies = jiffies;
 	schedule_delayed_work(&expires_work,
 		net_random() % ip_rt_gc_interval + ip_rt_gc_interval);
 


  reply	other threads:[~2009-05-19 18:56 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-19  8:13 Network stack timer hacks for power saving Tero.Kristo
2009-05-19  9:04 ` Eric Dumazet
2009-05-19  9:46   ` Tero.Kristo
2009-05-19 18:56     ` Eric Dumazet [this message]
  -- strict thread matches above, loose matches on Subject: below --
2009-06-12  6:10 [PATCH] net: use a deferred timer in rt_check_expire Eric Dumazet
2009-06-14  6:38 ` David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4A1300E3.1000809@cosmosbay.com \
    --to=dada1@cosmosbay.com \
    --cc=Tero.Kristo@nokia.com \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.