]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - lib/dynamic_debug.c
params: replace printk(KERN_<LVL>...) with pr_<lvl>(...)
[mirror_ubuntu-bionic-kernel.git] / lib / dynamic_debug.c
CommitLineData
e9d376f0
JB
1/*
2 * lib/dynamic_debug.c
3 *
4 * make pr_debug()/dev_dbg() calls runtime configurable based upon their
5 * source module.
6 *
7 * Copyright (C) 2008 Jason Baron <jbaron@redhat.com>
8 * By Greg Banks <gnb@melbourne.sgi.com>
9 * Copyright (c) 2008 Silicon Graphics Inc. All Rights Reserved.
8ba6ebf5 10 * Copyright (C) 2011 Bart Van Assche. All Rights Reserved.
e9d376f0
JB
11 */
12
4ad275e5
JP
13#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
14
e9d376f0
JB
15#include <linux/kernel.h>
16#include <linux/module.h>
e9d376f0 17#include <linux/mutex.h>
e9d376f0 18#include <linux/seq_file.h>
e9d376f0 19#include <linux/ctype.h>
e9d376f0
JB
20#include <linux/dynamic_debug.h>
21#include <linux/debugfs.h>
5a0e3ad6 22#include <linux/slab.h>
8ba6ebf5 23#include <linux/hardirq.h>
e8d9792a 24#include <linux/sched.h>
ffa10cb4 25#include <linux/netdevice.h>
e9d376f0
JB
26
27extern struct _ddebug __start___verbose[];
28extern struct _ddebug __stop___verbose[];
29
e9d376f0
JB
30struct ddebug_table {
31 struct list_head link;
32 char *mod_name;
33 unsigned int num_ddebugs;
e9d376f0
JB
34 struct _ddebug *ddebugs;
35};
36
37struct ddebug_query {
38 const char *filename;
39 const char *module;
40 const char *function;
41 const char *format;
42 unsigned int first_lineno, last_lineno;
43};
44
45struct ddebug_iter {
46 struct ddebug_table *table;
47 unsigned int idx;
48};
49
50static DEFINE_MUTEX(ddebug_lock);
51static LIST_HEAD(ddebug_tables);
52static int verbose = 0;
74df138d 53module_param(verbose, int, 0644);
e9d376f0
JB
54
55/* Return the last part of a pathname */
56static inline const char *basename(const char *path)
57{
58 const char *tail = strrchr(path, '/');
59 return tail ? tail+1 : path;
60}
61
2b678319
JC
62/* Return the path relative to source root */
63static inline const char *trim_prefix(const char *path)
64{
65 int skip = strlen(__FILE__) - strlen("lib/dynamic_debug.c");
66
67 if (strncmp(path, __FILE__, skip))
68 skip = 0; /* prefix mismatch, don't skip */
69
70 return path + skip;
71}
72
8ba6ebf5
BVA
73static struct { unsigned flag:8; char opt_char; } opt_array[] = {
74 { _DPRINTK_FLAGS_PRINT, 'p' },
75 { _DPRINTK_FLAGS_INCL_MODNAME, 'm' },
76 { _DPRINTK_FLAGS_INCL_FUNCNAME, 'f' },
77 { _DPRINTK_FLAGS_INCL_LINENO, 'l' },
78 { _DPRINTK_FLAGS_INCL_TID, 't' },
5ca7d2a6 79 { _DPRINTK_FLAGS_NONE, '_' },
8ba6ebf5
BVA
80};
81
e9d376f0
JB
82/* format a string into buf[] which describes the _ddebug's flags */
83static char *ddebug_describe_flags(struct _ddebug *dp, char *buf,
84 size_t maxlen)
85{
86 char *p = buf;
8ba6ebf5 87 int i;
e9d376f0 88
5ca7d2a6 89 BUG_ON(maxlen < 6);
8ba6ebf5
BVA
90 for (i = 0; i < ARRAY_SIZE(opt_array); ++i)
91 if (dp->flags & opt_array[i].flag)
92 *p++ = opt_array[i].opt_char;
e9d376f0 93 if (p == buf)
5ca7d2a6 94 *p++ = '_';
e9d376f0
JB
95 *p = '\0';
96
97 return buf;
98}
99
b8ccd5de
JC
100#define vpr_info(fmt, ...) \
101 if (verbose) do { pr_info(fmt, ##__VA_ARGS__); } while (0)
102
103#define vpr_info_dq(q, msg) \
104do { \
105 /* trim last char off format print */ \
106 vpr_info("%s: func=\"%s\" file=\"%s\" " \
107 "module=\"%s\" format=\"%.*s\" " \
108 "lineno=%u-%u", \
109 msg, \
110 q->function ? q->function : "", \
111 q->filename ? q->filename : "", \
112 q->module ? q->module : "", \
113 (int)(q->format ? strlen(q->format) - 1 : 0), \
114 q->format ? q->format : "", \
115 q->first_lineno, q->last_lineno); \
574b3725
JC
116} while (0)
117
e9d376f0 118/*
85f7f6c0
JC
119 * Search the tables for _ddebug's which match the given `query' and
120 * apply the `flags' and `mask' to them. Returns number of matching
121 * callsites, normally the same as number of changes. If verbose,
122 * logs the changes. Takes ddebug_lock.
e9d376f0 123 */
85f7f6c0
JC
124static int ddebug_change(const struct ddebug_query *query,
125 unsigned int flags, unsigned int mask)
e9d376f0
JB
126{
127 int i;
128 struct ddebug_table *dt;
129 unsigned int newflags;
130 unsigned int nfound = 0;
5ca7d2a6 131 char flagbuf[10];
e9d376f0
JB
132
133 /* search for matching ddebugs */
134 mutex_lock(&ddebug_lock);
135 list_for_each_entry(dt, &ddebug_tables, link) {
136
137 /* match against the module name */
d6a238d2 138 if (query->module && strcmp(query->module, dt->mod_name))
e9d376f0
JB
139 continue;
140
141 for (i = 0 ; i < dt->num_ddebugs ; i++) {
142 struct _ddebug *dp = &dt->ddebugs[i];
143
144 /* match against the source filename */
d6a238d2 145 if (query->filename &&
e9d376f0 146 strcmp(query->filename, dp->filename) &&
2b678319
JC
147 strcmp(query->filename, basename(dp->filename)) &&
148 strcmp(query->filename, trim_prefix(dp->filename)))
e9d376f0
JB
149 continue;
150
151 /* match against the function */
d6a238d2 152 if (query->function &&
e9d376f0
JB
153 strcmp(query->function, dp->function))
154 continue;
155
156 /* match against the format */
d6a238d2
JC
157 if (query->format &&
158 !strstr(dp->format, query->format))
e9d376f0
JB
159 continue;
160
161 /* match against the line number range */
162 if (query->first_lineno &&
163 dp->lineno < query->first_lineno)
164 continue;
165 if (query->last_lineno &&
166 dp->lineno > query->last_lineno)
167 continue;
168
169 nfound++;
170
171 newflags = (dp->flags & mask) | flags;
172 if (newflags == dp->flags)
173 continue;
e9d376f0 174 dp->flags = newflags;
b8ccd5de
JC
175 vpr_info("changed %s:%d [%s]%s =%s\n",
176 trim_prefix(dp->filename), dp->lineno,
177 dt->mod_name, dp->function,
178 ddebug_describe_flags(dp, flagbuf,
179 sizeof(flagbuf)));
e9d376f0
JB
180 }
181 }
182 mutex_unlock(&ddebug_lock);
183
184 if (!nfound && verbose)
4ad275e5 185 pr_info("no matches for query\n");
85f7f6c0
JC
186
187 return nfound;
e9d376f0
JB
188}
189
e9d376f0
JB
190/*
191 * Split the buffer `buf' into space-separated words.
9898abb3
GB
192 * Handles simple " and ' quoting, i.e. without nested,
193 * embedded or escaped \". Return the number of words
194 * or <0 on error.
e9d376f0
JB
195 */
196static int ddebug_tokenize(char *buf, char *words[], int maxwords)
197{
198 int nwords = 0;
199
9898abb3
GB
200 while (*buf) {
201 char *end;
202
203 /* Skip leading whitespace */
e7d2860b 204 buf = skip_spaces(buf);
9898abb3
GB
205 if (!*buf)
206 break; /* oh, it was trailing whitespace */
8bd6026e
JC
207 if (*buf == '#')
208 break; /* token starts comment, skip rest of line */
9898abb3 209
07100be7 210 /* find `end' of word, whitespace separated or quoted */
9898abb3
GB
211 if (*buf == '"' || *buf == '\'') {
212 int quote = *buf++;
213 for (end = buf ; *end && *end != quote ; end++)
214 ;
215 if (!*end)
216 return -EINVAL; /* unclosed quote */
217 } else {
218 for (end = buf ; *end && !isspace(*end) ; end++)
219 ;
220 BUG_ON(end == buf);
221 }
9898abb3 222
07100be7 223 /* `buf' is start of word, `end' is one past its end */
9898abb3
GB
224 if (nwords == maxwords)
225 return -EINVAL; /* ran out of words[] before bytes */
226 if (*end)
227 *end++ = '\0'; /* terminate the word */
228 words[nwords++] = buf;
229 buf = end;
230 }
e9d376f0
JB
231
232 if (verbose) {
233 int i;
4ad275e5 234 pr_info("split into words:");
e9d376f0 235 for (i = 0 ; i < nwords ; i++)
4ad275e5
JP
236 pr_cont(" \"%s\"", words[i]);
237 pr_cont("\n");
e9d376f0
JB
238 }
239
240 return nwords;
241}
242
243/*
244 * Parse a single line number. Note that the empty string ""
245 * is treated as a special case and converted to zero, which
246 * is later treated as a "don't care" value.
247 */
248static inline int parse_lineno(const char *str, unsigned int *val)
249{
250 char *end = NULL;
251 BUG_ON(str == NULL);
252 if (*str == '\0') {
253 *val = 0;
254 return 0;
255 }
256 *val = simple_strtoul(str, &end, 10);
257 return end == NULL || end == str || *end != '\0' ? -EINVAL : 0;
258}
259
260/*
261 * Undo octal escaping in a string, inplace. This is useful to
262 * allow the user to express a query which matches a format
263 * containing embedded spaces.
264 */
265#define isodigit(c) ((c) >= '0' && (c) <= '7')
266static char *unescape(char *str)
267{
268 char *in = str;
269 char *out = str;
270
271 while (*in) {
272 if (*in == '\\') {
273 if (in[1] == '\\') {
274 *out++ = '\\';
275 in += 2;
276 continue;
277 } else if (in[1] == 't') {
278 *out++ = '\t';
279 in += 2;
280 continue;
281 } else if (in[1] == 'n') {
282 *out++ = '\n';
283 in += 2;
284 continue;
285 } else if (isodigit(in[1]) &&
286 isodigit(in[2]) &&
287 isodigit(in[3])) {
288 *out++ = ((in[1] - '0')<<6) |
289 ((in[2] - '0')<<3) |
290 (in[3] - '0');
291 in += 4;
292 continue;
293 }
294 }
295 *out++ = *in++;
296 }
297 *out = '\0';
298
299 return str;
300}
301
820874c7
JC
302static int check_set(const char **dest, char *src, char *name)
303{
304 int rc = 0;
305
306 if (*dest) {
307 rc = -EINVAL;
308 pr_err("match-spec:%s val:%s overridden by %s",
309 name, *dest, src);
310 }
311 *dest = src;
312 return rc;
313}
314
e9d376f0
JB
315/*
316 * Parse words[] as a ddebug query specification, which is a series
317 * of (keyword, value) pairs chosen from these possibilities:
318 *
319 * func <function-name>
320 * file <full-pathname>
321 * file <base-filename>
322 * module <module-name>
323 * format <escaped-string-to-find-in-format>
324 * line <lineno>
325 * line <first-lineno>-<last-lineno> // where either may be empty
820874c7
JC
326 *
327 * Only 1 of each type is allowed.
328 * Returns 0 on success, <0 on error.
e9d376f0
JB
329 */
330static int ddebug_parse_query(char *words[], int nwords,
8e59b5cf 331 struct ddebug_query *query, const char *modname)
e9d376f0
JB
332{
333 unsigned int i;
820874c7 334 int rc;
e9d376f0
JB
335
336 /* check we have an even number of words */
337 if (nwords % 2 != 0)
338 return -EINVAL;
339 memset(query, 0, sizeof(*query));
340
8e59b5cf
JC
341 if (modname)
342 /* support $modname.dyndbg=<multiple queries> */
343 query->module = modname;
344
e9d376f0
JB
345 for (i = 0 ; i < nwords ; i += 2) {
346 if (!strcmp(words[i], "func"))
820874c7 347 rc = check_set(&query->function, words[i+1], "func");
e9d376f0 348 else if (!strcmp(words[i], "file"))
820874c7 349 rc = check_set(&query->filename, words[i+1], "file");
e9d376f0 350 else if (!strcmp(words[i], "module"))
820874c7 351 rc = check_set(&query->module, words[i+1], "module");
e9d376f0 352 else if (!strcmp(words[i], "format"))
820874c7
JC
353 rc = check_set(&query->format, unescape(words[i+1]),
354 "format");
e9d376f0
JB
355 else if (!strcmp(words[i], "line")) {
356 char *first = words[i+1];
357 char *last = strchr(first, '-');
820874c7
JC
358 if (query->first_lineno || query->last_lineno) {
359 pr_err("match-spec:line given 2 times\n");
360 return -EINVAL;
361 }
e9d376f0
JB
362 if (last)
363 *last++ = '\0';
364 if (parse_lineno(first, &query->first_lineno) < 0)
365 return -EINVAL;
820874c7 366 if (last) {
e9d376f0 367 /* range <first>-<last> */
820874c7
JC
368 if (parse_lineno(last, &query->last_lineno)
369 < query->first_lineno) {
370 pr_err("last-line < 1st-line\n");
e9d376f0 371 return -EINVAL;
820874c7 372 }
e9d376f0
JB
373 } else {
374 query->last_lineno = query->first_lineno;
375 }
376 } else {
ae27f86a 377 pr_err("unknown keyword \"%s\"\n", words[i]);
e9d376f0
JB
378 return -EINVAL;
379 }
820874c7
JC
380 if (rc)
381 return rc;
e9d376f0 382 }
574b3725 383 vpr_info_dq(query, "parsed");
e9d376f0
JB
384 return 0;
385}
386
387/*
388 * Parse `str' as a flags specification, format [-+=][p]+.
389 * Sets up *maskp and *flagsp to be used when changing the
390 * flags fields of matched _ddebug's. Returns 0 on success
391 * or <0 on error.
392 */
393static int ddebug_parse_flags(const char *str, unsigned int *flagsp,
394 unsigned int *maskp)
395{
396 unsigned flags = 0;
8ba6ebf5 397 int op = '=', i;
e9d376f0
JB
398
399 switch (*str) {
400 case '+':
401 case '-':
402 case '=':
403 op = *str++;
404 break;
405 default:
406 return -EINVAL;
407 }
b8ccd5de 408 vpr_info("op='%c'\n", op);
e9d376f0
JB
409
410 for ( ; *str ; ++str) {
8ba6ebf5
BVA
411 for (i = ARRAY_SIZE(opt_array) - 1; i >= 0; i--) {
412 if (*str == opt_array[i].opt_char) {
413 flags |= opt_array[i].flag;
414 break;
415 }
e9d376f0 416 }
8ba6ebf5
BVA
417 if (i < 0)
418 return -EINVAL;
e9d376f0 419 }
b8ccd5de 420 vpr_info("flags=0x%x\n", flags);
e9d376f0
JB
421
422 /* calculate final *flagsp, *maskp according to mask and op */
423 switch (op) {
424 case '=':
425 *maskp = 0;
426 *flagsp = flags;
427 break;
428 case '+':
429 *maskp = ~0U;
430 *flagsp = flags;
431 break;
432 case '-':
433 *maskp = ~flags;
434 *flagsp = 0;
435 break;
436 }
b8ccd5de 437 vpr_info("*flagsp=0x%x *maskp=0x%x\n", *flagsp, *maskp);
e9d376f0
JB
438 return 0;
439}
440
8e59b5cf 441static int ddebug_exec_query(char *query_string, const char *modname)
fd89cfb8
TR
442{
443 unsigned int flags = 0, mask = 0;
444 struct ddebug_query query;
445#define MAXWORDS 9
85f7f6c0 446 int nwords, nfound;
fd89cfb8
TR
447 char *words[MAXWORDS];
448
449 nwords = ddebug_tokenize(query_string, words, MAXWORDS);
450 if (nwords <= 0)
451 return -EINVAL;
8e59b5cf 452 if (ddebug_parse_query(words, nwords-1, &query, modname))
fd89cfb8
TR
453 return -EINVAL;
454 if (ddebug_parse_flags(words[nwords-1], &flags, &mask))
455 return -EINVAL;
456
457 /* actually go and implement the change */
85f7f6c0
JC
458 nfound = ddebug_change(&query, flags, mask);
459 vpr_info_dq((&query), (nfound) ? "applied" : "no-match");
460
461 return nfound;
462}
463
464/* handle multiple queries in query string, continue on error, return
465 last error or number of matching callsites. Module name is either
466 in param (for boot arg) or perhaps in query string.
467*/
8e59b5cf 468static int ddebug_exec_queries(char *query, const char *modname)
85f7f6c0
JC
469{
470 char *split;
471 int i, errs = 0, exitcode = 0, rc, nfound = 0;
472
473 for (i = 0; query; query = split) {
474 split = strpbrk(query, ";\n");
475 if (split)
476 *split++ = '\0';
477
478 query = skip_spaces(query);
479 if (!query || !*query || *query == '#')
480 continue;
481
b8ccd5de 482 vpr_info("query %d: \"%s\"\n", i, query);
85f7f6c0 483
8e59b5cf 484 rc = ddebug_exec_query(query, modname);
85f7f6c0
JC
485 if (rc < 0) {
486 errs++;
487 exitcode = rc;
488 } else
489 nfound += rc;
490 i++;
491 }
b8ccd5de 492 vpr_info("processed %d queries, with %d matches, %d errs\n",
85f7f6c0
JC
493 i, nfound, errs);
494
495 if (exitcode)
496 return exitcode;
497 return nfound;
fd89cfb8
TR
498}
499
431625da
JB
500#define PREFIX_SIZE 64
501
502static int remaining(int wrote)
503{
504 if (PREFIX_SIZE - wrote > 0)
505 return PREFIX_SIZE - wrote;
506 return 0;
507}
508
509static char *dynamic_emit_prefix(const struct _ddebug *desc, char *buf)
8ba6ebf5 510{
431625da
JB
511 int pos_after_tid;
512 int pos = 0;
8ba6ebf5 513
431625da
JB
514 pos += snprintf(buf + pos, remaining(pos), "%s", KERN_DEBUG);
515 if (desc->flags & _DPRINTK_FLAGS_INCL_TID) {
8ba6ebf5 516 if (in_interrupt())
431625da
JB
517 pos += snprintf(buf + pos, remaining(pos), "%s ",
518 "<intr>");
8ba6ebf5 519 else
431625da
JB
520 pos += snprintf(buf + pos, remaining(pos), "[%d] ",
521 task_pid_vnr(current));
8ba6ebf5 522 }
431625da
JB
523 pos_after_tid = pos;
524 if (desc->flags & _DPRINTK_FLAGS_INCL_MODNAME)
525 pos += snprintf(buf + pos, remaining(pos), "%s:",
526 desc->modname);
527 if (desc->flags & _DPRINTK_FLAGS_INCL_FUNCNAME)
528 pos += snprintf(buf + pos, remaining(pos), "%s:",
529 desc->function);
530 if (desc->flags & _DPRINTK_FLAGS_INCL_LINENO)
07100be7
JC
531 pos += snprintf(buf + pos, remaining(pos), "%d:",
532 desc->lineno);
431625da
JB
533 if (pos - pos_after_tid)
534 pos += snprintf(buf + pos, remaining(pos), " ");
535 if (pos >= PREFIX_SIZE)
536 buf[PREFIX_SIZE - 1] = '\0';
6c2140ee 537
431625da 538 return buf;
6c2140ee
JP
539}
540
8ba6ebf5
BVA
541int __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...)
542{
543 va_list args;
544 int res;
431625da
JB
545 struct va_format vaf;
546 char buf[PREFIX_SIZE];
8ba6ebf5
BVA
547
548 BUG_ON(!descriptor);
549 BUG_ON(!fmt);
550
551 va_start(args, fmt);
431625da
JB
552 vaf.fmt = fmt;
553 vaf.va = &args;
554 res = printk("%s%pV", dynamic_emit_prefix(descriptor, buf), &vaf);
8ba6ebf5
BVA
555 va_end(args);
556
557 return res;
558}
559EXPORT_SYMBOL(__dynamic_pr_debug);
560
cbc46635
JP
561int __dynamic_dev_dbg(struct _ddebug *descriptor,
562 const struct device *dev, const char *fmt, ...)
563{
564 struct va_format vaf;
565 va_list args;
566 int res;
431625da 567 char buf[PREFIX_SIZE];
cbc46635
JP
568
569 BUG_ON(!descriptor);
570 BUG_ON(!fmt);
571
572 va_start(args, fmt);
cbc46635
JP
573 vaf.fmt = fmt;
574 vaf.va = &args;
431625da 575 res = __dev_printk(dynamic_emit_prefix(descriptor, buf), dev, &vaf);
cbc46635
JP
576 va_end(args);
577
578 return res;
579}
580EXPORT_SYMBOL(__dynamic_dev_dbg);
581
0feefd97
JB
582#ifdef CONFIG_NET
583
ffa10cb4
JB
584int __dynamic_netdev_dbg(struct _ddebug *descriptor,
585 const struct net_device *dev, const char *fmt, ...)
586{
587 struct va_format vaf;
588 va_list args;
589 int res;
431625da 590 char buf[PREFIX_SIZE];
ffa10cb4
JB
591
592 BUG_ON(!descriptor);
593 BUG_ON(!fmt);
594
595 va_start(args, fmt);
ffa10cb4
JB
596 vaf.fmt = fmt;
597 vaf.va = &args;
431625da 598 res = __netdev_printk(dynamic_emit_prefix(descriptor, buf), dev, &vaf);
ffa10cb4
JB
599 va_end(args);
600
601 return res;
602}
603EXPORT_SYMBOL(__dynamic_netdev_dbg);
604
0feefd97
JB
605#endif
606
bc757f6f
JC
607#define DDEBUG_STRING_SIZE 1024
608static __initdata char ddebug_setup_string[DDEBUG_STRING_SIZE];
609
a648ec05
TR
610static __init int ddebug_setup_query(char *str)
611{
bc757f6f 612 if (strlen(str) >= DDEBUG_STRING_SIZE) {
4ad275e5 613 pr_warn("ddebug boot param string too large\n");
a648ec05
TR
614 return 0;
615 }
bc757f6f 616 strlcpy(ddebug_setup_string, str, DDEBUG_STRING_SIZE);
a648ec05
TR
617 return 1;
618}
619
620__setup("ddebug_query=", ddebug_setup_query);
621
e9d376f0
JB
622/*
623 * File_ops->write method for <debugfs>/dynamic_debug/conrol. Gathers the
624 * command text from userspace, parses and executes it.
625 */
7281491c 626#define USER_BUF_PAGE 4096
e9d376f0
JB
627static ssize_t ddebug_proc_write(struct file *file, const char __user *ubuf,
628 size_t len, loff_t *offp)
629{
7281491c 630 char *tmpbuf;
fd89cfb8 631 int ret;
e9d376f0
JB
632
633 if (len == 0)
634 return 0;
7281491c
JC
635 if (len > USER_BUF_PAGE - 1) {
636 pr_warn("expected <%d bytes into control\n", USER_BUF_PAGE);
e9d376f0 637 return -E2BIG;
7281491c
JC
638 }
639 tmpbuf = kmalloc(len + 1, GFP_KERNEL);
640 if (!tmpbuf)
641 return -ENOMEM;
642 if (copy_from_user(tmpbuf, ubuf, len)) {
643 kfree(tmpbuf);
e9d376f0 644 return -EFAULT;
7281491c 645 }
e9d376f0 646 tmpbuf[len] = '\0';
b8ccd5de 647 vpr_info("read %d bytes from userspace\n", (int)len);
e9d376f0 648
8e59b5cf 649 ret = ddebug_exec_queries(tmpbuf, NULL);
7281491c 650 kfree(tmpbuf);
85f7f6c0 651 if (ret < 0)
fd89cfb8 652 return ret;
e9d376f0
JB
653
654 *offp += len;
655 return len;
656}
657
658/*
659 * Set the iterator to point to the first _ddebug object
660 * and return a pointer to that first object. Returns
661 * NULL if there are no _ddebugs at all.
662 */
663static struct _ddebug *ddebug_iter_first(struct ddebug_iter *iter)
664{
665 if (list_empty(&ddebug_tables)) {
666 iter->table = NULL;
667 iter->idx = 0;
668 return NULL;
669 }
670 iter->table = list_entry(ddebug_tables.next,
671 struct ddebug_table, link);
672 iter->idx = 0;
673 return &iter->table->ddebugs[iter->idx];
674}
675
676/*
677 * Advance the iterator to point to the next _ddebug
678 * object from the one the iterator currently points at,
679 * and returns a pointer to the new _ddebug. Returns
680 * NULL if the iterator has seen all the _ddebugs.
681 */
682static struct _ddebug *ddebug_iter_next(struct ddebug_iter *iter)
683{
684 if (iter->table == NULL)
685 return NULL;
686 if (++iter->idx == iter->table->num_ddebugs) {
687 /* iterate to next table */
688 iter->idx = 0;
689 if (list_is_last(&iter->table->link, &ddebug_tables)) {
690 iter->table = NULL;
691 return NULL;
692 }
693 iter->table = list_entry(iter->table->link.next,
694 struct ddebug_table, link);
695 }
696 return &iter->table->ddebugs[iter->idx];
697}
698
699/*
700 * Seq_ops start method. Called at the start of every
701 * read() call from userspace. Takes the ddebug_lock and
702 * seeks the seq_file's iterator to the given position.
703 */
704static void *ddebug_proc_start(struct seq_file *m, loff_t *pos)
705{
706 struct ddebug_iter *iter = m->private;
707 struct _ddebug *dp;
708 int n = *pos;
709
b8ccd5de 710 vpr_info("called m=%p *pos=%lld\n", m, (unsigned long long)*pos);
e9d376f0
JB
711
712 mutex_lock(&ddebug_lock);
713
714 if (!n)
715 return SEQ_START_TOKEN;
716 if (n < 0)
717 return NULL;
718 dp = ddebug_iter_first(iter);
719 while (dp != NULL && --n > 0)
720 dp = ddebug_iter_next(iter);
721 return dp;
722}
723
724/*
725 * Seq_ops next method. Called several times within a read()
726 * call from userspace, with ddebug_lock held. Walks to the
727 * next _ddebug object with a special case for the header line.
728 */
729static void *ddebug_proc_next(struct seq_file *m, void *p, loff_t *pos)
730{
731 struct ddebug_iter *iter = m->private;
732 struct _ddebug *dp;
733
b8ccd5de
JC
734 vpr_info("called m=%p p=%p *pos=%lld\n",
735 m, p, (unsigned long long)*pos);
e9d376f0
JB
736
737 if (p == SEQ_START_TOKEN)
738 dp = ddebug_iter_first(iter);
739 else
740 dp = ddebug_iter_next(iter);
741 ++*pos;
742 return dp;
743}
744
745/*
746 * Seq_ops show method. Called several times within a read()
747 * call from userspace, with ddebug_lock held. Formats the
748 * current _ddebug as a single human-readable line, with a
749 * special case for the header line.
750 */
751static int ddebug_proc_show(struct seq_file *m, void *p)
752{
753 struct ddebug_iter *iter = m->private;
754 struct _ddebug *dp = p;
5ca7d2a6 755 char flagsbuf[10];
e9d376f0 756
b8ccd5de 757 vpr_info("called m=%p p=%p\n", m, p);
e9d376f0
JB
758
759 if (p == SEQ_START_TOKEN) {
760 seq_puts(m,
761 "# filename:lineno [module]function flags format\n");
762 return 0;
763 }
764
5ca7d2a6 765 seq_printf(m, "%s:%u [%s]%s =%s \"",
2b678319 766 trim_prefix(dp->filename), dp->lineno,
5ca7d2a6
JC
767 iter->table->mod_name, dp->function,
768 ddebug_describe_flags(dp, flagsbuf, sizeof(flagsbuf)));
e9d376f0
JB
769 seq_escape(m, dp->format, "\t\r\n\"");
770 seq_puts(m, "\"\n");
771
772 return 0;
773}
774
775/*
776 * Seq_ops stop method. Called at the end of each read()
777 * call from userspace. Drops ddebug_lock.
778 */
779static void ddebug_proc_stop(struct seq_file *m, void *p)
780{
b8ccd5de 781 vpr_info("called m=%p p=%p\n", m, p);
e9d376f0
JB
782 mutex_unlock(&ddebug_lock);
783}
784
785static const struct seq_operations ddebug_proc_seqops = {
786 .start = ddebug_proc_start,
787 .next = ddebug_proc_next,
788 .show = ddebug_proc_show,
789 .stop = ddebug_proc_stop
790};
791
792/*
07100be7
JC
793 * File_ops->open method for <debugfs>/dynamic_debug/control. Does
794 * the seq_file setup dance, and also creates an iterator to walk the
795 * _ddebugs. Note that we create a seq_file always, even for O_WRONLY
796 * files where it's not needed, as doing so simplifies the ->release
797 * method.
e9d376f0
JB
798 */
799static int ddebug_proc_open(struct inode *inode, struct file *file)
800{
801 struct ddebug_iter *iter;
802 int err;
803
b8ccd5de 804 vpr_info("called\n");
e9d376f0
JB
805
806 iter = kzalloc(sizeof(*iter), GFP_KERNEL);
807 if (iter == NULL)
808 return -ENOMEM;
809
810 err = seq_open(file, &ddebug_proc_seqops);
811 if (err) {
812 kfree(iter);
813 return err;
814 }
815 ((struct seq_file *) file->private_data)->private = iter;
816 return 0;
817}
818
819static const struct file_operations ddebug_proc_fops = {
820 .owner = THIS_MODULE,
821 .open = ddebug_proc_open,
822 .read = seq_read,
823 .llseek = seq_lseek,
824 .release = seq_release_private,
825 .write = ddebug_proc_write
826};
827
828/*
829 * Allocate a new ddebug_table for the given module
830 * and add it to the global list.
831 */
832int ddebug_add_module(struct _ddebug *tab, unsigned int n,
833 const char *name)
834{
835 struct ddebug_table *dt;
836 char *new_name;
837
838 dt = kzalloc(sizeof(*dt), GFP_KERNEL);
839 if (dt == NULL)
840 return -ENOMEM;
841 new_name = kstrdup(name, GFP_KERNEL);
842 if (new_name == NULL) {
843 kfree(dt);
844 return -ENOMEM;
845 }
846 dt->mod_name = new_name;
847 dt->num_ddebugs = n;
e9d376f0
JB
848 dt->ddebugs = tab;
849
850 mutex_lock(&ddebug_lock);
851 list_add_tail(&dt->link, &ddebug_tables);
852 mutex_unlock(&ddebug_lock);
853
b8ccd5de 854 vpr_info("%u debug prints in module %s\n", n, dt->mod_name);
e9d376f0
JB
855 return 0;
856}
857EXPORT_SYMBOL_GPL(ddebug_add_module);
858
6ab676e9
JC
859/* helper for ddebug_dyndbg_(boot|module)_param_cb */
860static int ddebug_dyndbg_param_cb(char *param, char *val,
861 const char *modname, int on_err)
b48420c1 862{
b48420c1
JC
863 char *sep;
864
865 sep = strchr(param, '.');
866 if (sep) {
6ab676e9 867 /* needed only for ddebug_dyndbg_boot_param_cb */
b48420c1
JC
868 *sep = '\0';
869 modname = param;
870 param = sep + 1;
871 }
872 if (strcmp(param, "dyndbg"))
6ab676e9 873 return on_err; /* determined by caller */
b48420c1 874
8e59b5cf
JC
875 ddebug_exec_queries((val ? val : "+p"), modname);
876
b48420c1
JC
877 return 0; /* query failure shouldnt stop module load */
878}
879
6ab676e9
JC
880/* handle both dyndbg and $module.dyndbg params at boot */
881static int ddebug_dyndbg_boot_param_cb(char *param, char *val,
882 const char *unused)
b48420c1 883{
6ab676e9
JC
884 vpr_info("%s=\"%s\"\n", param, val);
885 return ddebug_dyndbg_param_cb(param, val, NULL, 0);
886}
b48420c1 887
6ab676e9
JC
888/*
889 * modprobe foo finds foo.params in boot-args, strips "foo.", and
890 * passes them to load_module(). This callback gets unknown params,
891 * processes dyndbg params, rejects others.
892 */
893int ddebug_dyndbg_module_param_cb(char *param, char *val, const char *module)
894{
895 vpr_info("module: %s %s=\"%s\"\n", module, param, val);
896 return ddebug_dyndbg_param_cb(param, val, module, -ENOENT);
b48420c1
JC
897}
898
e9d376f0
JB
899static void ddebug_table_free(struct ddebug_table *dt)
900{
901 list_del_init(&dt->link);
902 kfree(dt->mod_name);
903 kfree(dt);
904}
905
906/*
907 * Called in response to a module being unloaded. Removes
908 * any ddebug_table's which point at the module.
909 */
ff49d74a 910int ddebug_remove_module(const char *mod_name)
e9d376f0
JB
911{
912 struct ddebug_table *dt, *nextdt;
913 int ret = -ENOENT;
914
b8ccd5de 915 vpr_info("removing module \"%s\"\n", mod_name);
e9d376f0
JB
916
917 mutex_lock(&ddebug_lock);
918 list_for_each_entry_safe(dt, nextdt, &ddebug_tables, link) {
919 if (!strcmp(dt->mod_name, mod_name)) {
920 ddebug_table_free(dt);
921 ret = 0;
922 }
923 }
924 mutex_unlock(&ddebug_lock);
925 return ret;
926}
927EXPORT_SYMBOL_GPL(ddebug_remove_module);
928
929static void ddebug_remove_all_tables(void)
930{
931 mutex_lock(&ddebug_lock);
932 while (!list_empty(&ddebug_tables)) {
933 struct ddebug_table *dt = list_entry(ddebug_tables.next,
934 struct ddebug_table,
935 link);
936 ddebug_table_free(dt);
937 }
938 mutex_unlock(&ddebug_lock);
939}
940
6a5c083d
TR
941static __initdata int ddebug_init_success;
942
943static int __init dynamic_debug_init_debugfs(void)
e9d376f0
JB
944{
945 struct dentry *dir, *file;
6a5c083d
TR
946
947 if (!ddebug_init_success)
948 return -ENODEV;
e9d376f0
JB
949
950 dir = debugfs_create_dir("dynamic_debug", NULL);
951 if (!dir)
952 return -ENOMEM;
953 file = debugfs_create_file("control", 0644, dir, NULL,
954 &ddebug_proc_fops);
955 if (!file) {
956 debugfs_remove(dir);
957 return -ENOMEM;
958 }
6a5c083d
TR
959 return 0;
960}
961
962static int __init dynamic_debug_init(void)
963{
964 struct _ddebug *iter, *iter_start;
965 const char *modname = NULL;
b48420c1 966 char *cmdline;
6a5c083d 967 int ret = 0;
41076927
JC
968 int n = 0, entries = 0, modct = 0;
969 int verbose_bytes = 0;
6a5c083d 970
b5b78f83
JC
971 if (__start___verbose == __stop___verbose) {
972 pr_warn("_ddebug table is empty in a "
973 "CONFIG_DYNAMIC_DEBUG build");
974 return 1;
975 }
976 iter = __start___verbose;
977 modname = iter->modname;
978 iter_start = iter;
979 for (; iter < __stop___verbose; iter++) {
41076927
JC
980 entries++;
981 verbose_bytes += strlen(iter->modname) + strlen(iter->function)
982 + strlen(iter->filename) + strlen(iter->format);
983
b5b78f83 984 if (strcmp(modname, iter->modname)) {
41076927 985 modct++;
b5b78f83
JC
986 ret = ddebug_add_module(iter_start, n, modname);
987 if (ret)
af442399 988 goto out_err;
b5b78f83
JC
989 n = 0;
990 modname = iter->modname;
991 iter_start = iter;
e9d376f0 992 }
b5b78f83 993 n++;
e9d376f0 994 }
b5b78f83
JC
995 ret = ddebug_add_module(iter_start, n, modname);
996 if (ret)
af442399 997 goto out_err;
a648ec05 998
af442399 999 ddebug_init_success = 1;
41076927
JC
1000 vpr_info("%d modules, %d entries and %d bytes in ddebug tables,"
1001 " %d bytes in (readonly) verbose section\n",
1002 modct, entries, (int)( modct * sizeof(struct ddebug_table)),
1003 verbose_bytes + (int)(__stop___verbose - __start___verbose));
af442399
JC
1004
1005 /* apply ddebug_query boot param, dont unload tables on err */
a648ec05 1006 if (ddebug_setup_string[0] != '\0') {
f0b919d9
JC
1007 pr_warn("ddebug_query param name is deprecated,"
1008 " change it to dyndbg\n");
8e59b5cf 1009 ret = ddebug_exec_queries(ddebug_setup_string, NULL);
85f7f6c0 1010 if (ret < 0)
4ad275e5
JP
1011 pr_warn("Invalid ddebug boot param %s",
1012 ddebug_setup_string);
a648ec05 1013 else
85f7f6c0 1014 pr_info("%d changes by ddebug_query\n", ret);
a648ec05 1015 }
b48420c1
JC
1016 /* now that ddebug tables are loaded, process all boot args
1017 * again to find and activate queries given in dyndbg params.
1018 * While this has already been done for known boot params, it
1019 * ignored the unknown ones (dyndbg in particular). Reusing
1020 * parse_args avoids ad-hoc parsing. This will also attempt
1021 * to activate queries for not-yet-loaded modules, which is
1022 * slightly noisy if verbose, but harmless.
1023 */
1024 cmdline = kstrdup(saved_command_line, GFP_KERNEL);
1025 parse_args("dyndbg params", cmdline, NULL,
1026 0, 0, 0, &ddebug_dyndbg_boot_param_cb);
1027 kfree(cmdline);
af442399 1028 return 0;
a648ec05 1029
af442399
JC
1030out_err:
1031 ddebug_remove_all_tables();
e9d376f0
JB
1032 return 0;
1033}
6a5c083d 1034/* Allow early initialization for boot messages via boot param */
3ec5652a 1035early_initcall(dynamic_debug_init);
b48420c1 1036
6a5c083d 1037/* Debugfs setup must be done later */
3ec5652a 1038fs_initcall(dynamic_debug_init_debugfs);