[PATCH v4 1/2] dynamic_debug: add wildcard support to filter files/functions/modules

2013-10-30 Thread Du, Changbin
From: "Du, Changbin" 

This patch add wildcard '*'(matches zero or more characters) and '?'
(matches one character) support when qurying debug flags.

Now we can open debug messages using keywords. eg:
1. open debug logs in all usb drivers
echo "file drivers/usb/* +p" > /dynamic_debug/control
2.  open debug logs for usb xhci code
echo "file *xhci* +p" > /dynamic_debug/control

Signed-off-by: Du, Changbin 
---
 lib/dynamic_debug.c | 54 -
 1 file changed, 49 insertions(+), 5 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index c37aeac..b953780 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -8,6 +8,7 @@
  * By Greg Banks 
  * Copyright (c) 2008 Silicon Graphics Inc.  All Rights Reserved.
  * Copyright (C) 2011 Bart Van Assche.  All Rights Reserved.
+ * Copyright (C) 2013 Du, Changbin 
  */
 
 #define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
@@ -127,6 +128,46 @@ static void vpr_info_dq(const struct ddebug_query *query, 
const char *msg)
 query->first_lineno, query->last_lineno);
 }
 
+/* check if the string matches given pattern which includes wildcards */
+static bool match_pattern(const char *pattern, const char *string)
+{
+   const char *s = string;
+   const char *p = pattern;
+   bool star = false;
+
+   while (*s) {
+   switch (*p) {
+   case '?':
+   s++;
+   p++;
+   break;
+   case '*':
+   star = true;
+   string = s;
+   if (!*++p)
+   return true;
+   pattern = p;
+   break;
+   default:
+   if (*s == *p) {
+   s++;
+   p++;
+   } else {
+   if (!star)
+   return false;
+   string++;
+   s = string;
+   p = pattern;
+   }
+   break;
+   }
+   }
+
+   if (*p == '*')
+   ++p;
+   return !*p;
+}
+
 /*
  * Search the tables for _ddebug's which match the given `query' and
  * apply the `flags' and `mask' to them.  Returns number of matching
@@ -147,7 +188,8 @@ static int ddebug_change(const struct ddebug_query *query,
list_for_each_entry(dt, _tables, link) {
 
/* match against the module name */
-   if (query->module && strcmp(query->module, dt->mod_name))
+   if (query->module &&
+   !match_pattern(query->module, dt->mod_name))
continue;
 
for (i = 0; i < dt->num_ddebugs; i++) {
@@ -155,14 +197,16 @@ static int ddebug_change(const struct ddebug_query *query,
 
/* match against the source filename */
if (query->filename &&
-   strcmp(query->filename, dp->filename) &&
-   strcmp(query->filename, kbasename(dp->filename)) &&
-   strcmp(query->filename, trim_prefix(dp->filename)))
+   !match_pattern(query->filename, dp->filename) &&
+   !match_pattern(query->filename,
+  kbasename(dp->filename)) &&
+   !match_pattern(query->filename,
+  trim_prefix(dp->filename)))
continue;
 
/* match against the function */
if (query->function &&
-   strcmp(query->function, dp->function))
+   !match_pattern(query->function, dp->function))
continue;
 
/* match against the format */
-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v4 1/2] dynamic_debug: add wildcard support to filter files/functions/modules

2013-10-30 Thread Du, Changbin
From: Du, Changbin changbin...@gmail.com

This patch add wildcard '*'(matches zero or more characters) and '?'
(matches one character) support when qurying debug flags.

Now we can open debug messages using keywords. eg:
1. open debug logs in all usb drivers
echo file drivers/usb/* +p  debugfs/dynamic_debug/control
2.  open debug logs for usb xhci code
echo file *xhci* +p  debugfs/dynamic_debug/control

Signed-off-by: Du, Changbin changbin...@gmail.com
---
 lib/dynamic_debug.c | 54 -
 1 file changed, 49 insertions(+), 5 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index c37aeac..b953780 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -8,6 +8,7 @@
  * By Greg Banks g...@melbourne.sgi.com
  * Copyright (c) 2008 Silicon Graphics Inc.  All Rights Reserved.
  * Copyright (C) 2011 Bart Van Assche.  All Rights Reserved.
+ * Copyright (C) 2013 Du, Changbin changbin...@gmail.com
  */
 
 #define pr_fmt(fmt) KBUILD_MODNAME :%s:  fmt, __func__
@@ -127,6 +128,46 @@ static void vpr_info_dq(const struct ddebug_query *query, 
const char *msg)
 query-first_lineno, query-last_lineno);
 }
 
+/* check if the string matches given pattern which includes wildcards */
+static bool match_pattern(const char *pattern, const char *string)
+{
+   const char *s = string;
+   const char *p = pattern;
+   bool star = false;
+
+   while (*s) {
+   switch (*p) {
+   case '?':
+   s++;
+   p++;
+   break;
+   case '*':
+   star = true;
+   string = s;
+   if (!*++p)
+   return true;
+   pattern = p;
+   break;
+   default:
+   if (*s == *p) {
+   s++;
+   p++;
+   } else {
+   if (!star)
+   return false;
+   string++;
+   s = string;
+   p = pattern;
+   }
+   break;
+   }
+   }
+
+   if (*p == '*')
+   ++p;
+   return !*p;
+}
+
 /*
  * Search the tables for _ddebug's which match the given `query' and
  * apply the `flags' and `mask' to them.  Returns number of matching
@@ -147,7 +188,8 @@ static int ddebug_change(const struct ddebug_query *query,
list_for_each_entry(dt, ddebug_tables, link) {
 
/* match against the module name */
-   if (query-module  strcmp(query-module, dt-mod_name))
+   if (query-module 
+   !match_pattern(query-module, dt-mod_name))
continue;
 
for (i = 0; i  dt-num_ddebugs; i++) {
@@ -155,14 +197,16 @@ static int ddebug_change(const struct ddebug_query *query,
 
/* match against the source filename */
if (query-filename 
-   strcmp(query-filename, dp-filename) 
-   strcmp(query-filename, kbasename(dp-filename)) 
-   strcmp(query-filename, trim_prefix(dp-filename)))
+   !match_pattern(query-filename, dp-filename) 
+   !match_pattern(query-filename,
+  kbasename(dp-filename)) 
+   !match_pattern(query-filename,
+  trim_prefix(dp-filename)))
continue;
 
/* match against the function */
if (query-function 
-   strcmp(query-function, dp-function))
+   !match_pattern(query-function, dp-function))
continue;
 
/* match against the format */
-- 
1.8.1.2

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/