aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/builtin-kvm.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/builtin-kvm.c')
-rw-r--r--tools/perf/builtin-kvm.c35
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
315static void init_kvm_event_record(struct perf_kvm_stat *kvm) 315static 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)
417static bool update_kvm_event(struct kvm_event *event, int vcpu_id, 418static 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
468static 478static
@@ -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
668static int process_sample_event(struct perf_tool *tool, 685static int process_sample_event(struct perf_tool *tool,