diff options
| author | Ingo Molnar <mingo@elte.hu> | 2010-05-10 02:20:19 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2010-05-10 02:20:19 -0400 |
| commit | 1f0ac7183f4d270bd9ce511254ba5d931d4f29c9 (patch) | |
| tree | 124b2682a249b0393f29e929537aa76ab299bb5f | |
| parent | 232a5c948da5e23dff27e48180abf4a4238f7602 (diff) | |
| parent | 76ba7e846fcc89d9d4b25b89e303c9058de96d60 (diff) | |
Merge branch 'perf/test' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing into perf/core
| -rw-r--r-- | include/trace/events/lock.h | 55 | ||||
| -rw-r--r-- | kernel/lockdep.c | 4 | ||||
| -rw-r--r-- | tools/perf/builtin-lock.c | 145 | ||||
| -rw-r--r-- | tools/perf/builtin-record.c | 34 | ||||
| -rw-r--r-- | tools/perf/util/event.h | 3 | ||||
| -rw-r--r-- | tools/perf/util/session.c | 125 | ||||
| -rw-r--r-- | tools/perf/util/session.h | 36 |
7 files changed, 257 insertions, 145 deletions
diff --git a/include/trace/events/lock.h b/include/trace/events/lock.h index 5c1dcfc16c60..2821b86de63b 100644 --- a/include/trace/events/lock.h +++ b/include/trace/events/lock.h | |||
| @@ -35,15 +35,15 @@ TRACE_EVENT(lock_acquire, | |||
| 35 | __get_str(name)) | 35 | __get_str(name)) |
| 36 | ); | 36 | ); |
| 37 | 37 | ||
| 38 | TRACE_EVENT(lock_release, | 38 | DECLARE_EVENT_CLASS(lock, |
| 39 | 39 | ||
| 40 | TP_PROTO(struct lockdep_map *lock, int nested, unsigned long ip), | 40 | TP_PROTO(struct lockdep_map *lock, unsigned long ip), |
| 41 | 41 | ||
| 42 | TP_ARGS(lock, nested, ip), | 42 | TP_ARGS(lock, ip), |
| 43 | 43 | ||
| 44 | TP_STRUCT__entry( | 44 | TP_STRUCT__entry( |
| 45 | __string(name, lock->name) | 45 | __string( name, lock->name ) |
| 46 | __field(void *, lockdep_addr) | 46 | __field( void *, lockdep_addr ) |
| 47 | ), | 47 | ), |
| 48 | 48 | ||
| 49 | TP_fast_assign( | 49 | TP_fast_assign( |
| @@ -51,51 +51,30 @@ TRACE_EVENT(lock_release, | |||
| 51 | __entry->lockdep_addr = lock; | 51 | __entry->lockdep_addr = lock; |
| 52 | ), | 52 | ), |
| 53 | 53 | ||
| 54 | TP_printk("%p %s", | 54 | TP_printk("%p %s", __entry->lockdep_addr, __get_str(name)) |
| 55 | __entry->lockdep_addr, __get_str(name)) | ||
| 56 | ); | 55 | ); |
| 57 | 56 | ||
| 58 | #ifdef CONFIG_LOCK_STAT | 57 | DEFINE_EVENT(lock, lock_release, |
| 59 | |||
| 60 | TRACE_EVENT(lock_contended, | ||
| 61 | 58 | ||
| 62 | TP_PROTO(struct lockdep_map *lock, unsigned long ip), | 59 | TP_PROTO(struct lockdep_map *lock, unsigned long ip), |
| 63 | 60 | ||
| 64 | TP_ARGS(lock, ip), | 61 | TP_ARGS(lock, ip) |
| 62 | ); | ||
| 65 | 63 | ||
| 66 | TP_STRUCT__entry( | 64 | #ifdef CONFIG_LOCK_STAT |
| 67 | __string(name, lock->name) | ||
| 68 | __field(void *, lockdep_addr) | ||
| 69 | ), | ||
| 70 | 65 | ||
| 71 | TP_fast_assign( | 66 | DEFINE_EVENT(lock, lock_contended, |
| 72 | __assign_str(name, lock->name); | ||
| 73 | __entry->lockdep_addr = lock; | ||
| 74 | ), | ||
| 75 | 67 | ||
| 76 | TP_printk("%p %s", | 68 | TP_PROTO(struct lockdep_map *lock, unsigned long ip), |
| 77 | __entry->lockdep_addr, __get_str(name)) | ||
| 78 | ); | ||
| 79 | 69 | ||
| 80 | TRACE_EVENT(lock_acquired, | 70 | TP_ARGS(lock, ip) |
| 81 | TP_PROTO(struct lockdep_map *lock, unsigned long ip, s64 waittime), | 71 | ); |
| 82 | 72 | ||
| 83 | TP_ARGS(lock, ip, waittime), | 73 | DEFINE_EVENT(lock, lock_acquired, |
| 84 | 74 | ||
| 85 | TP_STRUCT__entry( | 75 | TP_PROTO(struct lockdep_map *lock, unsigned long ip), |
| 86 | __string(name, lock->name) | ||
| 87 | __field(s64, wait_nsec) | ||
| 88 | __field(void *, lockdep_addr) | ||
| 89 | ), | ||
| 90 | 76 | ||
| 91 | TP_fast_assign( | 77 | TP_ARGS(lock, ip) |
| 92 | __assign_str(name, lock->name); | ||
| 93 | __entry->wait_nsec = waittime; | ||
| 94 | __entry->lockdep_addr = lock; | ||
| 95 | ), | ||
| 96 | TP_printk("%p %s (%llu ns)", __entry->lockdep_addr, | ||
| 97 | __get_str(name), | ||
| 98 | __entry->wait_nsec) | ||
| 99 | ); | 78 | ); |
| 100 | 79 | ||
| 101 | #endif | 80 | #endif |
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index 2594e1ce41cb..e9c759f06c1d 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c | |||
| @@ -3227,7 +3227,7 @@ void lock_release(struct lockdep_map *lock, int nested, | |||
| 3227 | raw_local_irq_save(flags); | 3227 | raw_local_irq_save(flags); |
| 3228 | check_flags(flags); | 3228 | check_flags(flags); |
| 3229 | current->lockdep_recursion = 1; | 3229 | current->lockdep_recursion = 1; |
| 3230 | trace_lock_release(lock, nested, ip); | 3230 | trace_lock_release(lock, ip); |
| 3231 | __lock_release(lock, nested, ip); | 3231 | __lock_release(lock, nested, ip); |
| 3232 | current->lockdep_recursion = 0; | 3232 | current->lockdep_recursion = 0; |
| 3233 | raw_local_irq_restore(flags); | 3233 | raw_local_irq_restore(flags); |
| @@ -3380,7 +3380,7 @@ found_it: | |||
| 3380 | hlock->holdtime_stamp = now; | 3380 | hlock->holdtime_stamp = now; |
| 3381 | } | 3381 | } |
| 3382 | 3382 | ||
| 3383 | trace_lock_acquired(lock, ip, waittime); | 3383 | trace_lock_acquired(lock, ip); |
| 3384 | 3384 | ||
| 3385 | stats = get_lock_stats(hlock_class(hlock)); | 3385 | stats = get_lock_stats(hlock_class(hlock)); |
| 3386 | if (waittime) { | 3386 | if (waittime) { |
diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c index 6605000ed73d..e18dfdc2948a 100644 --- a/tools/perf/builtin-lock.c +++ b/tools/perf/builtin-lock.c | |||
| @@ -387,7 +387,20 @@ static struct lock_seq_stat *get_seq(struct thread_stat *ts, void *addr) | |||
| 387 | return seq; | 387 | return seq; |
| 388 | } | 388 | } |
| 389 | 389 | ||
| 390 | static int bad_hist[4]; | 390 | enum broken_state { |
| 391 | BROKEN_ACQUIRE, | ||
| 392 | BROKEN_ACQUIRED, | ||
| 393 | BROKEN_CONTENDED, | ||
| 394 | BROKEN_RELEASE, | ||
| 395 | BROKEN_MAX, | ||
| 396 | }; | ||
| 397 | |||
| 398 | static int bad_hist[BROKEN_MAX]; | ||
| 399 | |||
| 400 | enum acquire_flags { | ||
| 401 | TRY_LOCK = 1, | ||
| 402 | READ_LOCK = 2, | ||
| 403 | }; | ||
| 391 | 404 | ||
| 392 | static void | 405 | static void |
| 393 | report_lock_acquire_event(struct trace_acquire_event *acquire_event, | 406 | report_lock_acquire_event(struct trace_acquire_event *acquire_event, |
| @@ -413,9 +426,9 @@ report_lock_acquire_event(struct trace_acquire_event *acquire_event, | |||
| 413 | if (!acquire_event->flag) { | 426 | if (!acquire_event->flag) { |
| 414 | seq->state = SEQ_STATE_ACQUIRING; | 427 | seq->state = SEQ_STATE_ACQUIRING; |
| 415 | } else { | 428 | } else { |
| 416 | if (acquire_event->flag & 1) | 429 | if (acquire_event->flag & TRY_LOCK) |
| 417 | ls->nr_trylock++; | 430 | ls->nr_trylock++; |
| 418 | if (acquire_event->flag & 2) | 431 | if (acquire_event->flag & READ_LOCK) |
| 419 | ls->nr_readlock++; | 432 | ls->nr_readlock++; |
| 420 | seq->state = SEQ_STATE_READ_ACQUIRED; | 433 | seq->state = SEQ_STATE_READ_ACQUIRED; |
| 421 | seq->read_count = 1; | 434 | seq->read_count = 1; |
| @@ -423,7 +436,7 @@ report_lock_acquire_event(struct trace_acquire_event *acquire_event, | |||
| 423 | } | 436 | } |
| 424 | break; | 437 | break; |
| 425 | case SEQ_STATE_READ_ACQUIRED: | 438 | case SEQ_STATE_READ_ACQUIRED: |
| 426 | if (acquire_event->flag & 2) { | 439 | if (acquire_event->flag & READ_LOCK) { |
| 427 | seq->read_count++; | 440 | seq->read_count++; |
| 428 | ls->nr_acquired++; | 441 | ls->nr_acquired++; |
| 429 | goto end; | 442 | goto end; |
| @@ -437,7 +450,7 @@ report_lock_acquire_event(struct trace_acquire_event *acquire_event, | |||
| 437 | broken: | 450 | broken: |
| 438 | /* broken lock sequence, discard it */ | 451 | /* broken lock sequence, discard it */ |
| 439 | ls->discard = 1; | 452 | ls->discard = 1; |
| 440 | bad_hist[0]++; | 453 | bad_hist[BROKEN_ACQUIRE]++; |
| 441 | list_del(&seq->list); | 454 | list_del(&seq->list); |
| 442 | free(seq); | 455 | free(seq); |
| 443 | goto end; | 456 | goto end; |
| @@ -481,10 +494,9 @@ report_lock_acquired_event(struct trace_acquired_event *acquired_event, | |||
| 481 | case SEQ_STATE_CONTENDED: | 494 | case SEQ_STATE_CONTENDED: |
| 482 | contended_term = timestamp - seq->prev_event_time; | 495 | contended_term = timestamp - seq->prev_event_time; |
| 483 | ls->wait_time_total += contended_term; | ||
