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