aboutsummaryrefslogtreecommitdiffstats
path: root/tools/lib/traceevent/plugin_kvm.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-08-26 14:25:21 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-08-26 14:25:21 -0400
commitd207ea8e74ff45be0838afa12bdd2492fa9dc8bc (patch)
tree97cfb3ed5c1bb42790e98e62b823526f61000b9f /tools/lib/traceevent/plugin_kvm.c
parent2a8a2b7c49d6eb5f3348892c4676267376cfd40b (diff)
parent66e5db4a1ccc64f278653bc69dc406d184dc750a (diff)
Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf updates from Thomas Gleixner: "Kernel: - Improve kallsyms coverage - Add x86 entry trampolines to kcore - Fix ARM SPE handling - Correct PPC event post processing Tools: - Make the build system more robust - Small fixes and enhancements all over the place - Update kernel ABI header copies - Preparatory work for converting libtraceevnt to a shared library - License cleanups" * 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (100 commits) tools arch: Update arch/x86/lib/memcpy_64.S copy used in 'perf bench mem memcpy' tools arch x86: Update tools's copy of cpufeatures.h perf python: Fix pyrf_evlist__read_on_cpu() interface perf mmap: Store real cpu number in 'struct perf_mmap' perf tools: Remove ext from struct kmod_path perf tools: Add gzip_is_compressed function perf tools: Add lzma_is_compressed function perf tools: Add is_compressed callback to compressions array perf tools: Move the temp file processing into decompress_kmodule perf tools: Use compression id in decompress_kmodule() perf tools: Store compression id into struct dso perf tools: Add compression id into 'struct kmod_path' perf tools: Make is_supported_compression() static perf tools: Make decompress_to_file() function static perf tools: Get rid of dso__needs_decompress() call in __open_dso() perf tools: Get rid of dso__needs_decompress() call in symbol__disassemble() perf tools: Get rid of dso__needs_decompress() call in read_object_code() tools lib traceevent: Change to SPDX License format perf llvm: Allow passing options to llc in addition to clang perf parser: Improve error message for PMU address filters ...
Diffstat (limited to 'tools/lib/traceevent/plugin_kvm.c')
-rw-r--r--tools/lib/traceevent/plugin_kvm.c154
1 files changed, 77 insertions, 77 deletions
diff --git a/tools/lib/traceevent/plugin_kvm.c b/tools/lib/traceevent/plugin_kvm.c
index 18536f756577..1d0d15906225 100644
--- a/tools/lib/traceevent/plugin_kvm.c
+++ b/tools/lib/traceevent/plugin_kvm.c
@@ -247,17 +247,17 @@ static const char *find_exit_reason(unsigned isa, int val)
247 return strings[i].str; 247 return strings[i].str;
248} 248}
249 249
250static int print_exit_reason(struct trace_seq *s, struct pevent_record *record, 250static int print_exit_reason(struct trace_seq *s, struct tep_record *record,
251 struct event_format *event, const char *field) 251 struct event_format *event, const char *field)
252{ 252{
253 unsigned long long isa; 253 unsigned long long isa;
254 unsigned long long val; 254 unsigned long long val;
255 const char *reason; 255 const char *reason;
256 256
257 if (pevent_get_field_val(s, event, field, record, &val, 1) < 0) 257 if (tep_get_field_val(s, event, field, record, &val, 1) < 0)
258 return -1; 258 return -1;
259 259
260 if (pevent_get_field_val(s, event, "isa", record, &isa, 0) < 0) 260 if (tep_get_field_val(s, event, "isa", record, &isa, 0) < 0)
261 isa = 1; 261 isa = 1;
262 262
263 reason = find_exit_reason(isa, val); 263 reason = find_exit_reason(isa, val);
@@ -268,7 +268,7 @@ static int print_exit_reason(struct trace_seq *s, struct pevent_record *record,
268 return 0; 268 return 0;
269} 269}
270 270
271static int kvm_exit_handler(struct trace_seq *s, struct pevent_record *record, 271static int kvm_exit_handler(struct trace_seq *s, struct tep_record *record,
272 struct event_format *event, void *context) 272 struct event_format *event, void *context)
273{ 273{
274 unsigned long long info1 = 0, info2 = 0; 274 unsigned long long info1 = 0, info2 = 0;
@@ -276,10 +276,10 @@ static int kvm_exit_handler(struct trace_seq *s, struct pevent_record *record,
276 if (print_exit_reason(s, record, event, "exit_reason") < 0) 276 if (print_exit_reason(s, record, event, "exit_reason") < 0)
277 return -1; 277 return -1;
278 278
279 pevent_print_num_field(s, " rip 0x%lx", event, "guest_rip", record, 1); 279 tep_print_num_field(s, " rip 0x%lx", event, "guest_rip", record, 1);
280 280
281 if (pevent_get_field_val(s, event, "info1", record, &info1, 0) >= 0 281 if (tep_get_field_val(s, event, "info1", record, &info1, 0) >= 0
282 && pevent_get_field_val(s, event, "info2", record, &info2, 0) >= 0) 282 && tep_get_field_val(s, event, "info2", record, &info2, 0) >= 0)
283 trace_seq_printf(s, " info %llx %llx", info1, info2); 283 trace_seq_printf(s, " info %llx %llx", info1, info2);
284 284
285 return 0; 285 return 0;
@@ -291,7 +291,7 @@ static int kvm_exit_handler(struct trace_seq *s, struct pevent_record *record,
291#define KVM_EMUL_INSN_F_CS_L (1 << 3) 291#define KVM_EMUL_INSN_F_CS_L (1 << 3)
292 292
293static int kvm_emulate_insn_handler(struct trace_seq *s, 293static int kvm_emulate_insn_handler(struct trace_seq *s,
294 struct pevent_record *record, 294 struct tep_record *record,
295 struct event_format *event, void *context) 295 struct event_format *event, void *context)
296{ 296{
297 unsigned long long rip, csbase, len, flags, failed; 297 unsigned long long rip, csbase, len, flags, failed;
@@ -299,22 +299,22 @@ static int kvm_emulate_insn_handler(struct trace_seq *s,
299 uint8_t *insn; 299 uint8_t *insn;
300 const char *disasm; 300 const char *disasm;
301 301
302 if (pevent_get_field_val(s, event, "rip", record, &rip, 1) < 0) 302 if (tep_get_field_val(s, event, "rip", record, &rip, 1) < 0)
303 return -1; 303 return -1;
304 304
305 if (pevent_get_field_val(s, event, "csbase", record, &csbase, 1) < 0) 305 if (tep_get_field_val(s, event, "csbase", record, &csbase, 1) < 0)
306 return -1; 306 return -1;
307 307
308 if (pevent_get_field_val(s, event, "len", record, &len, 1) < 0) 308 if (tep_get_field_val(s, event, "len", record, &len, 1) < 0)
309 return -1; 309 return -1;
310 310
311 if (pevent_get_field_val(s, event, "flags", record, &flags, 1) < 0) 311 if (tep_get_field_val(s, event, "flags", record, &flags, 1) < 0)
312 return -1; 312 return -1;
313 313
314 if (pevent_get_field_val(s, event, "failed", record, &failed, 1) < 0) 314 if (tep_get_field_val(s, event, "failed", record, &failed, 1) < 0)
315 return -1; 315 return -1;
316 316
317 insn = pevent_get_field_raw(s, event, "insn", record, &llen, 1); 317 insn = tep_get_field_raw(s, event, "insn", record, &llen, 1);
318 if (!insn) 318 if (!insn)
319 return -1; 319 return -1;
320 320
@@ -330,24 +330,24 @@ static int kvm_emulate_insn_handler(struct trace_seq *s,
330} 330}
331 331
332 332
333static int kvm_nested_vmexit_inject_handler(struct trace_seq *s, struct pevent_record *record, 333static int kvm_nested_vmexit_inject_handler(struct trace_seq *s, struct tep_record *record,
334 struct event_format *event, void *context) 334 struct event_format *event, void *context)
335{ 335{
336 if (print_exit_reason(s, record, event, "exit_code") < 0) 336 if (print_exit_reason(s, record, event, "exit_code") < 0)
337 return -1; 337 return -1;
338 338
339 pevent_print_num_field(s, " info1 %llx", event, "exit_info1", record, 1); 339 tep_print_num_field(s, " info1 %llx", event, "exit_info1", record, 1);
340 pevent_print_num_field(s, " info2 %llx", event, "exit_info2", record, 1); 340 tep_print_num_field(s, " info2 %llx", event, "exit_info2", record, 1);
341 pevent_print_num_field(s, " int_info %llx", event, "exit_int_info", record, 1); 341 tep_print_num_field(s, " int_info %llx", event, "exit_int_info", record, 1);
342 pevent_print_num_field(s, " int_info_err %llx", event, "exit_int_info_err", record, 1); 342 tep_print_num_field(s, " int_info_err %llx", event, "exit_int_info_err", record, 1);
343 343
344 return 0; 344 return 0;
345} 345}
346 346
347static int kvm_nested_vmexit_handler(struct trace_seq *s, struct pevent_record *record, 347static int kvm_nested_vmexit_handler(struct trace_seq *s, struct tep_record *record,
348 struct event_format *event, void *context) 348 struct event_format *event, void *context)
349{ 349{
350 pevent_print_num_field(s, "rip %llx ", event, "rip", record, 1); 350 tep_print_num_field(s, "rip %llx ", event, "rip", record, 1);
351 351
352 return kvm_nested_vmexit_inject_handler(s, record, event, context); 352 return kvm_nested_vmexit_inject_handler(s, record, event, context);
353} 353}
@@ -370,7 +370,7 @@ union kvm_mmu_page_role {
370 }; 370 };
371}; 371};
372 372
373static int kvm_mmu_print_role(struct trace_seq *s, struct pevent_record *record, 373static int kvm_mmu_print_role(struct trace_seq *s, struct tep_record *record,
374 struct event_format *event, void *context) 374 struct event_format *event, void *context)
375{ 375{
376 unsigned long long val; 376 unsigned long long val;
@@ -379,7 +379,7 @@ static int kvm_mmu_print_role(struct trace_seq *s, struct pevent_record *record,
379 }; 379 };
380 union kvm_mmu_page_role role; 380 union kvm_mmu_page_role role;
381 381
382 if (pevent_get_field_val(s, event, "role", record, &val, 1) < 0) 382 if (tep_get_field_val(s, event, "role", record, &val, 1) < 0)
383 return -1; 383 return -1;
384 384
385 role.word = (int)val; 385 role.word = (int)val;
@@ -388,8 +388,8 @@ static int kvm_mmu_print_role(struct trace_seq *s, struct pevent_record *record,
388 * We can only use the structure if file is of the same 388 * We can only use the structure if file is of the same
389 * endianess. 389 * endianess.
390 */ 390 */
391 if (pevent_is_file_bigendian(event->pevent) == 391 if (tep_is_file_bigendian(event->pevent) ==
392 pevent_is_host_bigendian(event->pevent)) { 392 tep_is_host_bigendian(event->pevent)) {
393 393
394 trace_seq_printf(s, "%u q%u%s %s%s %spae %snxe %swp%s%s%s", 394 trace_seq_printf(s, "%u q%u%s %s%s %spae %snxe %swp%s%s%s",
395 role.level, 395 role.level,
@@ -406,10 +406,10 @@ static int kvm_mmu_print_role(struct trace_seq *s, struct pevent_record *record,
406 } else 406 } else
407 trace_seq_printf(s, "WORD: %08x", role.word); 407 trace_seq_printf(s, "WORD: %08x", role.word);
408 408
409 pevent_print_num_field(s, " root %u ", event, 409 tep_print_num_field(s, " root %u ", event,
410 "root_count", record, 1); 410 "root_count", record, 1);
411 411
412 if (pevent_get_field_val(s, event, "unsync", record, &val, 1) < 0) 412 if (tep_get_field_val(s, event, "unsync", record, &val, 1) < 0)
413 return -1; 413 return -1;
414 414
415 trace_seq_printf(s, "%s%c", val ? "unsync" : "sync", 0); 415 trace_seq_printf(s, "%s%c", val ? "unsync" : "sync", 0);
@@ -417,17 +417,17 @@ static int kvm_mmu_print_role(struct trace_seq *s, struct pevent_record *record,
417} 417}
418 418
419static int kvm_mmu_get_page_handler(struct trace_seq *s, 419static int kvm_mmu_get_page_handler(struct trace_seq *s,
420 struct pevent_record *record, 420 struct tep_record *record,
421 struct event_format *event, void *context) 421 struct event_format *event, void *context)
422{ 422{
423 unsigned long long val; 423 unsigned long long val;
424 424
425 if (pevent_get_field_val(s, event, "created", record, &val, 1) < 0) 425 if (tep_get_field_val(s, event, "created", record, &val, 1) < 0)
426 return -1; 426 return -1;
427 427
428 trace_seq_printf(s, "%s ", val ? "new" : "existing"); 428 trace_seq_printf(s, "%s ", val ? "new" : "existing");
429 429
430 if (pevent_get_field_val(s, event, "gfn", record, &val, 1) < 0) 430 if (tep_get_field_val(s, event, "gfn", record, &val, 1) < 0)
431 return -1; 431 return -1;
432 432
433 trace_seq_printf(s, "sp gfn %llx ", val); 433 trace_seq_printf(s, "sp gfn %llx ", val);
@@ -444,79 +444,79 @@ process_is_writable_pte(struct trace_seq *s, unsigned long long *args)
444 return pte & PT_WRITABLE_MASK; 444 return pte & PT_WRITABLE_MASK;
445} 445}
446 446
447int PEVENT_PLUGIN_LOADER(struct pevent *pevent) 447int TEP_PLUGIN_LOADER(struct tep_handle *pevent)
448{ 448{
449 init_disassembler(); 449 init_disassembler();
450 450
451 pevent_register_event_handler(pevent, -1, "kvm", "kvm_exit", 451 tep_register_event_handler(pevent, -1, "kvm", "kvm_exit",
452 kvm_exit_handler, NULL); 452 kvm_exit_handler, NULL);
453 453
454 pevent_register_event_handler(pevent, -1, "kvm", "kvm_emulate_insn", 454 tep_register_event_handler(pevent, -1, "kvm", "kvm_emulate_insn",
455 kvm_emulate_insn_handler, NULL); 455 kvm_emulate_insn_handler, NULL);
456 456
457 pevent_register_event_handler(pevent, -1, "kvm", "kvm_nested_vmexit", 457 tep_register_event_handler(pevent, -1, "kvm", "kvm_nested_vmexit",
458 kvm_nested_vmexit_handler, NULL); 458 kvm_nested_vmexit_handler, NULL);
459 459
460 pevent_register_event_handler(pevent, -1, "kvm", "kvm_nested_vmexit_inject", 460 tep_register_event_handler(pevent, -1, "kvm", "kvm_nested_vmexit_inject",
461 kvm_nested_vmexit_inject_handler, NULL); 461 kvm_nested_vmexit_inject_handler, NULL);
462 462
463 pevent_register_event_handler(pevent, -1, "kvmmmu", "kvm_mmu_get_page", 463 tep_register_event_handler(pevent, -1, "kvmmmu", "kvm_mmu_get_page",
464 kvm_mmu_get_page_handler, NULL); 464 kvm_mmu_get_page_handler, NULL);
465 465
466 pevent_register_event_handler(pevent, -1, "kvmmmu", "kvm_mmu_sync_page", 466 tep_register_event_handler(pevent, -1, "kvmmmu", "kvm_mmu_sync_page",
467 kvm_mmu_print_role, NULL); 467 kvm_mmu_print_role, NULL);
468 468
469 pevent_register_event_handler(pevent, -1, 469 tep_register_event_handler(pevent, -1,
470 "kvmmmu", "kvm_mmu_unsync_page", 470 "kvmmmu", "kvm_mmu_unsync_page",
471 kvm_mmu_print_role, NULL); 471 kvm_mmu_print_role, NULL);
472 472
473 pevent_register_event_handler(pevent, -1, "kvmmmu", "kvm_mmu_zap_page", 473 tep_register_event_handler(pevent, -1, "kvmmmu", "kvm_mmu_zap_page",
474 kvm_mmu_print_role, NULL); 474 kvm_mmu_print_role, NULL);
475 475
476 pevent_register_event_handler(pevent, -1, "kvmmmu", 476 tep_register_event_handler(pevent, -1, "kvmmmu",
477 "kvm_mmu_prepare_zap_page", kvm_mmu_print_role, 477 "kvm_mmu_prepare_zap_page", kvm_mmu_print_role,
478 NULL); 478 NULL);
479 479
480 pevent_register_print_function(pevent, 480 tep_register_print_function(pevent,
481 process_is_writable_pte, 481 process_is_writable_pte,
482 PEVENT_FUNC_ARG_INT, 482 TEP_FUNC_ARG_INT,
483 "is_writable_pte", 483 "is_writable_pte",
484 PEVENT_FUNC_ARG_LONG, 484 TEP_FUNC_ARG_LONG,
485 PEVENT_FUNC_ARG_VOID); 485 TEP_FUNC_ARG_VOID);
486 return 0; 486 return 0;
487} 487}
488 488
489void PEVENT_PLUGIN_UNLOADER(struct pevent *pevent) 489void TEP_PLUGIN_UNLOADER(struct tep_handle *pevent)
490{ 490{
491 pevent_unregister_event_handler(pevent, -1, "kvm", "kvm_exit", 491 tep_unregister_event_handler(pevent, -1, "kvm", "kvm_exit",
492 kvm_exit_handler, NULL); 492 kvm_exit_handler, NULL);
493 493
494 pevent_unregister_event_handler(pevent, -1, "kvm", "kvm_emulate_insn", 494 tep_unregister_event_handler(pevent, -1, "kvm", "kvm_emulate_insn",
495 kvm_emulate_insn_handler, NULL); 495 kvm_emulate_insn_handler, NULL);
496 496
497 pevent_unregister_event_handler(pevent, -1, "kvm", "kvm_nested_vmexit", 497 tep_unregister_event_handler(pevent, -1, "kvm", "kvm_nested_vmexit",
498 kvm_nested_vmexit_handler, NULL); 498 kvm_nested_vmexit_handler, NULL);
499 499
500 pevent_unregister_event_handler(pevent, -1, "kvm", "kvm_nested_vmexit_inject", 500 tep_unregister_event_handler(pevent, -1, "kvm", "kvm_nested_vmexit_inject",
501 kvm_nested_vmexit_inject_handler, NULL); 501 kvm_nested_vmexit_inject_handler, NULL);
502 502
503 pevent_unregister_event_handler(pevent, -1, "kvmmmu", "kvm_mmu_get_page", 503 tep_unregister_event_handler(pevent, -1, "kvmmmu", "kvm_mmu_get_page",
504 kvm_mmu_get_page_handler, NULL); 504 kvm_mmu_get_page_handler, NULL);
505 505
506 pevent_unregister_event_handler(pevent, -1, "kvmmmu", "kvm_mmu_sync_page", 506 tep_unregister_event_handler(pevent, -1, "kvmmmu", "kvm_mmu_sync_page",
507 kvm_mmu_print_role, NULL); 507 kvm_mmu_print_role, NULL);
508 508
509 pevent_unregister_event_handler(pevent, -1, 509 tep_unregister_event_handler(pevent, -1,
510 "kvmmmu", "kvm_mmu_unsync_page", 510 "kvmmmu", "kvm_mmu_unsync_page",
511 kvm_mmu_print_role, NULL); 511 kvm_mmu_print_role, NULL);
512 512
513 pevent_unregister_event_handler(pevent, -1, "kvmmmu", "kvm_mmu_zap_page", 513 tep_unregister_event_handler(pevent, -1, "kvmmmu", "kvm_mmu_zap_page",
514 kvm_mmu_print_role, NULL); 514 kvm_mmu_print_role, NULL);
515 515
516 pevent_unregister_event_handler(pevent, -1, "kvmmmu", 516 tep_unregister_event_handler(pevent, -1, "kvmmmu",
517 "kvm_mmu_prepare_zap_page", kvm_mmu_print_role, 517 "kvm_mmu_prepare_zap_page", kvm_mmu_print_role,
518 NULL); 518 NULL);
519 519
520 pevent_unregister_print_function(pevent, process_is_writable_pte, 520 tep_unregister_print_function(pevent, process_is_writable_pte,
521 "is_writable_pte"); 521 "is_writable_pte");
522} 522}