diff options
| -rw-r--r-- | Documentation/dynamic-debug-howto.txt | 20 | ||||
| -rw-r--r-- | lib/dynamic_debug.c | 53 |
2 files changed, 47 insertions, 26 deletions
diff --git a/Documentation/dynamic-debug-howto.txt b/Documentation/dynamic-debug-howto.txt index 68394825e86b..674c5663d346 100644 --- a/Documentation/dynamic-debug-howto.txt +++ b/Documentation/dynamic-debug-howto.txt | |||
| @@ -49,10 +49,10 @@ via: | |||
| 49 | 49 | ||
| 50 | nullarbor:~ # cat <debugfs>/dynamic_debug/control | 50 | nullarbor:~ # cat <debugfs>/dynamic_debug/control |
| 51 | # filename:lineno [module]function flags format | 51 | # filename:lineno [module]function flags format |
| 52 | /usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:323 [svcxprt_rdma]svc_rdma_cleanup - "SVCRDMA\040Module\040Removed,\040deregister\040RPC\040RDMA\040transport\012" | 52 | /usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:323 [svcxprt_rdma]svc_rdma_cleanup - "SVCRDMA Module Removed, deregister RPC RDMA transport\012" |
| 53 | /usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:341 [svcxprt_rdma]svc_rdma_init - "\011max_inline\040\040\040\040\040\040\040:\040%d\012" | 53 | /usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:341 [svcxprt_rdma]svc_rdma_init - "\011max_inline : %d\012" |
| 54 | /usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:340 [svcxprt_rdma]svc_rdma_init - "\011sq_depth\040\040\040\040\040\040\040\040\040:\040%d\012" | 54 | /usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:340 [svcxprt_rdma]svc_rdma_init - "\011sq_depth : %d\012" |
| 55 | /usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:338 [svcxprt_rdma]svc_rdma_init - "\011max_requests\040\040\040\040\040:\040%d\012" | 55 | /usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svc_rdma.c:338 [svcxprt_rdma]svc_rdma_init - "\011max_requests : %d\012" |
| 56 | ... | 56 | ... |
| 57 | 57 | ||
| 58 | 58 | ||
| @@ -72,7 +72,7 @@ you can view all the debug statement callsites with any non-default flags: | |||
| 72 | 72 | ||
| 73 | nullarbor:~ # awk '$3 != "-"' <debugfs>/dynamic_debug/control | 73 | nullarbor:~ # awk '$3 != "-"' <debugfs>/dynamic_debug/control |
| 74 | # filename:lineno [module]function flags format | 74 | # filename:lineno [module]function flags format |
| 75 | /usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svcsock.c:1603 [sunrpc]svc_send p "svc_process:\040st_sendto\040returned\040%d\012" | 75 | /usr/src/packages/BUILD/sgi-enhancednfs-1.4/default/net/sunrpc/svcsock.c:1603 [sunrpc]svc_send p "svc_process: st_sendto returned %d\012" |
| 76 | 76 | ||
| 77 | 77 | ||
| 78 | Command Language Reference | 78 | Command Language Reference |
| @@ -166,11 +166,15 @@ format | |||
| 166 | entire format, only some part. Whitespace and other | 166 | entire format, only some part. Whitespace and other |
| 167 | special characters can be escaped using C octal character | 167 | special characters can be escaped using C octal character |
| 168 | escape \ooo notation, e.g. the space character is \040. | 168 | escape \ooo notation, e.g. the space character is \040. |
| 169 | Alternatively, the string can be enclosed in double quote | ||
| 170 | characters (") or single quote characters ('). | ||
| 169 | Examples: | 171 | Examples: |
| 170 | 172 | ||
| 171 | format svcrdma: // many of the NFS/RDMA server dprintks | 173 | format svcrdma: // many of the NFS/RDMA server dprintks |
| 172 | format readahead // some dprintks in the readahead cache | 174 | format readahead // some dprintks in the readahead cache |
| 173 | format nfsd:\040SETATTR // how to match a format with whitespace | 175 | format nfsd:\040SETATTR // one way to match a format with whitespace |
| 176 | format "nfsd: SETATTR" // a neater way to match a format with whitespace | ||
| 177 | format 'nfsd: SETATTR' // yet another way to match a format with whitespace | ||
| 174 | 178 | ||
| 175 | line | 179 | line |
| 176 | The given line number or range of line numbers is compared | 180 | The given line number or range of line numbers is compared |
| @@ -230,3 +234,7 @@ nullarbor:~ # echo -n 'func svc_process +p' > | |||
| 230 | // disable all 12 messages in the function svc_process() | 234 | // disable all 12 messages in the function svc_process() |
| 231 | nullarbor:~ # echo -n 'func svc_process -p' > | 235 | nullarbor:~ # echo -n 'func svc_process -p' > |
| 232 | <debugfs>/dynamic_debug/control | 236 | <debugfs>/dynamic_debug/control |
| 237 | |||
| 238 | // enable messages for NFS calls READ, READLINK, READDIR and READDIR+. | ||
| 239 | nullarbor:~ # echo -n 'format "nfsd: READ" +p' > | ||
| 240 | <debugfs>/dynamic_debug/control | ||
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 9e123ae326bc..833139ce1e22 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c | |||
| @@ -196,32 +196,45 @@ static void ddebug_change(const struct ddebug_query *query, | |||
| 196 | } | 196 | } |
| 197 | 197 | ||
| 198 | /* | 198 | /* |
| 199 | * Wrapper around strsep() to collapse the multiple empty tokens | ||
| 200 | * that it returns when fed sequences of separator characters. | ||
| 201 | * Now, if we had strtok_r()... | ||
| 202 | */ | ||
| 203 | static inline char *nearly_strtok_r(char **p, const char *sep) | ||
| 204 | { | ||
| 205 | char *r; | ||
| 206 | |||
| 207 | while ((r = strsep(p, sep)) != NULL && *r == '\0') | ||
| 208 | ; | ||
| 209 | return r; | ||
| 210 | } | ||
| 211 | |||
| 212 | /* | ||
| 213 | * Split the buffer `buf' into space-separated words. | 199 | * Split the buffer `buf' into space-separated words. |
| 214 | * Return the number of such words or <0 on error. | 200 | * Handles simple " and ' quoting, i.e. without nested, |
| 201 | * embedded or escaped \". Return the number of words | ||
| 202 | * or <0 on error. | ||
| 215 | */ | 203 | */ |
| 216 | static int ddebug_tokenize(char *buf, char *words[], int maxwords) | 204 | static int ddebug_tokenize(char *buf, char *words[], int maxwords) |
| 217 | { | 205 | { |
| 218 | int nwords = 0; | 206 | int nwords = 0; |
| 219 | 207 | ||
| 220 | while (nwords < maxwords && | 208 | while (*buf) { |
| 221 | (words[nwords] = nearly_strtok_r(&buf, " \t\r\n")) != NULL) | 209 | char *end; |
| 222 | nwords++; | 210 | |
| 223 | if (buf) | 211 | /* Skip leading whitespace */ |
| 224 | return -EINVAL; /* ran out of words[] before bytes */ | 212 | while (*buf && isspace(*buf)) |
| 213 | buf++; | ||
| 214 | if (!*buf) | ||
| 215 | break; /* oh, it was trailing whitespace */ | ||
| 216 | |||
| 217 | /* Run `end' over a word, either whitespace separated or quoted */ | ||
| 218 | if (*buf == '"' || *buf == '\'') { | ||
| 219 | int quote = *buf++; | ||
| 220 | for (end = buf ; *end && *end != quote ; end++) | ||
| 221 | ; | ||
| 222 | if (!*end) | ||
| 223 | return -EINVAL; /* unclosed quote */ | ||
| 224 | } else { | ||
| 225 | for (end = buf ; *end && !isspace(*end) ; end++) | ||
| 226 | ; | ||
| 227 | BUG_ON(end == buf); | ||
| 228 | } | ||
| 229 | /* Here `buf' is the start of the word, `end' is one past the end */ | ||
| 230 | |||
| 231 | if (nwords == maxwords) | ||
| 232 | return -EINVAL; /* ran out of words[] before bytes */ | ||
| 233 | if (*end) | ||
| 234 | *end++ = '\0'; /* terminate the word */ | ||
| 235 | words[nwords++] = buf; | ||
| 236 | buf = end; | ||
| 237 | } | ||
| 225 | 238 | ||
| 226 | if (verbose) { | 239 | if (verbose) { |
| 227 | int i; | 240 | int i; |
