Skip to content

Commit

Permalink
trace: [qmp] Add commands to query and control event tracing state
Browse files Browse the repository at this point in the history
Signed-off-by: Lluís Vilanova <[email protected]>
Message-id: [email protected]
Signed-off-by: Stefan Hajnoczi <[email protected]>
  • Loading branch information
Lluís Vilanova authored and stefanhaRH committed Sep 26, 2014
1 parent 60e17d2 commit 1dde0f4
Show file tree
Hide file tree
Showing 5 changed files with 179 additions and 0 deletions.
3 changes: 3 additions & 0 deletions qapi-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@
# QAPI event definitions
{ 'include': 'qapi/event.json' }

# Tracing commands
{ 'include': 'qapi/trace.json' }

##
# LostTickPolicy:
#
Expand Down
65 changes: 65 additions & 0 deletions qapi/trace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# -*- mode: python -*-
#
# Copyright (C) 2011-2014 Lluís Vilanova <[email protected]>
#
# This work is licensed under the terms of the GNU GPL, version 2 or later.
# See the COPYING file in the top-level directory.


##
# @TraceEventState:
#
# State of a tracing event.
#
# @unavailable: The event is statically disabled.
#
# @disabled: The event is dynamically disabled.
#
# @enabled: The event is dynamically enabled.
#
# Since 2.2
##
{ 'enum': 'TraceEventState',
'data': ['unavailable', 'disabled', 'enabled'] }

##
# @TraceEventInfo:
#
# Information of a tracing event.
#
# @name: Event name.
# @state: Tracing state.
#
# Since 2.2
##
{ 'type': 'TraceEventInfo',
'data': {'name': 'str', 'state': 'TraceEventState'} }

##
# @trace-event-get-state:
#
# Query the state of events.
#
# @name: Event name pattern (case-sensitive glob).
#
# Returns: a list of @TraceEventInfo for the matching events
#
# Since 2.2
##
{ 'command': 'trace-event-get-state',
'data': {'name': 'str'},
'returns': ['TraceEventInfo'] }

##
# @trace-event-set-state:
#
# Set the dynamic tracing state of events.
#
# @name: Event name pattern (case-sensitive glob).
# @enable: Whether to enable tracing.
# @ignore-unavailable: #optional Do not match unavailable events with @name.
#
# Since 2.2
##
{ 'command': 'trace-event-set-state',
'data': {'name': 'str', 'enable': 'bool', '*ignore-unavailable': 'bool'} }
35 changes: 35 additions & 0 deletions qmp-commands.hx
Original file line number Diff line number Diff line change
Expand Up @@ -3752,5 +3752,40 @@ Example:
-> { "execute": "rtc-reset-reinjection" }
<- { "return": {} }
EQMP
{
.name = "trace-event-get-state",
.args_type = "name:s",
.mhandler.cmd_new = qmp_marshal_input_trace_event_get_state,
},

SQMP
trace-event-get-state
---------------------

Query the state of events.

Example:

-> { "execute": "trace-event-get-state", "arguments": { "name": "qemu_memalign" } }
<- { "return": [ { "name": "qemu_memalign", "state": "disabled" } ] }
EQMP

{
.name = "trace-event-set-state",
.args_type = "name:s,enable:b,ignore-unavailable:b?",
.mhandler.cmd_new = qmp_marshal_input_trace_event_set_state,
},

SQMP
trace-event-set-state
---------------------

Set the state of events.

Example:

-> { "execute": "trace-event-set-state", "arguments": { "name": "qemu_memalign", "enable": "true" } }
<- { "return": {} }
EQMP
1 change: 1 addition & 0 deletions trace/Makefile.objs
Original file line number Diff line number Diff line change
Expand Up @@ -144,3 +144,4 @@ util-obj-$(CONFIG_TRACE_SIMPLE) += simple.o generated-tracers.o
util-obj-$(CONFIG_TRACE_FTRACE) += ftrace.o
util-obj-$(CONFIG_TRACE_UST) += generated-ust.o
util-obj-y += control.o
util-obj-y += qmp.o
75 changes: 75 additions & 0 deletions trace/qmp.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/*
* QMP commands for tracing events.
*
* Copyright (C) 2014 Lluís Vilanova <[email protected]>
*
* This work is licensed under the terms of the GNU GPL, version 2 or later.
* See the COPYING file in the top-level directory.
*/

#include "qemu/typedefs.h"
#include "qmp-commands.h"
#include "trace/control.h"


TraceEventInfoList *qmp_trace_event_get_state(const char *name, Error **errp)
{
TraceEventInfoList *events = NULL;
bool found = false;
TraceEvent *ev;

ev = NULL;
while ((ev = trace_event_pattern(name, ev)) != NULL) {
TraceEventInfoList *elem = g_new(TraceEventInfoList, 1);
elem->value = g_new(TraceEventInfo, 1);
elem->value->name = g_strdup(trace_event_get_name(ev));
if (!trace_event_get_state_static(ev)) {
elem->value->state = TRACE_EVENT_STATE_UNAVAILABLE;
} else if (!trace_event_get_state_dynamic(ev)) {
elem->value->state = TRACE_EVENT_STATE_DISABLED;
} else {
elem->value->state = TRACE_EVENT_STATE_ENABLED;
}
elem->next = events;
events = elem;
found = true;
}

if (!found && !trace_event_is_pattern(name)) {
error_setg(errp, "unknown event \"%s\"", name);
}

return events;
}

void qmp_trace_event_set_state(const char *name, bool enable,
bool has_ignore_unavailable,
bool ignore_unavailable, Error **errp)
{
bool found = false;
TraceEvent *ev;

/* Check all selected events are dynamic */
ev = NULL;
while ((ev = trace_event_pattern(name, ev)) != NULL) {
found = true;
if (!(has_ignore_unavailable && ignore_unavailable) &&
!trace_event_get_state_static(ev)) {
error_setg(errp, "cannot set dynamic tracing state for \"%s\"",
trace_event_get_name(ev));
return;
}
}
if (!found && !trace_event_is_pattern(name)) {
error_setg(errp, "unknown event \"%s\"", name);
return;
}

/* Apply changes */
ev = NULL;
while ((ev = trace_event_pattern(name, ev)) != NULL) {
if (trace_event_get_state_static(ev)) {
trace_event_set_state_dynamic(ev, enable);
}
}
}

0 comments on commit 1dde0f4

Please sign in to comment.