diff options
Diffstat (limited to 'kernel/trace/ring_buffer_benchmark.c')
-rw-r--r-- | kernel/trace/ring_buffer_benchmark.c | 85 |
1 files changed, 76 insertions, 9 deletions
diff --git a/kernel/trace/ring_buffer_benchmark.c b/kernel/trace/ring_buffer_benchmark.c index 573d3cc762c3..b2477caf09c2 100644 --- a/kernel/trace/ring_buffer_benchmark.c +++ b/kernel/trace/ring_buffer_benchmark.c | |||
@@ -35,6 +35,28 @@ static int disable_reader; | |||
35 | module_param(disable_reader, uint, 0644); | 35 | module_param(disable_reader, uint, 0644); |
36 | MODULE_PARM_DESC(disable_reader, "only run producer"); | 36 | MODULE_PARM_DESC(disable_reader, "only run producer"); |
37 | 37 | ||
38 | static int write_iteration = 50; | ||
39 | module_param(write_iteration, uint, 0644); | ||
40 | MODULE_PARM_DESC(write_iteration, "# of writes between timestamp readings"); | ||
41 | |||
42 | static int producer_nice = 19; | ||
43 | static int consumer_nice = 19; | ||
44 | |||
45 | static int producer_fifo = -1; | ||
46 | static int consumer_fifo = -1; | ||
47 | |||
48 | module_param(producer_nice, uint, 0644); | ||
49 | MODULE_PARM_DESC(producer_nice, "nice prio for producer"); | ||
50 | |||
51 | module_param(consumer_nice, uint, 0644); | ||
52 | MODULE_PARM_DESC(consumer_nice, "nice prio for consumer"); | ||
53 | |||
54 | module_param(producer_fifo, uint, 0644); | ||
55 | MODULE_PARM_DESC(producer_fifo, "fifo prio for producer"); | ||
56 | |||
57 | module_param(consumer_fifo, uint, 0644); | ||
58 | MODULE_PARM_DESC(consumer_fifo, "fifo prio for consumer"); | ||
59 | |||
38 | static int read_events; | 60 | static int read_events; |
39 | 61 | ||
40 | static int kill_test; | 62 | static int kill_test; |
@@ -208,15 +230,18 @@ static void ring_buffer_producer(void) | |||
208 | do { | 230 | do { |
209 | struct ring_buffer_event *event; | 231 | struct ring_buffer_event *event; |
210 | int *entry; | 232 | int *entry; |
211 | 233 | int i; | |
212 | event = ring_buffer_lock_reserve(buffer, 10); | 234 | |
213 | if (!event) { | 235 | for (i = 0; i < write_iteration; i++) { |
214 | missed++; | 236 | event = ring_buffer_lock_reserve(buffer, 10); |
215 | } else { | 237 | if (!event) { |
216 | hit++; | 238 | missed++; |
217 | entry = ring_buffer_event_data(event); | 239 | } else { |
218 | *entry = smp_processor_id(); | 240 | hit++; |
219 | ring_buffer_unlock_commit(buffer, event); | 241 | entry = ring_buffer_event_data(event); |
242 | *entry = smp_processor_id(); | ||
243 | ring_buffer_unlock_commit(buffer, event); | ||
244 | } | ||
220 | } | 245 | } |
221 | do_gettimeofday(&end_tv); | 246 | do_gettimeofday(&end_tv); |
222 | 247 | ||
@@ -263,6 +288,27 @@ static void ring_buffer_producer(void) | |||
263 | 288 | ||
264 | if (kill_test) | 289 | if (kill_test) |
265 | trace_printk("ERROR!\n"); | 290 | trace_printk("ERROR!\n"); |
291 | |||
292 | if (!disable_reader) { | ||
293 | if (consumer_fifo < 0) | ||
294 | trace_printk("Running Consumer at nice: %d\n", | ||
295 | consumer_nice); | ||
296 | else | ||
297 | trace_printk("Running Consumer at SCHED_FIFO %d\n", | ||
298 | consumer_fifo); | ||
299 | } | ||
300 | if (producer_fifo < 0) | ||
301 | trace_printk("Running Producer at nice: %d\n", | ||
302 | producer_nice); | ||
303 | else | ||
304 | trace_printk("Running Producer at SCHED_FIFO %d\n", | ||
305 | producer_fifo); | ||
306 | |||
307 | /* Let the user know that the test is running at low priority */ | ||
308 | if (producer_fifo < 0 && consumer_fifo < 0 && | ||
309 | producer_nice == 19 && consumer_nice == 19) | ||
310 | trace_printk("WARNING!!! This test is running at lowest priority.\n"); | ||
311 | |||
266 | trace_printk("Time: %lld (usecs)\n", time); | 312 | trace_printk("Time: %lld (usecs)\n", time); |
267 | trace_printk("Overruns: %lld\n", overruns); | 313 | trace_printk("Overruns: %lld\n", overruns); |
268 | if (disable_reader) | 314 | if (disable_reader) |
@@ -392,6 +438,27 @@ static int __init ring_buffer_benchmark_init(void) | |||
392 | if (IS_ERR(producer)) | 438 | if (IS_ERR(producer)) |
393 | goto out_kill; | 439 | goto out_kill; |
394 | 440 | ||
441 | /* | ||
442 | * Run them as low-prio background tasks by default: | ||
443 | */ | ||
444 | if (!disable_reader) { | ||
445 | if (consumer_fifo >= 0) { | ||
446 | struct sched_param param = { | ||
447 | .sched_priority = consumer_fifo | ||
448 | }; | ||
449 | sched_setscheduler(consumer, SCHED_FIFO, ¶m); | ||
450 | } else | ||
451 | set_user_nice(consumer, consumer_nice); | ||
452 | } | ||
453 | |||
454 | if (producer_fifo >= 0) { | ||
455 | struct sched_param param = { | ||
456 | .sched_priority = consumer_fifo | ||
457 | }; | ||
458 | sched_setscheduler(producer, SCHED_FIFO, ¶m); | ||
459 | } else | ||
460 | set_user_nice(producer, producer_nice); | ||
461 | |||
395 | return 0; | 462 | return 0; |
396 | 463 | ||
397 | out_kill: | 464 | out_kill: |