Commit 125bb8f5637bd653244728f734bcac218986d910

Authored by Eric Dumazet
Committed by David S. Miller
1 parent 13be8a1268

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 <eric.dumazet@gmail.com>
Signed-off-by: Tero Kristo <tero.kristo@nokia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 1 changed file with 8 additions and 3 deletions Side-by-side Diff

... ... @@ -131,8 +131,8 @@
131 131 static int ip_rt_secret_interval __read_mostly = 10 * 60 * HZ;
132 132 static int rt_chain_length_max __read_mostly = 20;
133 133  
134   -static void rt_worker_func(struct work_struct *work);
135   -static DECLARE_DELAYED_WORK(expires_work, rt_worker_func);
  134 +static struct delayed_work expires_work;
  135 +static unsigned long expires_ljiffies;
136 136  
137 137 /*
138 138 * Interface to generic destination cache.
139 139  
... ... @@ -787,9 +787,12 @@
787 787 struct rtable *rth, *aux, **rthp;
788 788 unsigned long samples = 0;
789 789 unsigned long sum = 0, sum2 = 0;
  790 + unsigned long delta;
790 791 u64 mult;
791 792  
792   - mult = ((u64)ip_rt_gc_interval) << rt_hash_log;
  793 + delta = jiffies - expires_ljiffies;
  794 + expires_ljiffies = jiffies;
  795 + mult = ((u64)delta) << rt_hash_log;
793 796 if (ip_rt_gc_timeout > 1)
794 797 do_div(mult, ip_rt_gc_timeout);
795 798 goal = (unsigned int)mult;
... ... @@ -3397,6 +3400,8 @@
3397 3400 /* All the timers, started at system startup tend
3398 3401 to synchronize. Perturb it a bit.
3399 3402 */
  3403 + INIT_DELAYED_WORK_DEFERRABLE(&expires_work, rt_worker_func);
  3404 + expires_ljiffies = jiffies;
3400 3405 schedule_delayed_work(&expires_work,
3401 3406 net_random() % ip_rt_gc_interval + ip_rt_gc_interval);
3402 3407