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