Use conditional calls with lower d-cache hit in optimized version as a condition for scheduler profiling call. Signed-off-by: Mathieu Desnoyers --- kernel/profile.c | 4 ++++ kernel/sched.c | 32 +++++++++++++++++++------------- 2 files changed, 23 insertions(+), 13 deletions(-) Index: linux-2.6-lttng/kernel/profile.c =================================================================== --- linux-2.6-lttng.orig/kernel/profile.c 2007-05-29 11:33:11.000000000 -0400 +++ linux-2.6-lttng/kernel/profile.c 2007-05-29 11:37:46.000000000 -0400 @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -91,6 +92,8 @@ printk(KERN_INFO "kernel profiling enabled (shift: %ld)\n", prof_shift); } + if (prof_on) + BUG_ON(cond_call_arm("profile_on")); return 1; } __setup("profile=", profile_setup); @@ -555,6 +558,7 @@ return 0; out_cleanup: prof_on = 0; + cond_call_disarm("profile_on"); smp_mb(); on_each_cpu(profile_nop, NULL, 0, 1); for_each_online_cpu(cpu) { Index: linux-2.6-lttng/kernel/sched.c =================================================================== --- linux-2.6-lttng.orig/kernel/sched.c 2007-05-29 11:38:06.000000000 -0400 +++ linux-2.6-lttng/kernel/sched.c 2007-05-29 11:42:36.000000000 -0400 @@ -54,6 +54,7 @@ #include #include #include +#include #include #include @@ -972,6 +973,21 @@ } /* + * Sleep time is in units of nanosecs, so shift by 20 to get a + * milliseconds-range estimation of the amount of time that the task + * spent sleeping: + */ +static inline void activate_task_prof(struct task_struct *p, + unsigned long long now) +{ + if (unlikely(prof_on == SLEEP_PROFILING)) { + if (p->state == TASK_UNINTERRUPTIBLE) + profile_hits(SLEEP_PROFILING, (void *)get_wchan(p), + (now - p->timestamp) >> 20); + } +} + +/* * activate_task - move a task to the runqueue and do priority recalculation * * Update all the scheduling statistics stuff. (sleep average @@ -993,18 +1009,7 @@ + rq->most_recent_timestamp; } #endif - - /* - * Sleep time is in units of nanosecs, so shift by 20 to get a - * milliseconds-range estimation of the amount of time that the task - * spent sleeping: - */ - if (unlikely(prof_on == SLEEP_PROFILING)) { - if (p->state == TASK_UNINTERRUPTIBLE) - profile_hits(SLEEP_PROFILING, (void *)get_wchan(p), - (now - p->timestamp) >> 20); - } - + cond_call(profile_on, activate_task_prof(p, now)); p->prio = recalc_task_prio(p, now); /* @@ -3534,7 +3539,8 @@ print_irqtrace_events(current); dump_stack(); } - profile_hit(SCHED_PROFILING, __builtin_return_address(0)); + cond_call(profile_on, + profile_hit(SCHED_PROFILING, __builtin_return_address(0))); need_resched: preempt_disable(); -- Mathieu Desnoyers Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68 - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/