1e4858974SLluís /* 2e4858974SLluís * Interface for configuring and controlling the state of tracing events. 3e4858974SLluís * 43d211d9fSLluís Vilanova * Copyright (C) 2011-2016 Lluís Vilanova <vilanova@ac.upc.edu> 5e4858974SLluís * 6b1bae816SLluís Vilanova * This work is licensed under the terms of the GNU GPL, version 2 or later. 7b1bae816SLluís Vilanova * See the COPYING file in the top-level directory. 8e4858974SLluís */ 9e4858974SLluís 10b1bae816SLluís Vilanova #ifndef TRACE__CONTROL_H 11b1bae816SLluís Vilanova #define TRACE__CONTROL_H 12e4858974SLluís 1334770187SDaniel P. Berrange #include "event-internal.h" 14fc764105SLluís 156a1b0f3aSDaniel P. Berrange typedef struct TraceEventIter { 16c5cc58b1SGerd Hoffmann /* iter state */ 176a1b0f3aSDaniel P. Berrange size_t event; 18fe4db84dSDaniel P. Berrange size_t group; 19c5cc58b1SGerd Hoffmann /* filter conditions */ 20c5cc58b1SGerd Hoffmann size_t group_id; 216a1b0f3aSDaniel P. Berrange const char *pattern; 226a1b0f3aSDaniel P. Berrange } TraceEventIter; 23fc764105SLluís 246a1b0f3aSDaniel P. Berrange 256a1b0f3aSDaniel P. Berrange /** 26117856c3SGerd Hoffmann * trace_event_iter_init_all: 276a1b0f3aSDaniel P. Berrange * @iter: the event iterator struct 286a1b0f3aSDaniel P. Berrange * 296a1b0f3aSDaniel P. Berrange * Initialize the event iterator struct @iter, 30117856c3SGerd Hoffmann * for all events. 31117856c3SGerd Hoffmann */ 32117856c3SGerd Hoffmann void trace_event_iter_init_all(TraceEventIter *iter); 33117856c3SGerd Hoffmann 34117856c3SGerd Hoffmann /** 35117856c3SGerd Hoffmann * trace_event_iter_init_pattern: 36117856c3SGerd Hoffmann * @iter: the event iterator struct 37117856c3SGerd Hoffmann * @pattern: pattern to filter events on name 38117856c3SGerd Hoffmann * 39117856c3SGerd Hoffmann * Initialize the event iterator struct @iter, 40117856c3SGerd Hoffmann * using @pattern to filter out events 416a1b0f3aSDaniel P. Berrange * with non-matching names. 426a1b0f3aSDaniel P. Berrange */ 43117856c3SGerd Hoffmann void trace_event_iter_init_pattern(TraceEventIter *iter, const char *pattern); 446a1b0f3aSDaniel P. Berrange 456a1b0f3aSDaniel P. Berrange /** 46c5cc58b1SGerd Hoffmann * trace_event_iter_init_group: 47c5cc58b1SGerd Hoffmann * @iter: the event iterator struct 48c5cc58b1SGerd Hoffmann * @group_id: group_id to filter events by group. 49c5cc58b1SGerd Hoffmann * 50c5cc58b1SGerd Hoffmann * Initialize the event iterator struct @iter, 51c5cc58b1SGerd Hoffmann * using @group_id to filter for events in the group. 52c5cc58b1SGerd Hoffmann */ 53c5cc58b1SGerd Hoffmann void trace_event_iter_init_group(TraceEventIter *iter, size_t group_id); 54c5cc58b1SGerd Hoffmann 55c5cc58b1SGerd Hoffmann /** 566a1b0f3aSDaniel P. Berrange * trace_event_iter_next: 576a1b0f3aSDaniel P. Berrange * @iter: the event iterator struct 586a1b0f3aSDaniel P. Berrange * 596a1b0f3aSDaniel P. Berrange * Get the next event, if any. When this returns NULL, 606a1b0f3aSDaniel P. Berrange * the iterator should no longer be used. 616a1b0f3aSDaniel P. Berrange * 626a1b0f3aSDaniel P. Berrange * Returns: the next event, or NULL if no more events exist 636a1b0f3aSDaniel P. Berrange */ 646a1b0f3aSDaniel P. Berrange TraceEvent *trace_event_iter_next(TraceEventIter *iter); 656a1b0f3aSDaniel P. Berrange 66b1bae816SLluís Vilanova 67b1bae816SLluís Vilanova /** 68b1bae816SLluís Vilanova * trace_event_name: 69b1bae816SLluís Vilanova * @id: Event name. 70b1bae816SLluís Vilanova * 71b1bae816SLluís Vilanova * Search an event by its name. 72b1bae816SLluís Vilanova * 73b1bae816SLluís Vilanova * Returns: pointer to #TraceEvent or NULL if not found. 74b1bae816SLluís Vilanova */ 75b1bae816SLluís Vilanova TraceEvent *trace_event_name(const char *name); 76b1bae816SLluís Vilanova 77b1bae816SLluís Vilanova /** 78b1bae816SLluís Vilanova * trace_event_is_pattern: 79b1bae816SLluís Vilanova * 80b1bae816SLluís Vilanova * Whether the given string is an event name pattern. 81b1bae816SLluís Vilanova */ 82b1bae816SLluís Vilanova static bool trace_event_is_pattern(const char *str); 83b1bae816SLluís Vilanova 84b1bae816SLluís Vilanova 85b1bae816SLluís Vilanova /** 86b1bae816SLluís Vilanova * trace_event_get_id: 87b1bae816SLluís Vilanova * 88b1bae816SLluís Vilanova * Get the identifier of an event. 89b1bae816SLluís Vilanova */ 90ef4c9fc8SDaniel P. Berrange static uint32_t trace_event_get_id(TraceEvent *ev); 91b1bae816SLluís Vilanova 92b1bae816SLluís Vilanova /** 93b1bae816SLluís Vilanova * trace_event_get_name: 94b1bae816SLluís Vilanova * 95b1bae816SLluís Vilanova * Get the name of an event. 96b1bae816SLluís Vilanova */ 97b1bae816SLluís Vilanova static const char * trace_event_get_name(TraceEvent *ev); 98b1bae816SLluís Vilanova 99b1bae816SLluís Vilanova /** 100b1bae816SLluís Vilanova * trace_event_get_state: 101ef4c9fc8SDaniel P. Berrange * @id: Event identifier name. 102b1bae816SLluís Vilanova * 103d87aa138SStefan Hajnoczi * Get the tracing state of an event, both static and the QEMU dynamic state. 104b1bae816SLluís Vilanova * 105b1bae816SLluís Vilanova * If the event has the disabled property, the check will have no performance 106b1bae816SLluís Vilanova * impact. 107b1bae816SLluís Vilanova */ 108b1bae816SLluís Vilanova #define trace_event_get_state(id) \ 109585ec727SPaolo Bonzini ((id ##_ENABLED) && trace_event_get_state_dynamic_by_id(id)) 110b1bae816SLluís Vilanova 111b1bae816SLluís Vilanova /** 112d87aa138SStefan Hajnoczi * trace_event_get_state_backends: 113d87aa138SStefan Hajnoczi * @id: Event identifier name. 114d87aa138SStefan Hajnoczi * 115d87aa138SStefan Hajnoczi * Get the tracing state of an event, both static and dynamic state from all 116d87aa138SStefan Hajnoczi * compiled-in backends. 117d87aa138SStefan Hajnoczi * 118d87aa138SStefan Hajnoczi * If the event has the disabled property, the check will have no performance 119d87aa138SStefan Hajnoczi * impact. 120d87aa138SStefan Hajnoczi * 121d87aa138SStefan Hajnoczi * Returns: true if at least one backend has the event enabled and the event 122d87aa138SStefan Hajnoczi * does not have the disabled property. 123d87aa138SStefan Hajnoczi */ 124d87aa138SStefan Hajnoczi #define trace_event_get_state_backends(id) \ 125d87aa138SStefan Hajnoczi ((id ##_ENABLED) && id ##_BACKEND_DSTATE()) 126d87aa138SStefan Hajnoczi 127d87aa138SStefan Hajnoczi /** 128b1bae816SLluís Vilanova * trace_event_get_state_static: 129b1bae816SLluís Vilanova * @id: Event identifier. 130b1bae816SLluís Vilanova * 131b1bae816SLluís Vilanova * Get the static tracing state of an event. 132b1bae816SLluís Vilanova * 133b1bae816SLluís Vilanova * Use the define 'TRACE_${EVENT_NAME}_ENABLED' for compile-time checks (it will 134b1bae816SLluís Vilanova * be set to 1 or 0 according to the presence of the disabled property). 135b1bae816SLluís Vilanova */ 136b1bae816SLluís Vilanova static bool trace_event_get_state_static(TraceEvent *ev); 137b1bae816SLluís Vilanova 138b1bae816SLluís Vilanova /** 139b1bae816SLluís Vilanova * trace_event_get_state_dynamic: 140b1bae816SLluís Vilanova * 141b1bae816SLluís Vilanova * Get the dynamic tracing state of an event. 14248151859SLluís Vilanova * 14348151859SLluís Vilanova * If the event has the 'vcpu' property, gets the OR'ed state of all vCPUs. 144b1bae816SLluís Vilanova */ 145b1bae816SLluís Vilanova static bool trace_event_get_state_dynamic(TraceEvent *ev); 146b1bae816SLluís Vilanova 147b1bae816SLluís Vilanova /** 148b1bae816SLluís Vilanova * trace_event_set_state_dynamic: 149b1bae816SLluís Vilanova * 150b1bae816SLluís Vilanova * Set the dynamic tracing state of an event. 151b1bae816SLluís Vilanova * 15248151859SLluís Vilanova * If the event has the 'vcpu' property, sets the state on all vCPUs. 15348151859SLluís Vilanova * 154b1bae816SLluís Vilanova * Pre-condition: trace_event_get_state_static(ev) == true 155b1bae816SLluís Vilanova */ 15648151859SLluís Vilanova void trace_event_set_state_dynamic(TraceEvent *ev, bool state); 15748151859SLluís Vilanova 15848151859SLluís Vilanova /** 1595b808275SLluís Vilanova * trace_init_backends: 160b1bae816SLluís Vilanova * 161b1bae816SLluís Vilanova * Initialize the tracing backend. 162b1bae816SLluís Vilanova * 1635b808275SLluís Vilanova * Returns: Whether the backends could be successfully initialized. 164e4858974SLluís */ 16541fc57e4SPaolo Bonzini bool trace_init_backends(void); 16645bd0b41SPaolo Bonzini 16745bd0b41SPaolo Bonzini /** 16841fc57e4SPaolo Bonzini * trace_init_file: 16941fc57e4SPaolo Bonzini * 17041fc57e4SPaolo Bonzini * Record the name of the output file for the tracing backend. 17141fc57e4SPaolo Bonzini * Exits if no selected backend does not support specifying the 17292eecfffSPaolo Bonzini * output file, and a file was specified with "-trace file=...". 17341fc57e4SPaolo Bonzini */ 17492eecfffSPaolo Bonzini void trace_init_file(void); 17541fc57e4SPaolo Bonzini 17610578a25SPaolo Bonzini /** 177e9527dd3SPaolo Bonzini * trace_list_events: 1786745c8a0SDoug Evans * @f: Where to send output. 179e9527dd3SPaolo Bonzini * 180e9527dd3SPaolo Bonzini * List all available events. 181e9527dd3SPaolo Bonzini */ 1826745c8a0SDoug Evans void trace_list_events(FILE *f); 183e9527dd3SPaolo Bonzini 184e9527dd3SPaolo Bonzini /** 18510578a25SPaolo Bonzini * trace_enable_events: 18610578a25SPaolo Bonzini * @line_buf: A string with a glob pattern of events to be enabled or, 18710578a25SPaolo Bonzini * if the string starts with '-', disabled. 18810578a25SPaolo Bonzini * 18910578a25SPaolo Bonzini * Enable or disable matching events. 19010578a25SPaolo Bonzini */ 19110578a25SPaolo Bonzini void trace_enable_events(const char *line_buf); 19210578a25SPaolo Bonzini 193e9e0bb2aSDenis V. Lunev /** 194e9e0bb2aSDenis V. Lunev * Definition of QEMU options describing trace subsystem configuration 195e9e0bb2aSDenis V. Lunev */ 196e9e0bb2aSDenis V. Lunev extern QemuOptsList qemu_trace_opts; 197e9e0bb2aSDenis V. Lunev 198e9e0bb2aSDenis V. Lunev /** 199e9e0bb2aSDenis V. Lunev * trace_opt_parse: 200*8b7b9c5cSPhilippe Mathieu-Daudé * @optstr: A string argument of --trace command line argument 201e9e0bb2aSDenis V. Lunev * 202e9e0bb2aSDenis V. Lunev * Initialize tracing subsystem. 203e9e0bb2aSDenis V. Lunev */ 204*8b7b9c5cSPhilippe Mathieu-Daudé void trace_opt_parse(const char *optstr); 205b1bae816SLluís Vilanova 206b7d48952SDaniel P. Berrange /** 207b7d48952SDaniel P. Berrange * trace_get_vcpu_event_count: 208b7d48952SDaniel P. Berrange * 209b7d48952SDaniel P. Berrange * Return the number of known vcpu-specific events 210b7d48952SDaniel P. Berrange */ 211b7d48952SDaniel P. Berrange uint32_t trace_get_vcpu_event_count(void); 212b7d48952SDaniel P. Berrange 21348151859SLluís Vilanova 214a3227142SMichael S. Tsirkin #include "control-internal.h" 215b1bae816SLluís Vilanova 216b1bae816SLluís Vilanova #endif /* TRACE__CONTROL_H */ 217