Skip to content

Commit 1dde0f4

Browse files
Lluís VilanovastefanhaRH
Lluís Vilanova
authored andcommitted
trace: [qmp] Add commands to query and control event tracing state
Signed-off-by: Lluís Vilanova <[email protected]> Message-id: [email protected] Signed-off-by: Stefan Hajnoczi <[email protected]>
1 parent 60e17d2 commit 1dde0f4

File tree

5 files changed

+179
-0
lines changed

5 files changed

+179
-0
lines changed

qapi-schema.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
# QAPI event definitions
1212
{ 'include': 'qapi/event.json' }
1313

14+
# Tracing commands
15+
{ 'include': 'qapi/trace.json' }
16+
1417
##
1518
# LostTickPolicy:
1619
#

qapi/trace.json

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# -*- mode: python -*-
2+
#
3+
# Copyright (C) 2011-2014 Lluís Vilanova <[email protected]>
4+
#
5+
# This work is licensed under the terms of the GNU GPL, version 2 or later.
6+
# See the COPYING file in the top-level directory.
7+
8+
9+
##
10+
# @TraceEventState:
11+
#
12+
# State of a tracing event.
13+
#
14+
# @unavailable: The event is statically disabled.
15+
#
16+
# @disabled: The event is dynamically disabled.
17+
#
18+
# @enabled: The event is dynamically enabled.
19+
#
20+
# Since 2.2
21+
##
22+
{ 'enum': 'TraceEventState',
23+
'data': ['unavailable', 'disabled', 'enabled'] }
24+
25+
##
26+
# @TraceEventInfo:
27+
#
28+
# Information of a tracing event.
29+
#
30+
# @name: Event name.
31+
# @state: Tracing state.
32+
#
33+
# Since 2.2
34+
##
35+
{ 'type': 'TraceEventInfo',
36+
'data': {'name': 'str', 'state': 'TraceEventState'} }
37+
38+
##
39+
# @trace-event-get-state:
40+
#
41+
# Query the state of events.
42+
#
43+
# @name: Event name pattern (case-sensitive glob).
44+
#
45+
# Returns: a list of @TraceEventInfo for the matching events
46+
#
47+
# Since 2.2
48+
##
49+
{ 'command': 'trace-event-get-state',
50+
'data': {'name': 'str'},
51+
'returns': ['TraceEventInfo'] }
52+
53+
##
54+
# @trace-event-set-state:
55+
#
56+
# Set the dynamic tracing state of events.
57+
#
58+
# @name: Event name pattern (case-sensitive glob).
59+
# @enable: Whether to enable tracing.
60+
# @ignore-unavailable: #optional Do not match unavailable events with @name.
61+
#
62+
# Since 2.2
63+
##
64+
{ 'command': 'trace-event-set-state',
65+
'data': {'name': 'str', 'enable': 'bool', '*ignore-unavailable': 'bool'} }

qmp-commands.hx

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3752,5 +3752,40 @@ Example:
37523752
37533753
-> { "execute": "rtc-reset-reinjection" }
37543754
<- { "return": {} }
3755+
EQMP
3756+
3757+
{
3758+
.name = "trace-event-get-state",
3759+
.args_type = "name:s",
3760+
.mhandler.cmd_new = qmp_marshal_input_trace_event_get_state,
3761+
},
3762+
3763+
SQMP
3764+
trace-event-get-state
3765+
---------------------
3766+
3767+
Query the state of events.
3768+
3769+
Example:
3770+
3771+
-> { "execute": "trace-event-get-state", "arguments": { "name": "qemu_memalign" } }
3772+
<- { "return": [ { "name": "qemu_memalign", "state": "disabled" } ] }
3773+
EQMP
3774+
3775+
{
3776+
.name = "trace-event-set-state",
3777+
.args_type = "name:s,enable:b,ignore-unavailable:b?",
3778+
.mhandler.cmd_new = qmp_marshal_input_trace_event_set_state,
3779+
},
37553780

3781+
SQMP
3782+
trace-event-set-state
3783+
---------------------
3784+
3785+
Set the state of events.
3786+
3787+
Example:
3788+
3789+
-> { "execute": "trace-event-set-state", "arguments": { "name": "qemu_memalign", "enable": "true" } }
3790+
<- { "return": {} }
37563791
EQMP

trace/Makefile.objs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,3 +144,4 @@ util-obj-$(CONFIG_TRACE_SIMPLE) += simple.o generated-tracers.o
144144
util-obj-$(CONFIG_TRACE_FTRACE) += ftrace.o
145145
util-obj-$(CONFIG_TRACE_UST) += generated-ust.o
146146
util-obj-y += control.o
147+
util-obj-y += qmp.o

trace/qmp.c

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/*
2+
* QMP commands for tracing events.
3+
*
4+
* Copyright (C) 2014 Lluís Vilanova <[email protected]>
5+
*
6+
* This work is licensed under the terms of the GNU GPL, version 2 or later.
7+
* See the COPYING file in the top-level directory.
8+
*/
9+
10+
#include "qemu/typedefs.h"
11+
#include "qmp-commands.h"
12+
#include "trace/control.h"
13+
14+
15+
TraceEventInfoList *qmp_trace_event_get_state(const char *name, Error **errp)
16+
{
17+
TraceEventInfoList *events = NULL;
18+
bool found = false;
19+
TraceEvent *ev;
20+
21+
ev = NULL;
22+
while ((ev = trace_event_pattern(name, ev)) != NULL) {
23+
TraceEventInfoList *elem = g_new(TraceEventInfoList, 1);
24+
elem->value = g_new(TraceEventInfo, 1);
25+
elem->value->name = g_strdup(trace_event_get_name(ev));
26+
if (!trace_event_get_state_static(ev)) {
27+
elem->value->state = TRACE_EVENT_STATE_UNAVAILABLE;
28+
} else if (!trace_event_get_state_dynamic(ev)) {
29+
elem->value->state = TRACE_EVENT_STATE_DISABLED;
30+
} else {
31+
elem->value->state = TRACE_EVENT_STATE_ENABLED;
32+
}
33+
elem->next = events;
34+
events = elem;
35+
found = true;
36+
}
37+
38+
if (!found && !trace_event_is_pattern(name)) {
39+
error_setg(errp, "unknown event \"%s\"", name);
40+
}
41+
42+
return events;
43+
}
44+
45+
void qmp_trace_event_set_state(const char *name, bool enable,
46+
bool has_ignore_unavailable,
47+
bool ignore_unavailable, Error **errp)
48+
{
49+
bool found = false;
50+
TraceEvent *ev;
51+
52+
/* Check all selected events are dynamic */
53+
ev = NULL;
54+
while ((ev = trace_event_pattern(name, ev)) != NULL) {
55+
found = true;
56+
if (!(has_ignore_unavailable && ignore_unavailable) &&
57+
!trace_event_get_state_static(ev)) {
58+
error_setg(errp, "cannot set dynamic tracing state for \"%s\"",
59+
trace_event_get_name(ev));
60+
return;
61+
}
62+
}
63+
if (!found && !trace_event_is_pattern(name)) {
64+
error_setg(errp, "unknown event \"%s\"", name);
65+
return;
66+
}
67+
68+
/* Apply changes */
69+
ev = NULL;
70+
while ((ev = trace_event_pattern(name, ev)) != NULL) {
71+
if (trace_event_get_state_static(ev)) {
72+
trace_event_set_state_dynamic(ev, enable);
73+
}
74+
}
75+
}

0 commit comments

Comments
 (0)