It seems that run_hrtimer_queue() is calling get_time() much more often
than it needs to.
With this patch, it only calls get_time() if there's a pending timer.
Following is from a profile done without the patch:
kernel ticks: 30841 1.02 %
13572 44.01 44.01 time_interpolator_get_offset
155 0.50 96.91 hrtimer_run_queues
And with the patch:
kernel ticks: 18334 0.58 %
74 0.40 97.81 hrtimer_run_queues
43 0.23 98.63 time_interpolator_get_offset
Signed-off-by: Dimitri Sivanich <[email protected]>
Index: linux-2.6.15/kernel/hrtimer.c
===================================================================
--- linux-2.6.15.orig/kernel/hrtimer.c 2006-03-23 14:37:49.032686221 -0600
+++ linux-2.6.15/kernel/hrtimer.c 2006-03-23 14:39:10.655542086 -0600
@@ -586,12 +586,17 @@ int hrtimer_get_res(const clockid_t whic
*/
static inline void run_hrtimer_queue(struct hrtimer_base *base)
{
- ktime_t now = base->get_time();
- struct rb_node *node;
+ ktime_t now;
+ struct rb_node *node = base->first;
+
+ if (!node)
+ return;
+
+ now = base->get_time();
spin_lock_irq(&base->lock);
- while ((node = base->first)) {
+ while (node) {
struct hrtimer *timer;
int (*fn)(void *);
int restart;
@@ -620,6 +625,7 @@ static inline void run_hrtimer_queue(str
spin_lock_irq(&base->lock);
+ node = base->first;
/* Another CPU has added back the timer */
if (timer->state != HRTIMER_RUNNING)
continue;
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]