From b28e5c7f3943dc43035a9dd9bebf4dc567456f49 Mon Sep 17 00:00:00 2001 From: Steven Rostedt Date: Wed, 6 May 2009 18:36:59 -0400 Subject: [PATCH] --- yaml --- r: 146103 b: refs/heads/master c: 3e07a4f680adc66dfa175aa5021aedf340251b12 h: refs/heads/master i: 146101: 392cbef363aa1aec7f587bc8dc224be284017c72 146099: 44e7519451914b37175622b2bbfed723ad47511d 146095: 02f20885cbbaa96f55d5829a1de11ebaa388264a v: v3 --- [refs] | 2 +- trunk/kernel/trace/ring_buffer_benchmark.c | 31 ++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 976deddf317f..6712590f197b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6634ff26cce2da04e5c2a5481bcb8888e7d01786 +refs/heads/master: 3e07a4f680adc66dfa175aa5021aedf340251b12 diff --git a/trunk/kernel/trace/ring_buffer_benchmark.c b/trunk/kernel/trace/ring_buffer_benchmark.c index dcd75e9e49f4..a26fc67b63bb 100644 --- a/trunk/kernel/trace/ring_buffer_benchmark.c +++ b/trunk/kernel/trace/ring_buffer_benchmark.c @@ -185,6 +185,35 @@ static void ring_buffer_consumer(void) complete(&read_done); } +/* + * If we are a non preempt kernel, the 10 second run will + * stop everything while it runs. Instead, we will call cond_resched + * and also add any time that was lost by a rescedule. + */ +#ifdef CONFIG_PREEMPT +static void sched_if_needed(struct timeval *start_tv, struct timeval *end_tv) +{ +} +#else +static void sched_if_needed(struct timeval *start_tv, struct timeval *end_tv) +{ + struct timeval tv; + + cond_resched(); + do_gettimeofday(&tv); + if (tv.tv_usec < end_tv->tv_usec) { + tv.tv_usec += 1000000; + tv.tv_sec--; + } + start_tv->tv_sec += tv.tv_sec - end_tv->tv_sec; + start_tv->tv_usec += tv.tv_usec - end_tv->tv_usec; + if (start_tv->tv_usec > 1000000) { + start_tv->tv_usec -= 1000000; + start_tv->tv_sec++; + } +} +#endif + static void ring_buffer_producer(void) { struct timeval start_tv; @@ -221,6 +250,8 @@ static void ring_buffer_producer(void) if (consumer && !(++cnt % wakeup_interval)) wake_up_process(consumer); + sched_if_needed(&start_tv, &end_tv); + } while (end_tv.tv_sec < (start_tv.tv_sec + RUN_TIME) && !kill_test); pr_info("End ring buffer hammer\n");