qmp.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /*
  2. * QMP commands for tracing events.
  3. *
  4. * Copyright (C) 2014 Lluís Vilanova <vilanova@ac.upc.edu>
  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. #include "qemu/typedefs.h"
  10. #include "qmp-commands.h"
  11. #include "trace/control.h"
  12. TraceEventInfoList *qmp_trace_event_get_state(const char *name, Error **errp)
  13. {
  14. TraceEventInfoList *events = NULL;
  15. bool found = false;
  16. TraceEvent *ev;
  17. ev = NULL;
  18. while ((ev = trace_event_pattern(name, ev)) != NULL) {
  19. TraceEventInfoList *elem = g_new(TraceEventInfoList, 1);
  20. elem->value = g_new(TraceEventInfo, 1);
  21. elem->value->name = g_strdup(trace_event_get_name(ev));
  22. if (!trace_event_get_state_static(ev)) {
  23. elem->value->state = TRACE_EVENT_STATE_UNAVAILABLE;
  24. } else if (!trace_event_get_state_dynamic(ev)) {
  25. elem->value->state = TRACE_EVENT_STATE_DISABLED;
  26. } else {
  27. elem->value->state = TRACE_EVENT_STATE_ENABLED;
  28. }
  29. elem->next = events;
  30. events = elem;
  31. found = true;
  32. }
  33. if (!found && !trace_event_is_pattern(name)) {
  34. error_setg(errp, "unknown event \"%s\"", name);
  35. }
  36. return events;
  37. }
  38. void qmp_trace_event_set_state(const char *name, bool enable,
  39. bool has_ignore_unavailable,
  40. bool ignore_unavailable, Error **errp)
  41. {
  42. bool found = false;
  43. TraceEvent *ev;
  44. /* Check all selected events are dynamic */
  45. ev = NULL;
  46. while ((ev = trace_event_pattern(name, ev)) != NULL) {
  47. found = true;
  48. if (!(has_ignore_unavailable && ignore_unavailable) &&
  49. !trace_event_get_state_static(ev)) {
  50. error_setg(errp, "cannot set dynamic tracing state for \"%s\"",
  51. trace_event_get_name(ev));
  52. return;
  53. }
  54. }
  55. if (!found && !trace_event_is_pattern(name)) {
  56. error_setg(errp, "unknown event \"%s\"", name);
  57. return;
  58. }
  59. /* Apply changes */
  60. ev = NULL;
  61. while ((ev = trace_event_pattern(name, ev)) != NULL) {
  62. if (trace_event_get_state_static(ev)) {
  63. trace_event_set_state_dynamic(ev, enable);
  64. }
  65. }
  66. }