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: |
