diff mbox

Add wildcard trace event support

Message ID 1319103503-12634-1-git-send-email-wudxw@linux.vnet.ibm.com
State New
Headers show

Commit Message

Mark Wu Oct. 20, 2011, 9:38 a.m. UTC
A basic wildcard matching is supported in both the monitor command
"trace-event" and the events list file. That means you can enable/disable the
events having a common prefix in a batch. For example, virtio-blk trace events
could be enabled using:
    trace-event virtio_blk_* on

Signed-off-by: Mark Wu <wudxw@linux.vnet.ibm.com>
---
 docs/tracing.txt |    9 ++++++++-
 trace/simple.c   |   19 +++++++++++++++++--
 trace/stderr.c   |   17 ++++++++++++++++-
 3 files changed, 41 insertions(+), 4 deletions(-)

Comments

Mars.Cao Oct. 21, 2011, 1:37 a.m. UTC | #1
On 10/20/2011 05:38 PM, Mark Wu wrote:
> A basic wildcard matching is supported in both the monitor command
> "trace-event" and the events list file. That means you can enable/disable the
> events having a common prefix in a batch. For example, virtio-blk trace events
> could be enabled using:
>      trace-event virtio_blk_* on
>
> Signed-off-by: Mark Wu<wudxw@linux.vnet.ibm.com>
> ---
>   docs/tracing.txt |    9 ++++++++-
>   trace/simple.c   |   19 +++++++++++++++++--
>   trace/stderr.c   |   17 ++++++++++++++++-
>   3 files changed, 41 insertions(+), 4 deletions(-)
>
> diff --git a/docs/tracing.txt b/docs/tracing.txt
> index 95ca16c..ea29f2c 100644
> --- a/docs/tracing.txt
> +++ b/docs/tracing.txt
> @@ -132,12 +132,19 @@ This functionality is also provided through monitor commands:
>     means disabled.
>
>   * trace-event NAME on|off
> -  Enable/disable a given trace event.
> +  Enable/disable a given trace event or a group of events having common prefix
> +  through wildcard.
>
>   The "-trace events=<file>" command line argument can be used to enable the
>   events listed in<file>  from the very beginning of the program. This file must
>   contain one event name per line.
>
> +A basic wildcard matching is supported in both the monitor command "trace
> +-event" and the events list file. That means you can enable/disable the events
> +having a common prefix in a batch. For example, virtio-blk trace events could
> +be enabled using:
> +  trace-event virtio_blk_* on
> +
>   == Trace backends ==
>
>   The "tracetool" script automates tedious trace event code generation and also
> diff --git a/trace/simple.c b/trace/simple.c
> index b639dda..869e315 100644
> --- a/trace/simple.c
> +++ b/trace/simple.c
> @@ -324,14 +324,29 @@ void trace_print_events(FILE *stream, fprintf_function stream_printf)
>   bool trace_event_set_state(const char *name, bool state)
>   {
>       unsigned int i;
> -
> +    unsigned int len;
> +    bool wildcard = false;
> +    bool matched = false;
> +
> +    len = strlen(name);
> +    if (name[len-1] == '*') {
> +        wildcard = true;
> +        len -= 1;
> +    }
>       for (i = 0; i<  NR_TRACE_EVENTS; i++) {
> +        if (wildcard) {
> +            if (!strncmp(trace_list[i].tp_name, name, len)) {
> +                trace_list[i].state = state;
> +                matched = true;
> +            }
> +            continue;
> +        }
>           if (!strcmp(trace_list[i].tp_name, name)) {
>               trace_list[i].state = state;
>               return true;
>           }
>       }
> -    return false;
> +    return matched;
>   }
>
>   /* Helper function to create a thread with signals blocked.  Use glib's
> diff --git a/trace/stderr.c b/trace/stderr.c
> index 7107c4a..6a12977 100644
> --- a/trace/stderr.c
> +++ b/trace/stderr.c
> @@ -15,14 +15,29 @@ void trace_print_events(FILE *stream, fprintf_function stream_printf)
>   bool trace_event_set_state(const char *name, bool state)
>   {
>       unsigned int i;
> +    unsigned int len;
> +    bool wildcard = false;
> +    bool matched = false;
>
> +    len = strlen(name);
> +    if (name[len-1] == '*') {
> +        wildcard = true;
> +        len -= 1;
> +    }
>       for (i = 0; i<  NR_TRACE_EVENTS; i++) {
> +        if (wildcard) {
> +            if (!strncmp(trace_list[i].tp_name, name, len)) {
> +                trace_list[i].state = state;
> +                matched = true;
> +            }
> +            continue;
> +        }
>           if (!strcmp(trace_list[i].tp_name, name)) {
>               trace_list[i].state = state;
>               return true;
>           }
>       }
> -    return false;
> +    return matched;
>   }
>
>   bool trace_backend_init(const char *events, const char *file)
I do think this idea of using wildcard (from Stefanha) is smarter than 
trace groups.
I did not find anything wrong with the code although it does not support 
events with wildcard like "virtio_*_init".

Reviewed-by: Cao,Bing Bu <mars@linux.vnet.ibm.com>
Tested-by:   Cao,Bing Bu <mars@linux.vnet.ibm.com>
Stefan Hajnoczi Oct. 28, 2011, 9:47 a.m. UTC | #2
On Thu, Oct 20, 2011 at 10:38 AM, Mark Wu <wudxw@linux.vnet.ibm.com> wrote:
>  The "tracetool" script automates tedious trace event code generation and also
> diff --git a/trace/simple.c b/trace/simple.c
> index b639dda..869e315 100644
> --- a/trace/simple.c
> +++ b/trace/simple.c
> @@ -324,14 +324,29 @@ void trace_print_events(FILE *stream, fprintf_function stream_printf)
>  bool trace_event_set_state(const char *name, bool state)
>  {
>     unsigned int i;
> -
> +    unsigned int len;
> +    bool wildcard = false;
> +    bool matched = false;
> +
> +    len = strlen(name);
> +    if (name[len-1] == '*') {

I think it's worth making a small change:

if (len > 0 && name[len - 1] == '*') {

Normally strlen(name) > 0 but just in case we should prevent accessing name[-1].

Seems fine otherwise.  Perhaps we can figure out how to share code
between simple.c and stderr.c in the future.

Stefan
diff mbox

Patch

diff --git a/docs/tracing.txt b/docs/tracing.txt
index 95ca16c..ea29f2c 100644
--- a/docs/tracing.txt
+++ b/docs/tracing.txt
@@ -132,12 +132,19 @@  This functionality is also provided through monitor commands:
   means disabled.
 
 * trace-event NAME on|off
-  Enable/disable a given trace event.
+  Enable/disable a given trace event or a group of events having common prefix
+  through wildcard.
 
 The "-trace events=<file>" command line argument can be used to enable the
 events listed in <file> from the very beginning of the program. This file must
 contain one event name per line.
 
+A basic wildcard matching is supported in both the monitor command "trace
+-event" and the events list file. That means you can enable/disable the events
+having a common prefix in a batch. For example, virtio-blk trace events could
+be enabled using:
+  trace-event virtio_blk_* on
+
 == Trace backends ==
 
 The "tracetool" script automates tedious trace event code generation and also
diff --git a/trace/simple.c b/trace/simple.c
index b639dda..869e315 100644
--- a/trace/simple.c
+++ b/trace/simple.c
@@ -324,14 +324,29 @@  void trace_print_events(FILE *stream, fprintf_function stream_printf)
 bool trace_event_set_state(const char *name, bool state)
 {
     unsigned int i;
-
+    unsigned int len;
+    bool wildcard = false;
+    bool matched = false;
+
+    len = strlen(name);
+    if (name[len-1] == '*') {
+        wildcard = true;
+        len -= 1;
+    }
     for (i = 0; i < NR_TRACE_EVENTS; i++) {
+        if (wildcard) {
+            if (!strncmp(trace_list[i].tp_name, name, len)) {
+                trace_list[i].state = state;
+                matched = true;
+            }
+            continue;
+        }
         if (!strcmp(trace_list[i].tp_name, name)) {
             trace_list[i].state = state;
             return true;
         }
     }
-    return false;
+    return matched;
 }
 
 /* Helper function to create a thread with signals blocked.  Use glib's
diff --git a/trace/stderr.c b/trace/stderr.c
index 7107c4a..6a12977 100644
--- a/trace/stderr.c
+++ b/trace/stderr.c
@@ -15,14 +15,29 @@  void trace_print_events(FILE *stream, fprintf_function stream_printf)
 bool trace_event_set_state(const char *name, bool state)
 {
     unsigned int i;
+    unsigned int len;
+    bool wildcard = false;
+    bool matched = false;
 
+    len = strlen(name);
+    if (name[len-1] == '*') {
+        wildcard = true;
+        len -= 1;
+    }
     for (i = 0; i < NR_TRACE_EVENTS; i++) {
+        if (wildcard) {
+            if (!strncmp(trace_list[i].tp_name, name, len)) {
+                trace_list[i].state = state;
+                matched = true;
+            }
+            continue;
+        }
         if (!strcmp(trace_list[i].tp_name, name)) {
             trace_list[i].state = state;
             return true;
         }
     }
-    return false;
+    return matched;
 }
 
 bool trace_backend_init(const char *events, const char *file)