ring-buffer: only periodically call cond_resched to ring-buffer-benchmark
authorSteven Rostedt <srostedt@redhat.com>
Thu, 7 May 2009 18:20:28 +0000 (14:20 -0400)
committerSteven Rostedt <rostedt@goodmis.org>
Thu, 7 May 2009 18:20:28 +0000 (14:20 -0400)
Calling cond_resched at every iteration of the loop adds a bit of
overhead to the benchmark.

This patch does two things.

1) only calls cond-resched when CONFIG_PREEMPT is not enabled
2) only calls cond-resched after so many traces has been performed.

[ Impact: less overhead to the ring-buffer-benchmark ]

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
kernel/trace/ring_buffer_benchmark.c

index f4ceb45..a7c048b 100644 (file)
@@ -218,16 +218,23 @@ static void ring_buffer_producer(void)
                }
                do_gettimeofday(&end_tv);
 
-               if (consumer && !(++cnt % wakeup_interval))
+               cnt++;
+               if (consumer && !(cnt % wakeup_interval))
                        wake_up_process(consumer);
 
+#ifndef CONFIG_PREEMPT
                /*
                 * 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.
+                *
+                * Do a cond resched at the same frequency we would wake up
+                * the reader.
                 */
-               cond_resched();
+               if (cnt % wakeup_interval)
+                       cond_resched();
+#endif
 
        } while (end_tv.tv_sec < (start_tv.tv_sec + RUN_TIME) && !kill_test);
        pr_info("End ring buffer hammer\n");