trace-cmd: fix kvm_mmu_prepare_zap_page even name and kvm_mmu_get_page event output in kvm plugin
PATCH 1/1 trace-cmd: fix kvm_mmu_prepare_zap_page even name and kvm_mmu_get_page event output in kvm plugin
kvm_mmu_zap_page even was renamed to kvm_mmu_prepare_zap_page. Print out created field for kvm_mmu_get_page event.
plugin_kvm.c +7 -2
@@ -382,7 +382,7 @@ static int kvm_mmu_print_role(struct trace_seq *s, struct pevent_record *record, }else trace_seq_printf (s,"WORD: %08x" , role.word); -pevent_print_num_field (s," root %u" , event, +pevent_print_num_field (s," root %u " , event,"root_count" , record,1 );if (pevent_get_field_val (s, event,"unsync" , record, &val,1 ) <0 )
@@ -397,6 +397,11 @@ static int kvm_mmu_get_page_handler(struct trace_seq *s, struct pevent_record *r {unsigned long long val; +if (pevent_get_field_val (s, event,"created" , record, &val,1 ) <0 ) +return -1 ; + +trace_seq_printf (s,"%s " , val ?"new" :"existing" ); +if (pevent_get_field_val (s, event,"gfn" , record, &val,1 ) <0 )return -1 ;
@@ -430,7 +435,7 @@ int PEVENT_PLUGIN_LOADER(struct pevent *pevent)pevent_register_event_handler (pevent,-1 ,"kvmmmu" ,"kvm_mmu_unsync_page" , kvm_mmu_print_role,NULL ); -pevent_register_event_handler (pevent,-1 ,"kvmmmu" ,"kvm_mmu_zap_page" , +pevent_register_event_handler (pevent,-1 ,"kvmmmu" ,"kvm_mmu_prepare_zap_page" , kvm_mmu_print_role,NULL );return 0 ;
--
Gleb.
Quoted 2 lines · Gleb Natapov
kvm_mmu_zap_pageeven was renamed tokvm_mmu_prepare_zap_page. Print out created field forkvm_mmu_get_pageevent.
trace-cmd needs to be backward compatible with older kernels. If older kernels used kvm_mmu_zap_page, then please add a check for that and have the plugin cope with either one.
Thanks,
-- Steve
Quoted 38 lines
Signed-off-by Gleb Natapov <[email protected]>plugin_kvm.c +7
-3@@ -382,7 +382,7 @@ static int kvm_mmu_print_role(struct trace_seq *s, struct pevent_record *record, }else trace_seq_printf (s,"WORD: %08x" , role.word); -pevent_print_num_field (s," root %u" , event, +pevent_print_num_field (s," root %u " , event,"root_count" , record,1 );if (pevent_get_field_val (s, event,"unsync" , record, &val,1 ) <0 )@@ -397,6 +397,11 @@ static int kvm_mmu_get_page_handler(struct trace_seq *s, struct pevent_record *r {unsigned long long val; +if (pevent_get_field_val (s, event,"created" , record, &val,1 ) <0 ) +return -1 ; + +trace_seq_printf (s,"%s " , val ?"new" :"existing" ); +if (pevent_get_field_val (s, event,"gfn" , record, &val,1 ) <0 )return -1 ;@@ -430,7 +435,7 @@ int PEVENT_PLUGIN_LOADER(struct pevent *pevent)pevent_register_event_handler (pevent,-1 ,"kvmmmu" ,"kvm_mmu_unsync_page" , kvm_mmu_print_role,NULL ); -pevent_register_event_handler (pevent,-1 ,"kvmmmu" ,"kvm_mmu_zap_page" , +pevent_register_event_handler (pevent,-1 ,"kvmmmu" ,"kvm_mmu_prepare_zap_page" , kvm_mmu_print_role,NULL );return 0 ; --Gleb.
Quoted 8 lines · Steven Rostedt
Quoted 2 lines · Gleb Natapov
kvm_mmu_zap_pageeven was renamed tokvm_mmu_prepare_zap_page. Print out created field forkvm_mmu_get_pageevent.trace-cmd needs to be backward compatible with older kernels. If older kernels used
kvm_mmu_zap_page, then please add a check for that and have the plugin cope with either one.
Something like this?
if (pevent_find_event_by_name(pevent, "kvmmmu", "kvm_mmu_prepare_zap_page"))
pevent_register_event_handler(pevent, -1, "kvmmmu",
"kvm_mmu_prepare_zap_page", kvm_mmu_print_role, NULL);
else
pevent_register_event_handler(pevent, -1, "kvmmmu",
"kvm_mmu_zap_page", kvm_mmu_print_role, NULL);
Also when trace-cmd encounters an event it does not recognize it prints mysterious message:
trace-cmd: No such file or directory
bad op token {
Is this a bug?
Quoted 35 lines
Thanks,
-- Steve
Quoted 31 lines
Signed-off-by Gleb Natapov <[email protected]>plugin_kvm.c +6
-1@@ -382,7 +382,7 @@ static int kvm_mmu_print_role(struct trace_seq *s, struct pevent_record *record, }else trace_seq_printf (s,"WORD: %08x" , role.word); -pevent_print_num_field (s," root %u" , event, +pevent_print_num_field (s," root %u " , event,"root_count" , record,1 );if (pevent_get_field_val (s, event,"unsync" , record, &val,1 ) <0 )@@ -397,6 +397,11 @@ static int kvm_mmu_get_page_handler(struct trace_seq *s, struct pevent_record *r {unsigned long long val; +if (pevent_get_field_val (s, event,"created" , record, &val,1 ) <0 ) +return -1 ; + +trace_seq_printf (s,"%s " , val ?"new" :"existing" ); +if (pevent_get_field_val (s, event,"gfn" , record, &val,1 ) <0 )return -1 ;@@ -430,7 +435,7 @@ int PEVENT_PLUGIN_LOADER(struct pevent *pevent)pevent_register_event_handler (pevent,-1 ,"kvmmmu" ,"kvm_mmu_unsync_page" , kvm_mmu_print_role,NULL );
Quoted 8 lines
Quoted 7 lines
plugin_kvm.c +1
-2-pevent_register_event_handler (pevent,-1 ,"kvmmmu" ,"kvm_mmu_zap_page" , +pevent_register_event_handler (pevent,-1 ,"kvmmmu" ,"kvm_mmu_prepare_zap_page" , kvm_mmu_print_role,NULL );return 0 ; --Gleb.
--
Gleb.
Quoted 11 lines · Gleb Natapov
Quoted 8 lines · Steven Rostedt
Quoted 2 lines · Gleb Natapov
kvm_mmu_zap_pageeven was renamed tokvm_mmu_prepare_zap_page. Print out created field forkvm_mmu_get_pageevent.trace-cmd needs to be backward compatible with older kernels. If older kernels used
kvm_mmu_zap_page, then please add a check for that and have the plugin cope with either one.Something like this?
Quoted 7 lines
if (
pevent_find_event_by_name(pevent, "kvmmmu", "kvm_mmu_prepare_zap_page"))
pevent_register_event_handler(pevent, -1, "kvmmmu",
"kvm_mmu_prepare_zap_page",kvm_mmu_print_role, NULL);
else
pevent_register_event_handler(pevent, -1, "kvmmmu",
"kvm_mmu_zap_page",kvm_mmu_print_role, NULL);
Sure, if it works.
Quoted 9 lines
Also when trace-cmd encounters an event it does not recognize it prints mysterious message:
trace-cmd: No such file or directory
bad op token {Is this a bug?
Yes and no ;-)
I need to get rid of the "perror" part, for errors that don't set errno. That's been on my todo list for a long time. Maybe when I come back to work next week I'll fix that.
The 'bad op token {' happens when it tries to parse an event and it comes across something that it doesn't recognize. In this case a '{'.
The kvm events are notorious with having extremely complex "print_fmt" fields in their event format files. When no event handler is registered for an event, trace-cmd uses the print_fmt to figure out how to print it. This was never meant to be too complex of a parser. For example, looking at my kvm_mmu_prepare_zap_page, we have:
print fmt: "%s", ({ const char *ret = p->buffer + p->len; static const char *access_str[] = { "---", "--x", "w--", "w-x", "-u-", "-ux", "wu-", "wux" }; union kvm_mmu_page_role role;
role.word = REC->role; trace_seq_printf(p, "sp gfn %llx %u%s q%u%s %s%s" " %snxe root %u %s%c", REC->gfn, role.level, role.cr4_pae ? " pae" : "", role.quadrant, role.direct ? "
direct" : "", access_str[role.access], role.invalid ? " invalid" : "", role.nxe ? "" : "!",
REC->root_count, REC->unsync ? "unsync" : "sync", 0); ret; })
trace-cmd has no idea on how to parse "({ const char *ret ..." in fact it dies on that first "{" because trace-cmd is not a full C parser.
This was why the plugins were created in the first place. To handle various events that have too complex print_fmts for trace-cmd to understand.
Most events are simple print_fmts and do not need plugins. Like sock_rcvqueue_full:
print fmt: "rmem_alloc=%d truesize=%u sk_rcvbuf=%d", REC->rmem_alloc, REC->truesize, REC->sk_rcvbuf
trace-cmd has no problem parsing events like that.
-- Steve
Quoted 20 lines · Steven Rostedt
Quoted 11 lines · Gleb Natapov
Quoted 8 lines · Steven Rostedt
Quoted 2 lines · Gleb Natapov
kvm_mmu_zap_pageeven was renamed tokvm_mmu_prepare_zap_page. Print out created field forkvm_mmu_get_pageevent.trace-cmd needs to be backward compatible with older kernels. If older kernels used
kvm_mmu_zap_page, then please add a check for that and have the plugin cope with either one.Something like this?
Quoted 7 lines
if (
pevent_find_event_by_name(pevent, "kvmmmu", "kvm_mmu_prepare_zap_page"))
pevent_register_event_handler(pevent, -1, "kvmmmu",
"kvm_mmu_prepare_zap_page",kvm_mmu_print_role, NULL);
else
pevent_register_event_handler(pevent, -1, "kvmmmu",
"kvm_mmu_zap_page",kvm_mmu_print_role, NULL);
Quoted 2 lines
Sure, if it works.
Well, it isn't and if it were it would have prevented tarce-cmd running on new kernel from reading traces generated on older kernels. I will register both.
Quoted 39 lines
Quoted 9 lines
Also when trace-cmd encounters an event it does not recognize it prints mysterious message:
trace-cmd: No such file or directory
bad op token {Is this a bug?
Yes and no ;-)
I need to get rid of the "perror" part, for errors that don't set errno. That's been on my todo list for a long time. Maybe when I come back to work next week I'll fix that.
The 'bad op token {' happens when it tries to parse an event and it comes across something that it doesn't recognize. In this case a '{'.
The kvm events are notorious with having extremely complex "
print_fmt" fields in their event format files. When no event handler is registered for an event, trace-cmd uses theprint_fmtto figure out how to print it. This was never meant to be too complex of a parser. For example, looking at mykvm_mmu_prepare_zap_page, we have:print fmt: "%s", ({ const char *ret =
p->buffer+p->len; static const char *access_str[] = { "---", "--x", "w--", "w-x", "-u-", "-ux", "wu-", "wux" }; unionkvm_mmu_page_rolerole;
role.word =REC->role; trace_seq_printf(p, "sp gfn %llx %u%s q%u%s %s%s" " %snxe root %u %s%c",REC->gfn, role.level, role.cr4_pae ? " pae" : "", role.quadrant, role.direct ? "
direct" : "", access_str[role.access], role.invalid ? " invalid" : "", role.nxe ? "" : "!",
REC->root_count,REC->unsync? "unsync" : "sync", 0); ret; })trace-cmd has no idea on how to parse "({ const char *ret ..." in fact it dies on that first "{" because trace-cmd is not a full C parser.
This was why the plugins were created in the first place. To handle various events that have too complex
print_fmtsfor trace-cmd to understand.
Quoted 8 lines
Most events are simple
print_fmtsand do not need plugins. Likesock_rcvqueue_full:print fmt: "rmem_alloc=%d truesize=%u sk_rcvbuf=%d",
REC->rmem_alloc,REC->truesize,REC->sk_rcvbuftrace-cmd has no problem parsing events like that.
Got it.
--
Gleb.