tools lib tracing: Updates from trace-cmd for plugin_kvm
cover tools lib tracing: Updates from trace-cmd for plugin_kvm
Jiri,
I'm synchronizing the changes that is in trace-cmd and the traceevent library. I found a few updates that are missing from the kvm plugin.
-- Steve
Jan Kiszka (3):
tools lib traceevent: Report unknown VMX exit reasons with code tools lib traceevent: Factor out print_exit_reason in kvm plugin tools lib traceevent: Fix and cleanup kvm_nested_vmexit tracepoints
Steven Rostedt (Red Hat) (1):
tools lib traceevent: Add back in kvm plugin's nested_vmexit events
----
tools/lib/traceevent/plugin_kvm.c | 64 ++++++++++++++++++++++++++++++++++----- 1 file changed, 56 insertions(+), 8 deletions(-)
PATCH 1/4 tools lib traceevent: Report unknown VMX exit reasons with code
From: Jan Kiszka <[email protected]>
Allows to parse the result even if the KVM plugin does not yet understand a specific exit code.
--- tools/lib/traceevent/plugin_kvm.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
tools/lib/traceevent/plugin_kvm.c +8 -4
@@ -240,9 +240,8 @@ static const char *find_exit_reason(unsigned isa, int val)for (i =0 ; strings[i].val >=0 ; i++)if (strings[i].val == val)break ; -if (strings[i].str) -return strings[i].str; -return "UNKNOWN" ; + +return strings[i].str; } static int kvm_exit_handler(struct trace_seq *s, struct pevent_record *record,
@@ -251,6 +250,7 @@ static int kvm_exit_handler(struct trace_seq *s, struct pevent_record *record,unsigned long long isa;unsigned long long val;unsigned long long info1 =0 , info2 =0 ; +const char *reason;if (pevent_get_field_val (s, event,"exit_reason" , record, &val,1 ) <0 )return -1 ;
@@ -258,7 +258,11 @@ static int kvm_exit_handler(struct trace_seq *s, struct pevent_record *record,if (pevent_get_field_val (s, event,"isa" , record, &isa,0 ) <0 ) isa =1 ; -trace_seq_printf (s,"reason %s" ,find_exit_reason (isa, val)); + reason =find_exit_reason (isa, val); +if (reason) +trace_seq_printf (s,"reason %s" , reason); +else +trace_seq_printf (s,"reason UNKNOWN (%llu)" , val);pevent_print_num_field (s," rip 0x%lx" , event,"guest_rip" , record,1 );
Signature · 1 line
2.0.0.rc2
PATCH 2/4 tools lib traceevent: Factor out print_exit_reason in kvm plugin
In reply to Steven RostedtFrom: Jan Kiszka <[email protected]>
We will reuse it for nested vmexit tracepoints.
--- tools/lib/traceevent/plugin_kvm.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
tools/lib/traceevent/plugin_kvm.c +13 -4
@@ -244,15 +244,14 @@ static const char *find_exit_reason(unsigned isa, int val)return strings[i].str; } -static int kvm_exit_handler (struct trace_seq *s,struct pevent_record *record, -struct event_format *event,void *context) +static int print_exit_reason (struct trace_seq *s,struct pevent_record *record, +struct event_format *event,const char *field) {unsigned long long isa;unsigned long long val; -unsigned long long info1 =0 , info2 =0 ;const char *reason; -if (pevent_get_field_val (s, event,"exit_reason" , record, &val,1 ) <0 ) +if (pevent_get_field_val (s, event, field, record, &val,1 ) <0 )return -1 ;if (pevent_get_field_val (s, event,"isa" , record, &isa,0 ) <0 )
@@ -263,6 +262,16 @@ static int kvm_exit_handler(struct trace_seq *s, struct pevent_record *record,trace_seq_printf (s,"reason %s" , reason); else trace_seq_printf(s, "reason UNKNOWN (%llu)", val); +return 0 ; +} + +static int kvm_exit_handler (struct trace_seq *s,struct pevent_record *record, +struct event_format *event,void *context) +{ +unsigned long long info1 =0 , info2 =0 ; + +if (print_exit_reason (s, record, event,"exit_reason" ) <0 ) +return -1 ;pevent_print_num_field (s," rip 0x%lx" , event,"guest_rip" , record,1 );
Signature · 1 line
2.0.0.rc2
PATCH 3/4 tools lib traceevent: Add back in kvm plugins nested_vmexit events
In reply to Steven RostedtFrom: "Steven Rostedt (Red Hat)" <[email protected]>
The nested vmexit events were removed from the backport from trace-cmd because they were considered buggy. They have since been updated in trace-cmd but are still missing from the traceevent library. Add back in the buggy version to be able to backport the fixes.
--- tools/lib/traceevent/plugin_kvm.c | 41 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+)
tools/lib/traceevent/plugin_kvm.c +41 -0
@@ -326,6 +326,35 @@ static int kvm_emulate_insn_handler(struct trace_seq *s,return 0 ; } + +static int kvm_nested_vmexit_inject_handler (struct trace_seq *s,struct pevent_record *record, +struct event_format *event,void *context) +{ +unsigned long long val; + +pevent_print_num_field (s," rip %0x016llx" , event,"rip" , record,1 ); + +if (pevent_get_field_val (s, event,"exit_code" , record, &val,1 ) <0 ) +return -1 ; + +trace_seq_printf (s,"reason %s" ,find_exit_reason (2 , val)); + +pevent_print_num_field (s," ext_inf1: %0x016llx" , event,"exit_info1" , record,1 ); +pevent_print_num_field (s," ext_inf2: %0x016llx" , event,"exit_info2" , record,1 ); +pevent_print_num_field (s," ext_int: %0x016llx" , event,"exit_int_info" , record,1 ); +pevent_print_num_field (s," ext_int_err: %0x016llx" , event,"exit_int_info_err" , record,1 ); + +return 0 ; +} + +static int kvm_nested_vmexit_handler (struct trace_seq *s,struct pevent_record *record, +struct event_format *event,void *context) +{ +pevent_print_num_field (s," rip %0x016llx" , event,"rip" , record,1 ); + +return kvm_nested_vmexit_inject_handler (s, record, event, context); +} + union kvm_mmu_page_role { unsigned word; struct {
@@ -422,6 +451,12 @@ int PEVENT_PLUGIN_LOADER(struct pevent *pevent)pevent_register_event_handler (pevent,-1 ,"kvm" ,"kvm_emulate_insn" , kvm_emulate_insn_handler,NULL ); +pevent_register_event_handler (pevent,-1 ,"kvm" ,"kvm_nested_vmexit" , + kvm_nested_vmexit_handler,NULL ); + +pevent_register_event_handler (pevent,-1 ,"kvm" ,"kvm_nested_vmexit_inject" , + kvm_nested_vmexit_inject_handler,NULL ); +pevent_register_event_handler (pevent,-1 ,"kvmmmu" ,"kvm_mmu_get_page" , kvm_mmu_get_page_handler,NULL );
@@ -456,6 +491,12 @@ void PEVENT_PLUGIN_UNLOADER(struct pevent *pevent)pevent_unregister_event_handler (pevent,-1 ,"kvm" ,"kvm_emulate_insn" , kvm_emulate_insn_handler,NULL ); +pevent_unregister_event_handler (pevent,-1 ,"kvm" ,"kvm_nested_vmexit" , + kvm_nested_vmexit_handler,NULL ); + +pevent_unregister_event_handler (pevent,-1 ,"kvm" ,"kvm_nested_vmexit_inject" , + kvm_nested_vmexit_inject_handler,NULL ); +pevent_unregister_event_handler (pevent,-1 ,"kvmmmu" ,"kvm_mmu_get_page" , kvm_mmu_get_page_handler,NULL );
Signature · 1 line
2.0.0.rc2
tip-bot for Steven Rostedt (Red Hat)
merge bot[tip:perf/core] tools lib traceevent: Add back in kvm plugins nested_vmexit events
tools lib traceevent: Add back in kvm plugins nested_vmexit events
Commit-ID: ea092aeb6d4725048c5a46d1c9cbb4fea49b80b0 Gitweb: http://git.kernel.org/tip/ea092aeb6d4725048c5a46d1c9cbb4fea49b80b0 Author: Steven Rostedt (Red Hat) <[email protected]> AuthorDate: Thu, 12 Jun 2014 22:10:05 -0400 Committer: Jiri Olsa <[email protected]> CommitDate: Thu, 19 Jun 2014 18:18:25 +0200
tools lib traceevent: Add back in kvm plugins nested_vmexit events
The nested vmexit events were removed from the backport from trace-cmd because they were considered buggy. They have since been updated in trace-cmd but are still missing from the traceevent library. Add back in the buggy version to be able to backport the fixes.
--- tools/lib/traceevent/plugin_kvm.c | 41 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+)
tools/lib/traceevent/plugin_kvm.c +41 -0
@@ -326,6 +326,35 @@ static int kvm_emulate_insn_handler(struct trace_seq *s,return 0 ; } + +static int kvm_nested_vmexit_inject_handler (struct trace_seq *s,struct pevent_record *record, +struct event_format *event,void *context) +{ +unsigned long long val; + +pevent_print_num_field (s," rip %0x016llx" , event,"rip" , record,1 ); + +if (pevent_get_field_val (s, event,"exit_code" , record, &val,1 ) <0 ) +return -1 ; + +trace_seq_printf (s,"reason %s" ,find_exit_reason (2 , val)); + +pevent_print_num_field (s," ext_inf1: %0x016llx" , event,"exit_info1" , record,1 ); +pevent_print_num_field (s," ext_inf2: %0x016llx" , event,"exit_info2" , record,1 ); +pevent_print_num_field (s," ext_int: %0x016llx" , event,"exit_int_info" , record,1 ); +pevent_print_num_field (s," ext_int_err: %0x016llx" , event,"exit_int_info_err" , record,1 ); + +return 0 ; +} + +static int kvm_nested_vmexit_handler (struct trace_seq *s,struct pevent_record *record, +struct event_format *event,void *context) +{ +pevent_print_num_field (s," rip %0x016llx" , event,"rip" , record,1 ); + +return kvm_nested_vmexit_inject_handler (s, record, event, context); +} + union kvm_mmu_page_role { unsigned word; struct {
@@ -422,6 +451,12 @@ int PEVENT_PLUGIN_LOADER(struct pevent *pevent)pevent_register_event_handler (pevent,-1 ,"kvm" ,"kvm_emulate_insn" , kvm_emulate_insn_handler,NULL ); +pevent_register_event_handler (pevent,-1 ,"kvm" ,"kvm_nested_vmexit" , + kvm_nested_vmexit_handler,NULL ); + +pevent_register_event_handler (pevent,-1 ,"kvm" ,"kvm_nested_vmexit_inject" , + kvm_nested_vmexit_inject_handler,NULL ); +pevent_register_event_handler (pevent,-1 ,"kvmmmu" ,"kvm_mmu_get_page" , kvm_mmu_get_page_handler,NULL );
@@ -456,6 +491,12 @@ void PEVENT_PLUGIN_UNLOADER(struct pevent *pevent)pevent_unregister_event_handler (pevent,-1 ,"kvm" ,"kvm_emulate_insn" , kvm_emulate_insn_handler,NULL ); +pevent_unregister_event_handler (pevent,-1 ,"kvm" ,"kvm_nested_vmexit" , + kvm_nested_vmexit_handler,NULL ); + +pevent_unregister_event_handler (pevent,-1 ,"kvm" ,"kvm_nested_vmexit_inject" , + kvm_nested_vmexit_inject_handler,NULL ); +pevent_unregister_event_handler (pevent,-1 ,"kvmmmu" ,"kvm_mmu_get_page" , kvm_mmu_get_page_handler,NULL );
PATCH 4/4 tools lib traceevent: Fix and cleanup kvm_nested_vmexit tracepoints
In reply to Steven RostedtFrom: Jan Kiszka <[email protected]>
Fix several issues of kvm_nested_vmexit[_inject]: field width aren't supported with pevent_print, rip was printed twice/incorrectly, SVM ISA was hard-coded, we don't use ':' to separate field names.
--- tools/lib/traceevent/plugin_kvm.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-)
tools/lib/traceevent/plugin_kvm.c +6 -12
@@ -330,19 +330,13 @@ static int kvm_emulate_insn_handler(struct trace_seq *s,static int kvm_nested_vmexit_inject_handler (struct trace_seq *s,struct pevent_record *record,struct event_format *event,void *context) { -unsigned long long val; - -pevent_print_num_field (s," rip %0x016llx" , event,"rip" , record,1 ); - -if (pevent_get_field_val (s, event,"exit_code" , record, &val,1 ) <0 ) +if (print_exit_reason (s, record, event,"exit_code" ) <0 )return -1 ; -trace_seq_printf (s,"reason %s" ,find_exit_reason (2 , val)); - -pevent_print_num_field (s," ext_inf1: %0x016llx" , event,"exit_info1" , record,1 ); -pevent_print_num_field (s," ext_inf2: %0x016llx" , event,"exit_info2" , record,1 ); -pevent_print_num_field (s," ext_int: %0x016llx" , event,"exit_int_info" , record,1 ); -pevent_print_num_field (s," ext_int_err: %0x016llx" , event,"exit_int_info_err" , record,1 ); +pevent_print_num_field (s," info1 %llx" , event,"exit_info1" , record,1 ); +pevent_print_num_field (s," info2 %llx" , event,"exit_info2" , record,1 ); +pevent_print_num_field (s," int_info %llx" , event,"exit_int_info" , record,1 ); +pevent_print_num_field (s," int_info_err %llx" , event,"exit_int_info_err" , record,1 );return 0 ; }
@@ -350,7 +344,7 @@ static int kvm_nested_vmexit_inject_handler(struct trace_seq *s, struct pevent_rstatic int kvm_nested_vmexit_handler (struct trace_seq *s,struct pevent_record *record,struct event_format *event,void *context) { -pevent_print_num_field (s," rip %0x016llx" , event,"rip" , record,1 ); +pevent_print_num_field (s,"rip %lx " , event,"rip" , record,1 );return kvm_nested_vmexit_inject_handler (s, record, event, context); }
Signature · 1 line
2.0.0.rc2
Re: [PATCH 4/4] tools lib traceevent: Fix and cleanup kvm_nested_vmexit tracepoints
Hi Steve,
2014-06-12 (목), 22:10 -0400, Steven Rostedt:
Quoted 44 lines
From: Jan Kiszka <[email protected]>
Fix several issues of kvm_nested_vmexit[_inject]: field width aren't supported with
pevent_print, rip was printed twice/incorrectly, SVM ISA was hard-coded, we don't use ':' to separate field names.Signed-off-by Jan Kiszka <[email protected]>Signed-off-by Steven Rostedt <[email protected]>--- tools/lib/traceevent/plugin_kvm.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-)tools/lib/traceevent/plugin_kvm.c +5
-11@@ -330,19 +330,13 @@ static int kvm_emulate_insn_handler(struct trace_seq *s,static int kvm_nested_vmexit_inject_handler (struct trace_seq *s,struct pevent_record *record,struct event_format *event,void *context) { -unsigned long long val; - -pevent_print_num_field (s," rip %0x016llx" , event,"rip" , record,1 ); - -if (pevent_get_field_val (s, event,"exit_code" , record, &val,1 ) <0 ) +if (print_exit_reason (s, record, event,"exit_code" ) <0 )return -1 ; -trace_seq_printf (s,"reason %s" ,find_exit_reason (2 , val)); - -pevent_print_num_field (s," ext_inf1: %0x016llx" , event,"exit_info1" , record,1 ); -pevent_print_num_field (s," ext_inf2: %0x016llx" , event,"exit_info2" , record,1 ); -pevent_print_num_field (s," ext_int: %0x016llx" , event,"exit_int_info" , record,1 ); -pevent_print_num_field (s," ext_int_err: %0x016llx" , event,"exit_int_info_err" , record,1 ); +pevent_print_num_field (s," info1 %llx" , event,"exit_info1" , record,1 ); +pevent_print_num_field (s," info2 %llx" , event,"exit_info2" , record,1 ); +pevent_print_num_field (s," int_info %llx" , event,"exit_int_info" , record,1 ); +pevent_print_num_field (s," int_info_err %llx" , event,"exit_int_info_err" , record,1 );return 0 ; }
tools/lib/traceevent/plugin_kvm.c static int kvm_nested_vmexit_inject_handler(struct trace_seq *s, struct pevent_r · line 347
Quoted 5 lines
tools/lib/traceevent/plugin_kvm.c +1
-1@@ -350,7 +344,7 @@ static int kvm_nested_vmexit_inject_handler(struct trace_seq *s, struct pevent_rstatic int kvm_nested_vmexit_handler (struct trace_seq *s,struct pevent_record *record,struct event_format *event,void *context) { -pevent_print_num_field (s," rip %0x016llx" , event,"rip" , record,1 ); +pevent_print_num_field (s,"rip %lx " , event,"rip" , record,1 );
s/%lx/%llx/
Otherwise this series and previous two cleanup patches look good to me.
Thanks,
Namhyung
Quoted 3 lines
tools/lib/traceevent/plugin_kvm.c +0
-0return kvm_nested_vmexit_inject_handler (s, record, event, context); }
Re: [PATCH 4/4] tools lib traceevent: Fix and cleanup kvm_nested_vmexit tracepoints
Quoted 5 lines · On Fri, 13 Jun 2014 18:55:37 +0900 Namhyung Kim <[email protected]> wrote:
tools/lib/traceevent/plugin_kvm.c static int kvm_nested_vmexit_inject_handler(struct trace_seq *s, struct pevent_r · line 347
Quoted 3 lines
{
tools/lib/traceevent/plugin_kvm.c +1
-1-pevent_print_num_field (s," rip %0x016llx" , event,"rip" , record,1 ); +pevent_print_num_field (s,"rip %lx " , event,"rip" , record,1 );s/%lx/%llx/
I'll make this as a separate fix to keep the original patch as is.
Quoted 5 lines
Otherwise this series and previous two cleanup patches look good to me.
Acked-by Namhyung Kim <[email protected]>
Thanks!
-- Steve
[PATCH 5/4] tools lib traceevent: Fix format in plugin_kvm
In reply to Steven RostedtThe format field argument passed to the format
in pevent_print_num_field() will be of type long long. That means that %ll must be used instead of %l.
---
tools/lib/traceevent/plugin_kvm.c +1 -1
@@ -344,7 +344,7 @@ static int kvm_nested_vmexit_inject_handler(struct trace_seq *s, struct pevent_rstatic int kvm_nested_vmexit_handler (struct trace_seq *s,struct pevent_record *record,struct event_format *event,void *context) { -pevent_print_num_field (s,"rip %lx " , event,"rip" , record,1 ); +pevent_print_num_field (s,"rip %llx " , event,"rip" , record,1 );return kvm_nested_vmexit_inject_handler (s, record, event, context); }
tip-bot for Steven Rostedt
merge bot[tip:perf/core] tools lib traceevent: Fix format in plugin_kvm
tools lib traceevent: Fix format in plugin_kvm
Commit-ID: a21e3a34bef9e9c177be61111ced23e71e25fd8a Gitweb: http://git.kernel.org/tip/a21e3a34bef9e9c177be61111ced23e71e25fd8a Author: Steven Rostedt <[email protected]> AuthorDate: Fri, 13 Jun 2014 10:31:27 -0400 Committer: Jiri Olsa <[email protected]> CommitDate: Thu, 19 Jun 2014 18:18:33 +0200
tools lib traceevent: Fix format in plugin_kvm
The format field argument passed to the format
in pevent_print_num_field() will be of type long long. That means that %ll must be used instead of %l.
--- tools/lib/traceevent/plugin_kvm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/lib/traceevent/plugin_kvm.c +1 -1
@@ -344,7 +344,7 @@ static int kvm_nested_vmexit_inject_handler(struct trace_seq *s, struct pevent_rstatic int kvm_nested_vmexit_handler (struct trace_seq *s,struct pevent_record *record,struct event_format *event,void *context) { -pevent_print_num_field (s,"rip %lx " , event,"rip" , record,1 ); +pevent_print_num_field (s,"rip %llx " , event,"rip" , record,1 );return kvm_nested_vmexit_inject_handler (s, record, event, context); }
Quoted 4 lines · Steven Rostedt
Jiri,
I'm synchronizing the changes that is in trace-cmd and the traceevent library. I found a few updates that are missing from the kvm plugin.
queued, also the 5/4 ;-)
thanks,
jirka
Quoted 16 lines
-- Steve
Jan Kiszka (3):
tools lib traceevent: Report unknown VMX exit reasons with code tools lib traceevent: Factor outprint_exit_reasonin kvm plugin tools lib traceevent: Fix and cleanupkvm_nested_vmexittracepointsSteven Rostedt (Red Hat) (1):
tools lib traceevent: Add back in kvm plugin'snested_vmexitevents----
tools/lib/traceevent/plugin_kvm.c | 64 ++++++++++++++++++++++++++++++++++----- 1 file changed, 56 insertions(+), 8 deletions(-)