]> Git Repo - linux.git/blame - lib/dynamic_debug.c
dyndbg: reverse module walk in cat control
[linux.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 <[email protected]>
8 * By Greg Banks <[email protected]>
9 * Copyright (c) 2008 Silicon Graphics Inc. All Rights Reserved.
8ba6ebf5 10 * Copyright (C) 2011 Bart Van Assche. All Rights Reserved.
578b1e07 11 * Copyright (C) 2013 Du, Changbin <[email protected]>
e9d376f0
JB
12 */
13
5aa9ffbb 14#define pr_fmt(fmt) "dyndbg: " fmt
4ad275e5 15
e9d376f0
JB
16#include <linux/kernel.h>
17#include <linux/module.h>
fef15d2f
GKH
18#include <linux/moduleparam.h>
19#include <linux/kallsyms.h>
20#include <linux/types.h>
e9d376f0 21#include <linux/mutex.h>
fef15d2f 22#include <linux/proc_fs.h>
e9d376f0 23#include <linux/seq_file.h>
fef15d2f
GKH
24#include <linux/list.h>
25#include <linux/sysctl.h>
e9d376f0 26#include <linux/ctype.h>
fef15d2f 27#include <linux/string.h>
578b1e07 28#include <linux/parser.h>
d338b137 29#include <linux/string_helpers.h>
fef15d2f 30#include <linux/uaccess.h>
e9d376f0
JB
31#include <linux/dynamic_debug.h>
32#include <linux/debugfs.h>
5a0e3ad6 33#include <linux/slab.h>
fef15d2f 34#include <linux/jump_label.h>
8ba6ebf5 35#include <linux/hardirq.h>
e8d9792a 36#include <linux/sched.h>
fef15d2f 37#include <linux/device.h>
ffa10cb4 38#include <linux/netdevice.h>
e9d376f0 39
923abb9d
GP
40#include <rdma/ib_verbs.h>
41
e5ebffe1
JC
42extern struct _ddebug __start___dyndbg[];
43extern struct _ddebug __stop___dyndbg[];
e9d376f0 44
e9d376f0
JB
45struct ddebug_table {
46 struct list_head link;
3e406b1d 47 const char *mod_name;
e9d376f0 48 unsigned int num_ddebugs;
e9d376f0
JB
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
84da83a6
JC
65struct flag_settings {
66 unsigned int flags;
67 unsigned int mask;
68};
69
e9d376f0
JB
70static DEFINE_MUTEX(ddebug_lock);
71static LIST_HEAD(ddebug_tables);
f657fd21 72static int verbose;
74df138d 73module_param(verbose, int, 0644);
09ee10ff
JC
74MODULE_PARM_DESC(verbose, " dynamic_debug/control processing "
75 "( 0 = off (default), 1 = module add/rm, 2 = >control summary, 3 = parsing, 4 = per-site changes)");
e9d376f0 76
2b678319
JC
77/* Return the path relative to source root */
78static inline const char *trim_prefix(const char *path)
79{
80 int skip = strlen(__FILE__) - strlen("lib/dynamic_debug.c");
81
82 if (strncmp(path, __FILE__, skip))
83 skip = 0; /* prefix mismatch, don't skip */
84
85 return path + skip;
86}
87
8ba6ebf5
BVA
88static struct { unsigned flag:8; char opt_char; } opt_array[] = {
89 { _DPRINTK_FLAGS_PRINT, 'p' },
90 { _DPRINTK_FLAGS_INCL_MODNAME, 'm' },
91 { _DPRINTK_FLAGS_INCL_FUNCNAME, 'f' },
92 { _DPRINTK_FLAGS_INCL_LINENO, 'l' },
93 { _DPRINTK_FLAGS_INCL_TID, 't' },
5ca7d2a6 94 { _DPRINTK_FLAGS_NONE, '_' },
8ba6ebf5
BVA
95};
96
f678ce8c
JC
97struct flagsbuf { char buf[ARRAY_SIZE(opt_array)+1]; };
98
e9d376f0 99/* format a string into buf[] which describes the _ddebug's flags */
f678ce8c 100static char *ddebug_describe_flags(unsigned int flags, struct flagsbuf *fb)
e9d376f0 101{
f678ce8c 102 char *p = fb->buf;
8ba6ebf5 103 int i;
e9d376f0 104
8ba6ebf5 105 for (i = 0; i < ARRAY_SIZE(opt_array); ++i)
f678ce8c 106 if (flags & opt_array[i].flag)
8ba6ebf5 107 *p++ = opt_array[i].opt_char;
f678ce8c 108 if (p == fb->buf)
5ca7d2a6 109 *p++ = '_';
e9d376f0
JB
110 *p = '\0';
111
f678ce8c 112 return fb->buf;
e9d376f0
JB
113}
114
481c0e33 115#define vnpr_info(lvl, fmt, ...) \
b8ccd5de 116do { \
481c0e33 117 if (verbose >= lvl) \
f657fd21 118 pr_info(fmt, ##__VA_ARGS__); \
574b3725
JC
119} while (0)
120
481c0e33
JC
121#define vpr_info(fmt, ...) vnpr_info(1, fmt, ##__VA_ARGS__)
122#define v2pr_info(fmt, ...) vnpr_info(2, fmt, ##__VA_ARGS__)
09ee10ff
JC
123#define v3pr_info(fmt, ...) vnpr_info(3, fmt, ##__VA_ARGS__)
124#define v4pr_info(fmt, ...) vnpr_info(4, fmt, ##__VA_ARGS__)
481c0e33 125
f657fd21
JP
126static void vpr_info_dq(const struct ddebug_query *query, const char *msg)
127{
128 /* trim any trailing newlines */
129 int fmtlen = 0;
130
131 if (query->format) {
132 fmtlen = strlen(query->format);
133 while (fmtlen && query->format[fmtlen - 1] == '\n')
134 fmtlen--;
135 }
136
09ee10ff 137 v3pr_info("%s: func=\"%s\" file=\"%s\" module=\"%s\" format=\"%.*s\" lineno=%u-%u\n",
f657fd21 138 msg,
f62fc08f
JC
139 query->function ?: "",
140 query->filename ?: "",
141 query->module ?: "",
142 fmtlen, query->format ?: "",
f657fd21
JP
143 query->first_lineno, query->last_lineno);
144}
145
e9d376f0 146/*
85f7f6c0
JC
147 * Search the tables for _ddebug's which match the given `query' and
148 * apply the `flags' and `mask' to them. Returns number of matching
149 * callsites, normally the same as number of changes. If verbose,
150 * logs the changes. Takes ddebug_lock.
e9d376f0 151 */
85f7f6c0 152static int ddebug_change(const struct ddebug_query *query,
84da83a6 153 struct flag_settings *modifiers)
e9d376f0
JB
154{
155 int i;
156 struct ddebug_table *dt;
157 unsigned int newflags;
158 unsigned int nfound = 0;
bfa3ca44 159 struct flagsbuf fbuf, nbuf;
e9d376f0
JB
160
161 /* search for matching ddebugs */
162 mutex_lock(&ddebug_lock);
163 list_for_each_entry(dt, &ddebug_tables, link) {
164
165 /* match against the module name */
578b1e07
CD
166 if (query->module &&
167 !match_wildcard(query->module, dt->mod_name))
e9d376f0
JB
168 continue;
169
f657fd21 170 for (i = 0; i < dt->num_ddebugs; i++) {
e9d376f0
JB
171 struct _ddebug *dp = &dt->ddebugs[i];
172
173 /* match against the source filename */
d6a238d2 174 if (query->filename &&
578b1e07
CD
175 !match_wildcard(query->filename, dp->filename) &&
176 !match_wildcard(query->filename,
177 kbasename(dp->filename)) &&
178 !match_wildcard(query->filename,
179 trim_prefix(dp->filename)))
e9d376f0
JB
180 continue;
181
182 /* match against the function */
d6a238d2 183 if (query->function &&
578b1e07 184 !match_wildcard(query->function, dp->function))
e9d376f0
JB
185 continue;
186
187 /* match against the format */
4b334484
JC
188 if (query->format) {
189 if (*query->format == '^') {
190 char *p;
191 /* anchored search. match must be at beginning */
192 p = strstr(dp->format, query->format+1);
193 if (p != dp->format)
194 continue;
195 } else if (!strstr(dp->format, query->format))
196 continue;
197 }
e9d376f0
JB
198
199 /* match against the line number range */
200 if (query->first_lineno &&
201 dp->lineno < query->first_lineno)
202 continue;
203 if (query->last_lineno &&
204 dp->lineno > query->last_lineno)
205 continue;
206
207 nfound++;
208
84da83a6 209 newflags = (dp->flags & modifiers->mask) | modifiers->flags;
e9d376f0
JB
210 if (newflags == dp->flags)
211 continue;
e9666d10 212#ifdef CONFIG_JUMP_LABEL
9049fc74 213 if (dp->flags & _DPRINTK_FLAGS_PRINT) {
ee879be3 214 if (!(newflags & _DPRINTK_FLAGS_PRINT))
9049fc74 215 static_branch_disable(&dp->key.dd_key_true);
ee879be3 216 } else if (newflags & _DPRINTK_FLAGS_PRINT) {
9049fc74 217 static_branch_enable(&dp->key.dd_key_true);
ee879be3 218 }
9049fc74 219#endif
bfa3ca44
JC
220 v4pr_info("changed %s:%d [%s]%s %s => %s\n",
221 trim_prefix(dp->filename), dp->lineno,
222 dt->mod_name, dp->function,
223 ddebug_describe_flags(dp->flags, &fbuf),
224 ddebug_describe_flags(newflags, &nbuf));
e9d376f0 225 dp->flags = newflags;
e9d376f0
JB
226 }
227 }
228 mutex_unlock(&ddebug_lock);
229
230 if (!nfound && verbose)
4ad275e5 231 pr_info("no matches for query\n");
85f7f6c0
JC
232
233 return nfound;
e9d376f0
JB
234}
235
e9d376f0
JB
236/*
237 * Split the buffer `buf' into space-separated words.
9898abb3
GB
238 * Handles simple " and ' quoting, i.e. without nested,
239 * embedded or escaped \". Return the number of words
240 * or <0 on error.
e9d376f0
JB
241 */
242static int ddebug_tokenize(char *buf, char *words[], int maxwords)
243{
244 int nwords = 0;
245
9898abb3
GB
246 while (*buf) {
247 char *end;
248
249 /* Skip leading whitespace */
e7d2860b 250 buf = skip_spaces(buf);
9898abb3
GB
251 if (!*buf)
252 break; /* oh, it was trailing whitespace */
8bd6026e
JC
253 if (*buf == '#')
254 break; /* token starts comment, skip rest of line */
9898abb3 255
07100be7 256 /* find `end' of word, whitespace separated or quoted */
9898abb3
GB
257 if (*buf == '"' || *buf == '\'') {
258 int quote = *buf++;
f657fd21 259 for (end = buf; *end && *end != quote; end++)
9898abb3 260 ;
18c216c5
JC
261 if (!*end) {
262 pr_err("unclosed quote: %s\n", buf);
9898abb3 263 return -EINVAL; /* unclosed quote */
18c216c5 264 }
9898abb3 265 } else {
7f6e1f30 266 for (end = buf; *end && !isspace(*end); end++)
9898abb3
GB
267 ;
268 BUG_ON(end == buf);
269 }
9898abb3 270
07100be7 271 /* `buf' is start of word, `end' is one past its end */
18c216c5
JC
272 if (nwords == maxwords) {
273 pr_err("too many words, legal max <=%d\n", maxwords);
9898abb3 274 return -EINVAL; /* ran out of words[] before bytes */
18c216c5 275 }
9898abb3
GB
276 if (*end)
277 *end++ = '\0'; /* terminate the word */
278 words[nwords++] = buf;
279 buf = end;
280 }
e9d376f0 281
09ee10ff 282 if (verbose >= 3) {
e9d376f0 283 int i;
4ad275e5 284 pr_info("split into words:");
f657fd21 285 for (i = 0; i < nwords; i++)
4ad275e5
JP
286 pr_cont(" \"%s\"", words[i]);
287 pr_cont("\n");
e9d376f0
JB
288 }
289
290 return nwords;
291}
292
293/*
294 * Parse a single line number. Note that the empty string ""
295 * is treated as a special case and converted to zero, which
296 * is later treated as a "don't care" value.
297 */
298static inline int parse_lineno(const char *str, unsigned int *val)
299{
e9d376f0
JB
300 BUG_ON(str == NULL);
301 if (*str == '\0') {
302 *val = 0;
303 return 0;
304 }
4592599a 305 if (kstrtouint(str, 10, val) < 0) {
18c216c5
JC
306 pr_err("bad line-number: %s\n", str);
307 return -EINVAL;
308 }
309 return 0;
e9d376f0
JB
310}
311
8037072d
JC
312static int parse_linerange(struct ddebug_query *query, const char *first)
313{
314 char *last = strchr(first, '-');
315
316 if (query->first_lineno || query->last_lineno) {
317 pr_err("match-spec: line used 2x\n");
318 return -EINVAL;
319 }
320 if (last)
321 *last++ = '\0';
322 if (parse_lineno(first, &query->first_lineno) < 0)
323 return -EINVAL;
324 if (last) {
325 /* range <first>-<last> */
326 if (parse_lineno(last, &query->last_lineno) < 0)
327 return -EINVAL;
328
329 /* special case for last lineno not specified */
330 if (query->last_lineno == 0)
331 query->last_lineno = UINT_MAX;
332
333 if (query->last_lineno < query->first_lineno) {
334 pr_err("last-line:%d < 1st-line:%d\n",
335 query->last_lineno,
336 query->first_lineno);
337 return -EINVAL;
338 }
339 } else {
340 query->last_lineno = query->first_lineno;
341 }
09ee10ff 342 v3pr_info("parsed line %d-%d\n", query->first_lineno,
8037072d
JC
343 query->last_lineno);
344 return 0;
345}
346
820874c7
JC
347static int check_set(const char **dest, char *src, char *name)
348{
349 int rc = 0;
350
351 if (*dest) {
352 rc = -EINVAL;
f657fd21
JP
353 pr_err("match-spec:%s val:%s overridden by %s\n",
354 name, *dest, src);
820874c7
JC
355 }
356 *dest = src;
357 return rc;
358}
359
e9d376f0
JB
360/*
361 * Parse words[] as a ddebug query specification, which is a series
952e934d 362 * of (keyword, value) pairs chosen from these possibilities:
e9d376f0
JB
363 *
364 * func <function-name>
365 * file <full-pathname>
366 * file <base-filename>
367 * module <module-name>
368 * format <escaped-string-to-find-in-format>
369 * line <lineno>
370 * line <first-lineno>-<last-lineno> // where either may be empty
820874c7
JC
371 *
372 * Only 1 of each type is allowed.
373 * Returns 0 on success, <0 on error.
e9d376f0
JB
374 */
375static int ddebug_parse_query(char *words[], int nwords,
8e59b5cf 376 struct ddebug_query *query, const char *modname)
e9d376f0
JB
377{
378 unsigned int i;
bd8c154a 379 int rc = 0;
aaebe329 380 char *fline;
952e934d
GKH
381
382 /* check we have an even number of words */
383 if (nwords % 2 != 0) {
384 pr_err("expecting pairs of match-spec <value>\n");
385 return -EINVAL;
386 }
e9d376f0 387
7f6e1f30 388 if (modname)
8e59b5cf
JC
389 /* support $modname.dyndbg=<multiple queries> */
390 query->module = modname;
391
952e934d 392 for (i = 0; i < nwords; i += 2) {
e5e5fcef
JC
393 char *keyword = words[i];
394 char *arg = words[i+1];
395
396 if (!strcmp(keyword, "func")) {
397 rc = check_set(&query->function, arg, "func");
398 } else if (!strcmp(keyword, "file")) {
399 if (check_set(&query->filename, arg, "file"))
aaebe329
JC
400 return -EINVAL;
401
402 /* tail :$info is function or line-range */
403 fline = strchr(query->filename, ':');
404 if (!fline)
7b1ae248 405 continue;
aaebe329
JC
406 *fline++ = '\0';
407 if (isalpha(*fline) || *fline == '*' || *fline == '?') {
408 /* take as function name */
409 if (check_set(&query->function, fline, "func"))
410 return -EINVAL;
411 } else {
412 if (parse_linerange(query, fline))
413 return -EINVAL;
414 }
e5e5fcef
JC
415 } else if (!strcmp(keyword, "module")) {
416 rc = check_set(&query->module, arg, "module");
417 } else if (!strcmp(keyword, "format")) {
418 string_unescape_inplace(arg, UNESCAPE_SPACE |
d338b137
AS
419 UNESCAPE_OCTAL |
420 UNESCAPE_SPECIAL);
e5e5fcef
JC
421 rc = check_set(&query->format, arg, "format");
422 } else if (!strcmp(keyword, "line")) {
423 if (parse_linerange(query, arg))
e9d376f0 424 return -EINVAL;
e9d376f0 425 } else {
e5e5fcef 426 pr_err("unknown keyword \"%s\"\n", keyword);
e9d376f0
JB
427 return -EINVAL;
428 }
820874c7
JC
429 if (rc)
430 return rc;
e9d376f0 431 }
574b3725 432 vpr_info_dq(query, "parsed");
e9d376f0
JB
433 return 0;
434}
435
436/*
437 * Parse `str' as a flags specification, format [-+=][p]+.
438 * Sets up *maskp and *flagsp to be used when changing the
439 * flags fields of matched _ddebug's. Returns 0 on success
440 * or <0 on error.
441 */
84da83a6 442static int ddebug_parse_flags(const char *str, struct flag_settings *modifiers)
e9d376f0 443{
84da83a6 444 int op, i;
e9d376f0
JB
445
446 switch (*str) {
447 case '+':
448 case '-':
449 case '=':
450 op = *str++;
451 break;
452 default:
18c216c5 453 pr_err("bad flag-op %c, at start of %s\n", *str, str);
e9d376f0
JB
454 return -EINVAL;
455 }
09ee10ff 456 v3pr_info("op='%c'\n", op);
e9d376f0 457
f657fd21 458 for (; *str ; ++str) {
8ba6ebf5
BVA
459 for (i = ARRAY_SIZE(opt_array) - 1; i >= 0; i--) {
460 if (*str == opt_array[i].opt_char) {
84da83a6 461 modifiers->flags |= opt_array[i].flag;
8ba6ebf5
BVA
462 break;
463 }
e9d376f0 464 }
18c216c5 465 if (i < 0) {
0b8f96be 466 pr_err("unknown flag '%c'\n", *str);
8ba6ebf5 467 return -EINVAL;
18c216c5 468 }
e9d376f0 469 }
09ee10ff 470 v3pr_info("flags=0x%x\n", modifiers->flags);
e9d376f0 471
84da83a6 472 /* calculate final flags, mask based upon op */
e9d376f0
JB
473 switch (op) {
474 case '=':
84da83a6
JC
475 /* modifiers->flags already set */
476 modifiers->mask = 0;
e9d376f0
JB
477 break;
478 case '+':
84da83a6 479 modifiers->mask = ~0U;
e9d376f0
JB
480 break;
481 case '-':
84da83a6
JC
482 modifiers->mask = ~modifiers->flags;
483 modifiers->flags = 0;
e9d376f0
JB
484 break;
485 }
09ee10ff 486 v3pr_info("*flagsp=0x%x *maskp=0x%x\n", modifiers->flags, modifiers->mask);
84da83a6 487
e9d376f0
JB
488 return 0;
489}
490
8e59b5cf 491static int ddebug_exec_query(char *query_string, const char *modname)
fd89cfb8 492{
84da83a6 493 struct flag_settings modifiers = {};
9c9d0acb 494 struct ddebug_query query = {};
fd89cfb8 495#define MAXWORDS 9
85f7f6c0 496 int nwords, nfound;
fd89cfb8
TR
497 char *words[MAXWORDS];
498
499 nwords = ddebug_tokenize(query_string, words, MAXWORDS);
18c216c5
JC
500 if (nwords <= 0) {
501 pr_err("tokenize failed\n");
fd89cfb8 502 return -EINVAL;
18c216c5
JC
503 }
504 /* check flags 1st (last arg) so query is pairs of spec,val */
84da83a6 505 if (ddebug_parse_flags(words[nwords-1], &modifiers)) {
18c216c5 506 pr_err("flags parse failed\n");
fd89cfb8 507 return -EINVAL;
18c216c5
JC
508 }
509 if (ddebug_parse_query(words, nwords-1, &query, modname)) {
510 pr_err("query parse failed\n");
fd89cfb8 511 return -EINVAL;
18c216c5 512 }
fd89cfb8 513 /* actually go and implement the change */
84da83a6 514 nfound = ddebug_change(&query, &modifiers);
f657fd21 515 vpr_info_dq(&query, nfound ? "applied" : "no-match");
85f7f6c0
JC
516
517 return nfound;
518}
519
520/* handle multiple queries in query string, continue on error, return
521 last error or number of matching callsites. Module name is either
522 in param (for boot arg) or perhaps in query string.
523*/
a2d375ed 524static int ddebug_exec_queries(char *query, const char *modname)
85f7f6c0
JC
525{
526 char *split;
527 int i, errs = 0, exitcode = 0, rc, nfound = 0;
528
529 for (i = 0; query; query = split) {
530 split = strpbrk(query, ";\n");
531 if (split)
532 *split++ = '\0';
533
534 query = skip_spaces(query);
535 if (!query || !*query || *query == '#')
536 continue;
537
1f8818e3 538 vpr_info("query %d: \"%s\" mod:%s\n", i, query, modname ?: "*");
85f7f6c0 539
8e59b5cf 540 rc = ddebug_exec_query(query, modname);
85f7f6c0
JC
541 if (rc < 0) {
542 errs++;
543 exitcode = rc;
f657fd21 544 } else {
85f7f6c0 545 nfound += rc;
f657fd21 546 }
85f7f6c0
JC
547 i++;
548 }
7edde0c8 549 if (i)
09ee10ff 550 v2pr_info("processed %d queries, with %d matches, %d errs\n",
7edde0c8 551 i, nfound, errs);
85f7f6c0
JC
552
553 if (exitcode)
554 return exitcode;
555 return nfound;
fd89cfb8 556}
a2d375ed
JC
557
558/**
559 * dynamic_debug_exec_queries - select and change dynamic-debug prints
560 * @query: query-string described in admin-guide/dynamic-debug-howto
561 * @modname: string containing module name, usually &module.mod_name
562 *
563 * This uses the >/proc/dynamic_debug/control reader, allowing module
564 * authors to modify their dynamic-debug callsites. The modname is
565 * canonically struct module.mod_name, but can also be null or a
566 * module-wildcard, for example: "drm*".
567 */
568int dynamic_debug_exec_queries(const char *query, const char *modname)
569{
570 int rc;
3577afb0 571 char *qry; /* writable copy of query */
a2d375ed 572
3577afb0
JC
573 if (!query) {
574 pr_err("non-null query/command string expected\n");
575 return -EINVAL;
576 }
577 qry = kstrndup(query, PAGE_SIZE, GFP_KERNEL);
578 if (!qry)
a2d375ed
JC
579 return -ENOMEM;
580
581 rc = ddebug_exec_queries(qry, modname);
582 kfree(qry);
583 return rc;
584}
585EXPORT_SYMBOL_GPL(dynamic_debug_exec_queries);
fd89cfb8 586
431625da
JB
587#define PREFIX_SIZE 64
588
589static int remaining(int wrote)
590{
591 if (PREFIX_SIZE - wrote > 0)
592 return PREFIX_SIZE - wrote;
593 return 0;
594}
595
640d1eaf 596static char *__dynamic_emit_prefix(const struct _ddebug *desc, char *buf)
8ba6ebf5 597{
431625da
JB
598 int pos_after_tid;
599 int pos = 0;
8ba6ebf5 600
431625da 601 if (desc->flags & _DPRINTK_FLAGS_INCL_TID) {
8ba6ebf5 602 if (in_interrupt())
798efc60 603 pos += snprintf(buf + pos, remaining(pos), "<intr> ");
8ba6ebf5 604 else
431625da 605 pos += snprintf(buf + pos, remaining(pos), "[%d] ",
798efc60 606 task_pid_vnr(current));
8ba6ebf5 607 }
431625da
JB
608 pos_after_tid = pos;
609 if (desc->flags & _DPRINTK_FLAGS_INCL_MODNAME)
610 pos += snprintf(buf + pos, remaining(pos), "%s:",
798efc60 611 desc->modname);
431625da
JB
612 if (desc->flags & _DPRINTK_FLAGS_INCL_FUNCNAME)
613 pos += snprintf(buf + pos, remaining(pos), "%s:",
798efc60 614 desc->function);
431625da 615 if (desc->flags & _DPRINTK_FLAGS_INCL_LINENO)
07100be7 616 pos += snprintf(buf + pos, remaining(pos), "%d:",
798efc60 617 desc->lineno);
431625da
JB
618 if (pos - pos_after_tid)
619 pos += snprintf(buf + pos, remaining(pos), " ");
620 if (pos >= PREFIX_SIZE)
621 buf[PREFIX_SIZE - 1] = '\0';
6c2140ee 622
431625da 623 return buf;
6c2140ee
JP
624}
625
640d1eaf
JC
626static inline char *dynamic_emit_prefix(struct _ddebug *desc, char *buf)
627{
628 if (unlikely(desc->flags & _DPRINTK_FLAGS_INCL_ANY))
629 return __dynamic_emit_prefix(desc, buf);
630 return buf;
631}
632
906d2015 633void __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...)
8ba6ebf5
BVA
634{
635 va_list args;
431625da 636 struct va_format vaf;
640d1eaf 637 char buf[PREFIX_SIZE] = "";
8ba6ebf5
BVA
638
639 BUG_ON(!descriptor);
640 BUG_ON(!fmt);
641
642 va_start(args, fmt);
798efc60 643
431625da
JB
644 vaf.fmt = fmt;
645 vaf.va = &args;
798efc60 646
906d2015 647 printk(KERN_DEBUG "%s%pV", dynamic_emit_prefix(descriptor, buf), &vaf);
798efc60 648
8ba6ebf5 649 va_end(args);
8ba6ebf5
BVA
650}
651EXPORT_SYMBOL(__dynamic_pr_debug);
652
906d2015 653void __dynamic_dev_dbg(struct _ddebug *descriptor,
cbc46635
JP
654 const struct device *dev, const char *fmt, ...)
655{
656 struct va_format vaf;
657 va_list args;
cbc46635
JP
658
659 BUG_ON(!descriptor);
660 BUG_ON(!fmt);
661
662 va_start(args, fmt);
798efc60 663
cbc46635
JP
664 vaf.fmt = fmt;
665 vaf.va = &args;
798efc60
JP
666
667 if (!dev) {
906d2015 668 printk(KERN_DEBUG "(NULL device *): %pV", &vaf);
798efc60 669 } else {
640d1eaf 670 char buf[PREFIX_SIZE] = "";
798efc60 671
a39d4a85 672 dev_printk_emit(LOGLEVEL_DEBUG, dev, "%s%s %s: %pV",
906d2015
JP
673 dynamic_emit_prefix(descriptor, buf),
674 dev_driver_string(dev), dev_name(dev),
675 &vaf);
798efc60
JP
676 }
677
cbc46635 678 va_end(args);
cbc46635
JP
679}
680EXPORT_SYMBOL(__dynamic_dev_dbg);
681
0feefd97
JB
682#ifdef CONFIG_NET
683
906d2015
JP
684void __dynamic_netdev_dbg(struct _ddebug *descriptor,
685 const struct net_device *dev, const char *fmt, ...)
ffa10cb4
JB
686{
687 struct va_format vaf;
688 va_list args;
ffa10cb4
JB
689
690 BUG_ON(!descriptor);
691 BUG_ON(!fmt);
692
693 va_start(args, fmt);
b004ff49 694
ffa10cb4
JB
695 vaf.fmt = fmt;
696 vaf.va = &args;
b004ff49
JP
697
698 if (dev && dev->dev.parent) {
640d1eaf 699 char buf[PREFIX_SIZE] = "";
666f355f 700
a39d4a85 701 dev_printk_emit(LOGLEVEL_DEBUG, dev->dev.parent,
906d2015
JP
702 "%s%s %s %s%s: %pV",
703 dynamic_emit_prefix(descriptor, buf),
704 dev_driver_string(dev->dev.parent),
705 dev_name(dev->dev.parent),
706 netdev_name(dev), netdev_reg_state(dev),
707 &vaf);
b004ff49 708 } else if (dev) {
906d2015
JP
709 printk(KERN_DEBUG "%s%s: %pV", netdev_name(dev),
710 netdev_reg_state(dev), &vaf);
b004ff49 711 } else {
906d2015 712 printk(KERN_DEBUG "(NULL net_device): %pV", &vaf);
b004ff49
JP
713 }
714
ffa10cb4 715 va_end(args);
ffa10cb4
JB
716}
717EXPORT_SYMBOL(__dynamic_netdev_dbg);
718
0feefd97
JB
719#endif
720
923abb9d
GP
721#if IS_ENABLED(CONFIG_INFINIBAND)
722
723void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
724 const struct ib_device *ibdev, const char *fmt, ...)
725{
726 struct va_format vaf;
727 va_list args;
728
729 va_start(args, fmt);
730
731 vaf.fmt = fmt;
732 vaf.va = &args;
733
734 if (ibdev && ibdev->dev.parent) {
640d1eaf 735 char buf[PREFIX_SIZE] = "";
923abb9d
GP
736
737 dev_printk_emit(LOGLEVEL_DEBUG, ibdev->dev.parent,
738 "%s%s %s %s: %pV",
739 dynamic_emit_prefix(descriptor, buf),
740 dev_driver_string(ibdev->dev.parent),
741 dev_name(ibdev->dev.parent),
742 dev_name(&ibdev->dev),
743 &vaf);
744 } else if (ibdev) {
745 printk(KERN_DEBUG "%s: %pV", dev_name(&ibdev->dev), &vaf);
746 } else {
747 printk(KERN_DEBUG "(NULL ib_device): %pV", &vaf);
748 }
749
750 va_end(args);
751}
752EXPORT_SYMBOL(__dynamic_ibdev_dbg);
753
754#endif
755
5ca17397
AH
756/*
757 * Install a noop handler to make dyndbg look like a normal kernel cli param.
758 * This avoids warnings about dyndbg being an unknown cli param when supplied
759 * by a user.
760 */
761static __init int dyndbg_setup(char *str)
762{
763 return 1;
764}
765
766__setup("dyndbg=", dyndbg_setup);
767
e9d376f0 768/*
231821d4 769 * File_ops->write method for <debugfs>/dynamic_debug/control. Gathers the
e9d376f0
JB
770 * command text from userspace, parses and executes it.
771 */
7281491c 772#define USER_BUF_PAGE 4096
e9d376f0
JB
773static ssize_t ddebug_proc_write(struct file *file, const char __user *ubuf,
774 size_t len, loff_t *offp)
775{
7281491c 776 char *tmpbuf;
fd89cfb8 777 int ret;
e9d376f0
JB
778
779 if (len == 0)
780 return 0;
7281491c
JC
781 if (len > USER_BUF_PAGE - 1) {
782 pr_warn("expected <%d bytes into control\n", USER_BUF_PAGE);
e9d376f0 783 return -E2BIG;
7281491c 784 }
16e5c1fc
AV
785 tmpbuf = memdup_user_nul(ubuf, len);
786 if (IS_ERR(tmpbuf))
787 return PTR_ERR(tmpbuf);
09ee10ff 788 v2pr_info("read %zu bytes from userspace\n", len);
e9d376f0 789
8e59b5cf 790 ret = ddebug_exec_queries(tmpbuf, NULL);
7281491c 791 kfree(tmpbuf);
85f7f6c0 792 if (ret < 0)
fd89cfb8 793 return ret;
e9d376f0
JB
794
795 *offp += len;
796 return len;
797}
798
799/*
800 * Set the iterator to point to the first _ddebug object
801 * and return a pointer to that first object. Returns
802 * NULL if there are no _ddebugs at all.
803 */
804static struct _ddebug *ddebug_iter_first(struct ddebug_iter *iter)
805{
806 if (list_empty(&ddebug_tables)) {
807 iter->table = NULL;
808 iter->idx = 0;
809 return NULL;
810 }
811 iter->table = list_entry(ddebug_tables.next,
812 struct ddebug_table, link);
813 iter->idx = 0;
814 return &iter->table->ddebugs[iter->idx];
815}
816
817/*
818 * Advance the iterator to point to the next _ddebug
819 * object from the one the iterator currently points at,
820 * and returns a pointer to the new _ddebug. Returns
821 * NULL if the iterator has seen all the _ddebugs.
822 */
823static struct _ddebug *ddebug_iter_next(struct ddebug_iter *iter)
824{
825 if (iter->table == NULL)
826 return NULL;
827 if (++iter->idx == iter->table->num_ddebugs) {
828 /* iterate to next table */
829 iter->idx = 0;
830 if (list_is_last(&iter->table->link, &ddebug_tables)) {
831 iter->table = NULL;
832 return NULL;
833 }
834 iter->table = list_entry(iter->table->link.next,
835 struct ddebug_table, link);
836 }
837 return &iter->table->ddebugs[iter->idx];
838}
839
840/*
841 * Seq_ops start method. Called at the start of every
842 * read() call from userspace. Takes the ddebug_lock and
843 * seeks the seq_file's iterator to the given position.
844 */
845static void *ddebug_proc_start(struct seq_file *m, loff_t *pos)
846{
847 struct ddebug_iter *iter = m->private;
848 struct _ddebug *dp;
849 int n = *pos;
850
e9d376f0
JB
851 mutex_lock(&ddebug_lock);
852
853 if (!n)
854 return SEQ_START_TOKEN;
855 if (n < 0)
856 return NULL;
857 dp = ddebug_iter_first(iter);
858 while (dp != NULL && --n > 0)
859 dp = ddebug_iter_next(iter);
860 return dp;
861}
862
863/*
864 * Seq_ops next method. Called several times within a read()
865 * call from userspace, with ddebug_lock held. Walks to the
866 * next _ddebug object with a special case for the header line.
867 */
868static void *ddebug_proc_next(struct seq_file *m, void *p, loff_t *pos)
869{
870 struct ddebug_iter *iter = m->private;
871 struct _ddebug *dp;
872
e9d376f0
JB
873 if (p == SEQ_START_TOKEN)
874 dp = ddebug_iter_first(iter);
875 else
876 dp = ddebug_iter_next(iter);
877 ++*pos;
878 return dp;
879}
880
881/*
882 * Seq_ops show method. Called several times within a read()
883 * call from userspace, with ddebug_lock held. Formats the
884 * current _ddebug as a single human-readable line, with a
885 * special case for the header line.
886 */
887static int ddebug_proc_show(struct seq_file *m, void *p)
888{
889 struct ddebug_iter *iter = m->private;
890 struct _ddebug *dp = p;
f678ce8c 891 struct flagsbuf flags;
e9d376f0 892
e9d376f0
JB
893 if (p == SEQ_START_TOKEN) {
894 seq_puts(m,
f657fd21 895 "# filename:lineno [module]function flags format\n");
e9d376f0
JB
896 return 0;
897 }
898
5ca7d2a6 899 seq_printf(m, "%s:%u [%s]%s =%s \"",
f657fd21
JP
900 trim_prefix(dp->filename), dp->lineno,
901 iter->table->mod_name, dp->function,
f678ce8c 902 ddebug_describe_flags(dp->flags, &flags));
e9d376f0
JB
903 seq_escape(m, dp->format, "\t\r\n\"");
904 seq_puts(m, "\"\n");
905
906 return 0;
907}
908
909/*
910 * Seq_ops stop method. Called at the end of each read()
911 * call from userspace. Drops ddebug_lock.
912 */
913static void ddebug_proc_stop(struct seq_file *m, void *p)
914{
e9d376f0
JB
915 mutex_unlock(&ddebug_lock);
916}
917
918static const struct seq_operations ddebug_proc_seqops = {
919 .start = ddebug_proc_start,
920 .next = ddebug_proc_next,
921 .show = ddebug_proc_show,
922 .stop = ddebug_proc_stop
923};
924
e9d376f0
JB
925static int ddebug_proc_open(struct inode *inode, struct file *file)
926{
4bad78c5
RJ
927 return seq_open_private(file, &ddebug_proc_seqops,
928 sizeof(struct ddebug_iter));
e9d376f0
JB
929}
930
931static const struct file_operations ddebug_proc_fops = {
932 .owner = THIS_MODULE,
933 .open = ddebug_proc_open,
934 .read = seq_read,
935 .llseek = seq_lseek,
936 .release = seq_release_private,
937 .write = ddebug_proc_write
938};
939
239a5791
GKH
940static const struct proc_ops proc_fops = {
941 .proc_open = ddebug_proc_open,
942 .proc_read = seq_read,
943 .proc_lseek = seq_lseek,
944 .proc_release = seq_release_private,
945 .proc_write = ddebug_proc_write
946};
947
e9d376f0
JB
948/*
949 * Allocate a new ddebug_table for the given module
950 * and add it to the global list.
951 */
952int ddebug_add_module(struct _ddebug *tab, unsigned int n,
953 const char *name)
954{
955 struct ddebug_table *dt;
e9d376f0
JB
956
957 dt = kzalloc(sizeof(*dt), GFP_KERNEL);
513770f5
RV
958 if (dt == NULL) {
959 pr_err("error adding module: %s\n", name);
e9d376f0 960 return -ENOMEM;
513770f5 961 }
cdf6d006
RV
962 /*
963 * For built-in modules, name lives in .rodata and is
964 * immortal. For loaded modules, name points at the name[]
965 * member of struct module, which lives at least as long as
966 * this struct ddebug_table.
967 */
968 dt->mod_name = name;
e9d376f0 969 dt->num_ddebugs = n;
e9d376f0
JB
970 dt->ddebugs = tab;
971
972 mutex_lock(&ddebug_lock);
2ad556f7 973 list_add_tail(&dt->link, &ddebug_tables);
e9d376f0
JB
974 mutex_unlock(&ddebug_lock);
975
09ee10ff 976 vpr_info("%3u debug prints in module %s\n", n, dt->mod_name);
e9d376f0
JB
977 return 0;
978}
e9d376f0 979
6ab676e9
JC
980/* helper for ddebug_dyndbg_(boot|module)_param_cb */
981static int ddebug_dyndbg_param_cb(char *param, char *val,
982 const char *modname, int on_err)
b48420c1 983{
b48420c1
JC
984 char *sep;
985
986 sep = strchr(param, '.');
987 if (sep) {
6ab676e9 988 /* needed only for ddebug_dyndbg_boot_param_cb */
b48420c1
JC
989 *sep = '\0';
990 modname = param;
991 param = sep + 1;
992 }
993 if (strcmp(param, "dyndbg"))
6ab676e9 994 return on_err; /* determined by caller */
b48420c1 995
8e59b5cf
JC
996 ddebug_exec_queries((val ? val : "+p"), modname);
997
9dbbc3b9 998 return 0; /* query failure shouldn't stop module load */
b48420c1
JC
999}
1000
6ab676e9
JC
1001/* handle both dyndbg and $module.dyndbg params at boot */
1002static int ddebug_dyndbg_boot_param_cb(char *param, char *val,
ecc86170 1003 const char *unused, void *arg)
b48420c1 1004{
6ab676e9
JC
1005 vpr_info("%s=\"%s\"\n", param, val);
1006 return ddebug_dyndbg_param_cb(param, val, NULL, 0);
1007}
b48420c1 1008
6ab676e9
JC
1009/*
1010 * modprobe foo finds foo.params in boot-args, strips "foo.", and
1011 * passes them to load_module(). This callback gets unknown params,
1012 * processes dyndbg params, rejects others.
1013 */
1014int ddebug_dyndbg_module_param_cb(char *param, char *val, const char *module)
1015{
1016 vpr_info("module: %s %s=\"%s\"\n", module, param, val);
1017 return ddebug_dyndbg_param_cb(param, val, module, -ENOENT);
b48420c1
JC
1018}
1019
e9d376f0
JB
1020static void ddebug_table_free(struct ddebug_table *dt)
1021{
1022 list_del_init(&dt->link);
e9d376f0
JB
1023 kfree(dt);
1024}
1025
1026/*
1027 * Called in response to a module being unloaded. Removes
1028 * any ddebug_table's which point at the module.
1029 */
ff49d74a 1030int ddebug_remove_module(const char *mod_name)
e9d376f0
JB
1031{
1032 struct ddebug_table *dt, *nextdt;
1033 int ret = -ENOENT;
1034
e9d376f0
JB
1035 mutex_lock(&ddebug_lock);
1036 list_for_each_entry_safe(dt, nextdt, &ddebug_tables, link) {
4573fe15 1037 if (dt->mod_name == mod_name) {
e9d376f0
JB
1038 ddebug_table_free(dt);
1039 ret = 0;
4573fe15 1040 break;
e9d376f0
JB
1041 }
1042 }
1043 mutex_unlock(&ddebug_lock);
7a5e202d
JC
1044 if (!ret)
1045 v2pr_info("removed module \"%s\"\n", mod_name);
e9d376f0
JB
1046 return ret;
1047}
e9d376f0
JB
1048
1049static void ddebug_remove_all_tables(void)
1050{
1051 mutex_lock(&ddebug_lock);
1052 while (!list_empty(&ddebug_tables)) {
1053 struct ddebug_table *dt = list_entry(ddebug_tables.next,
1054 struct ddebug_table,
1055 link);
1056 ddebug_table_free(dt);
1057 }
1058 mutex_unlock(&ddebug_lock);
1059}
1060
6a5c083d
TR
1061static __initdata int ddebug_init_success;
1062
239a5791 1063static int __init dynamic_debug_init_control(void)
e9d376f0 1064{
239a5791
GKH
1065 struct proc_dir_entry *procfs_dir;
1066 struct dentry *debugfs_dir;
6a5c083d
TR
1067
1068 if (!ddebug_init_success)
1069 return -ENODEV;
e9d376f0 1070
239a5791
GKH
1071 /* Create the control file in debugfs if it is enabled */
1072 if (debugfs_initialized()) {
1073 debugfs_dir = debugfs_create_dir("dynamic_debug", NULL);
1074 debugfs_create_file("control", 0644, debugfs_dir, NULL,
1075 &ddebug_proc_fops);
1076 }
1077
1078 /* Also create the control file in procfs */
1079 procfs_dir = proc_mkdir("dynamic_debug", NULL);
1080 if (procfs_dir)
1081 proc_create("control", 0644, procfs_dir, &proc_fops);
9fd714cd 1082
6a5c083d
TR
1083 return 0;
1084}
1085
1086static int __init dynamic_debug_init(void)
1087{
1088 struct _ddebug *iter, *iter_start;
1089 const char *modname = NULL;
b48420c1 1090 char *cmdline;
6a5c083d 1091 int ret = 0;
41076927 1092 int n = 0, entries = 0, modct = 0;
6a5c083d 1093
e5ebffe1 1094 if (&__start___dyndbg == &__stop___dyndbg) {
ceabef7d
OZ
1095 if (IS_ENABLED(CONFIG_DYNAMIC_DEBUG)) {
1096 pr_warn("_ddebug table is empty in a CONFIG_DYNAMIC_DEBUG build\n");
1097 return 1;
1098 }
1099 pr_info("Ignore empty _ddebug table in a CONFIG_DYNAMIC_DEBUG_CORE build\n");
1100 ddebug_init_success = 1;
1101 return 0;
b5b78f83 1102 }
e5ebffe1 1103 iter = __start___dyndbg;
b5b78f83
JC
1104 modname = iter->modname;
1105 iter_start = iter;
e5ebffe1 1106 for (; iter < __stop___dyndbg; iter++) {
41076927 1107 entries++;
b5b78f83 1108 if (strcmp(modname, iter->modname)) {
41076927 1109 modct++;
b5b78f83
JC
1110 ret = ddebug_add_module(iter_start, n, modname);
1111 if (ret)
af442399 1112 goto out_err;
b5b78f83
JC
1113 n = 0;
1114 modname = iter->modname;
1115 iter_start = iter;
e9d376f0 1116 }
b5b78f83 1117 n++;
e9d376f0 1118 }
b5b78f83
JC
1119 ret = ddebug_add_module(iter_start, n, modname);
1120 if (ret)
af442399 1121 goto out_err;
a648ec05 1122
af442399 1123 ddebug_init_success = 1;
7af56628
JC
1124 vpr_info("%d prdebugs in %d modules, %d KiB in ddebug tables, %d kiB in __dyndbg section\n",
1125 entries, modct, (int)((modct * sizeof(struct ddebug_table)) >> 10),
1126 (int)((entries * sizeof(struct _ddebug)) >> 10));
af442399 1127
b48420c1
JC
1128 /* now that ddebug tables are loaded, process all boot args
1129 * again to find and activate queries given in dyndbg params.
1130 * While this has already been done for known boot params, it
1131 * ignored the unknown ones (dyndbg in particular). Reusing
1132 * parse_args avoids ad-hoc parsing. This will also attempt
1133 * to activate queries for not-yet-loaded modules, which is
1134 * slightly noisy if verbose, but harmless.
1135 */
1136 cmdline = kstrdup(saved_command_line, GFP_KERNEL);
1137 parse_args("dyndbg params", cmdline, NULL,
ecc86170 1138 0, 0, 0, NULL, &ddebug_dyndbg_boot_param_cb);
b48420c1 1139 kfree(cmdline);
af442399 1140 return 0;
a648ec05 1141
af442399
JC
1142out_err:
1143 ddebug_remove_all_tables();
e9d376f0
JB
1144 return 0;
1145}
6a5c083d 1146/* Allow early initialization for boot messages via boot param */
3ec5652a 1147early_initcall(dynamic_debug_init);
b48420c1 1148
6a5c083d 1149/* Debugfs setup must be done later */
239a5791 1150fs_initcall(dynamic_debug_init_control);
This page took 0.764408 seconds and 4 git commands to generate.