diff options
Diffstat (limited to 'tools/perf/builtin-kvm.c')
-rw-r--r-- | tools/perf/builtin-kvm.c | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 283b4397e397..ca3f80ebc100 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c | |||
@@ -314,9 +314,9 @@ struct vcpu_event_record { | |||
314 | 314 | ||
315 | static void init_kvm_event_record(struct perf_kvm_stat *kvm) | 315 | static void init_kvm_event_record(struct perf_kvm_stat *kvm) |
316 | { | 316 | { |
317 | int i; | 317 | unsigned int i; |
318 | 318 | ||
319 | for (i = 0; i < (int)EVENTS_CACHE_SIZE; i++) | 319 | for (i = 0; i < EVENTS_CACHE_SIZE; i++) |
320 | INIT_LIST_HEAD(&kvm->kvm_events_cache[i]); | 320 | INIT_LIST_HEAD(&kvm->kvm_events_cache[i]); |
321 | } | 321 | } |
322 | 322 | ||
@@ -370,9 +370,10 @@ static struct kvm_event *find_create_kvm_event(struct perf_kvm_stat *kvm, | |||
370 | BUG_ON(key->key == INVALID_KEY); | 370 | BUG_ON(key->key == INVALID_KEY); |
371 | 371 | ||
372 | head = &kvm->kvm_events_cache[kvm_events_hash_fn(key->key)]; | 372 | head = &kvm->kvm_events_cache[kvm_events_hash_fn(key->key)]; |
373 | list_for_each_entry(event, head, hash_entry) | 373 | list_for_each_entry(event, head, hash_entry) { |
374 | if (event->key.key == key->key && event->key.info == key->info) | 374 | if (event->key.key == key->key && event->key.info == key->info) |
375 | return event; | 375 | return event; |
376 | } | ||
376 | 377 | ||
377 | event = kvm_alloc_init_event(key); | 378 | event = kvm_alloc_init_event(key); |
378 | if (!event) | 379 | if (!event) |
@@ -417,7 +418,10 @@ static double kvm_event_rel_stddev(int vcpu_id, struct kvm_event *event) | |||
417 | static bool update_kvm_event(struct kvm_event *event, int vcpu_id, | 418 | static bool update_kvm_event(struct kvm_event *event, int vcpu_id, |
418 | u64 time_diff) | 419 | u64 time_diff) |
419 | { | 420 | { |
420 | kvm_update_event_stats(&event->total, time_diff); | 421 | if (vcpu_id == -1) { |
422 | kvm_update_event_stats(&event->total, time_diff); | ||
423 | return true; | ||
424 | } | ||
421 | 425 | ||
422 | if (!kvm_event_expand(event, vcpu_id)) | 426 | if (!kvm_event_expand(event, vcpu_id)) |
423 | return false; | 427 | return false; |
@@ -433,6 +437,12 @@ static bool handle_end_event(struct perf_kvm_stat *kvm, | |||
433 | { | 437 | { |
434 | struct kvm_event *event; | 438 | struct kvm_event *event; |
435 | u64 time_begin, time_diff; | 439 | u64 time_begin, time_diff; |
440 | int vcpu; | ||
441 | |||
442 | if (kvm->trace_vcpu == -1) | ||
443 | vcpu = -1; | ||
444 | else | ||
445 | vcpu = vcpu_record->vcpu_id; | ||
436 | 446 | ||
437 | event = vcpu_record->last_event; | 447 | event = vcpu_record->last_event; |
438 | time_begin = vcpu_record->start_time; | 448 | time_begin = vcpu_record->start_time; |
@@ -462,7 +472,7 @@ static bool handle_end_event(struct perf_kvm_stat *kvm, | |||
462 | BUG_ON(timestamp < time_begin); | 472 | BUG_ON(timestamp < time_begin); |
463 | 473 | ||
464 | time_diff = timestamp - time_begin; | 474 | time_diff = timestamp - time_begin; |
465 | return update_kvm_event(event, vcpu_record->vcpu_id, time_diff); | 475 | return update_kvm_event(event, vcpu, time_diff); |
466 | } | 476 | } |
467 | 477 | ||
468 | static | 478 | static |
@@ -499,6 +509,11 @@ static bool handle_kvm_event(struct perf_kvm_stat *kvm, | |||
499 | if (!vcpu_record) | 509 | if (!vcpu_record) |
500 | return true; | 510 | return true; |
501 | 511 | ||
512 | /* only process events for vcpus user cares about */ | ||
513 | if ((kvm->trace_vcpu != -1) && | ||
514 | (kvm->trace_vcpu != vcpu_record->vcpu_id)) | ||
515 | return true; | ||
516 | |||
502 | if (kvm->events_ops->is_begin_event(evsel, sample, &key)) | 517 | if (kvm->events_ops->is_begin_event(evsel, sample, &key)) |
503 | return handle_begin_event(kvm, vcpu_record, &key, sample->time); | 518 | return handle_begin_event(kvm, vcpu_record, &key, sample->time); |
504 | 519 | ||
@@ -598,13 +613,15 @@ static void sort_result(struct perf_kvm_stat *kvm) | |||
598 | int vcpu = kvm->trace_vcpu; | 613 | int vcpu = kvm->trace_vcpu; |
599 | struct kvm_event *event; | 614 | struct kvm_event *event; |
600 | 615 | ||
601 | for (i = 0; i < EVENTS_CACHE_SIZE; i++) | 616 | for (i = 0; i < EVENTS_CACHE_SIZE; i++) { |
602 | list_for_each_entry(event, &kvm->kvm_events_cache[i], hash_entry) | 617 | list_for_each_entry(event, &kvm->kvm_events_cache[i], hash_entry) { |
603 | if (event_is_valid(event, vcpu)) { | 618 | if (event_is_valid(event, vcpu)) { |
604 | update_total_count(kvm, event); | 619 | update_total_count(kvm, event); |
605 | insert_to_result(&kvm->result, event, | 620 | insert_to_result(&kvm->result, event, |
606 | kvm->compare, vcpu); | 621 | kvm->compare, vcpu); |
607 | } | 622 | } |
623 | } | ||
624 | } | ||
608 | } | 625 | } |
609 | 626 | ||
610 | /* returns left most element of result, and erase it */ | 627 | /* returns left most element of result, and erase it */ |
@@ -661,8 +678,8 @@ static void print_result(struct perf_kvm_stat *kvm) | |||
661 | pr_info("\n"); | 678 | pr_info("\n"); |
662 | } | 679 | } |
663 | 680 | ||
664 | pr_info("\nTotal Samples:%lld, Total events handled time:%.2fus.\n\n", | 681 | pr_info("\nTotal Samples:%" PRIu64 ", Total events handled time:%.2fus.\n\n", |
665 | (unsigned long long)kvm->total_count, kvm->total_time / 1e3); | 682 | kvm->total_count, kvm->total_time / 1e3); |
666 | } | 683 | } |
667 | 684 | ||
668 | static int process_sample_event(struct perf_tool *tool, | 685 | static int process_sample_event(struct perf_tool *tool, |