xref: /linux/lib/dynamic_debug.c (revision 509d3f45847627f4c5cdce004c3ec79262b5239c)
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  * Copyright (C) 2013 Du, Changbin <changbin.du@gmail.com>
12  */
13 
14 #define pr_fmt(fmt) "dyndbg: " fmt
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 
40 #include <rdma/ib_verbs.h>
41 
42 extern struct _ddebug __start___dyndbg[];
43 extern struct _ddebug __stop___dyndbg[];
44 extern struct ddebug_class_map __start___dyndbg_classes[];
45 extern struct ddebug_class_map __stop___dyndbg_classes[];
46 
47 struct ddebug_table {
48 	struct list_head link, maps;
49 	const char *mod_name;
50 	unsigned int num_ddebugs;
51 	struct _ddebug *ddebugs;
52 };
53 
54 struct ddebug_query {
55 	const char *filename;
56 	const char *module;
57 	const char *function;
58 	const char *format;
59 	const char *class_string;
60 	unsigned int first_lineno, last_lineno;
61 };
62 
63 struct ddebug_iter {
64 	struct ddebug_table *table;
65 	int idx;
66 };
67 
68 struct flag_settings {
69 	unsigned int flags;
70 	unsigned int mask;
71 };
72 
73 static DEFINE_MUTEX(ddebug_lock);
74 static LIST_HEAD(ddebug_tables);
75 static int verbose;
76 module_param(verbose, int, 0644);
77 MODULE_PARM_DESC(verbose, " dynamic_debug/control processing "
78 		 "( 0 = off (default), 1 = module add/rm, 2 = >control summary, 3 = parsing, 4 = per-site changes)");
79 
80 /* Return the path relative to source root */
trim_prefix(const char * path)81 static inline const char *trim_prefix(const char *path)
82 {
83 	int skip = strlen(__FILE__) - strlen("lib/dynamic_debug.c");
84 
85 	if (strncmp(path, __FILE__, skip))
86 		skip = 0; /* prefix mismatch, don't skip */
87 
88 	return path + skip;
89 }
90 
91 static const struct { unsigned flag:8; char opt_char; } opt_array[] = {
92 	{ _DPRINTK_FLAGS_PRINT, 'p' },
93 	{ _DPRINTK_FLAGS_INCL_MODNAME, 'm' },
94 	{ _DPRINTK_FLAGS_INCL_FUNCNAME, 'f' },
95 	{ _DPRINTK_FLAGS_INCL_SOURCENAME, 's' },
96 	{ _DPRINTK_FLAGS_INCL_LINENO, 'l' },
97 	{ _DPRINTK_FLAGS_INCL_TID, 't' },
98 	{ _DPRINTK_FLAGS_INCL_STACK, 'd' },
99 	{ _DPRINTK_FLAGS_NONE, '_' },
100 };
101 
102 struct flagsbuf { char buf[ARRAY_SIZE(opt_array)+1]; };
103 
104 /* format a string into buf[] which describes the _ddebug's flags */
ddebug_describe_flags(unsigned int flags,struct flagsbuf * fb)105 static char *ddebug_describe_flags(unsigned int flags, struct flagsbuf *fb)
106 {
107 	char *p = fb->buf;
108 	int i;
109 
110 	for (i = 0; i < ARRAY_SIZE(opt_array); ++i)
111 		if (flags & opt_array[i].flag)
112 			*p++ = opt_array[i].opt_char;
113 	if (p == fb->buf)
114 		*p++ = '_';
115 	*p = '\0';
116 
117 	return fb->buf;
118 }
119 
120 #define vnpr_info(lvl, fmt, ...)				\
121 do {								\
122 	if (verbose >= lvl)					\
123 		pr_info(fmt, ##__VA_ARGS__);			\
124 } while (0)
125 
126 #define vpr_info(fmt, ...)	vnpr_info(1, fmt, ##__VA_ARGS__)
127 #define v2pr_info(fmt, ...)	vnpr_info(2, fmt, ##__VA_ARGS__)
128 #define v3pr_info(fmt, ...)	vnpr_info(3, fmt, ##__VA_ARGS__)
129 #define v4pr_info(fmt, ...)	vnpr_info(4, fmt, ##__VA_ARGS__)
130 
vpr_info_dq(const struct ddebug_query * query,const char * msg)131 static void vpr_info_dq(const struct ddebug_query *query, const char *msg)
132 {
133 	/* trim any trailing newlines */
134 	int fmtlen = 0;
135 
136 	if (query->format) {
137 		fmtlen = strlen(query->format);
138 		while (fmtlen && query->format[fmtlen - 1] == '\n')
139 			fmtlen--;
140 	}
141 
142 	v3pr_info("%s: func=\"%s\" file=\"%s\" module=\"%s\" format=\"%.*s\" lineno=%u-%u class=%s\n",
143 		  msg,
144 		  query->function ?: "",
145 		  query->filename ?: "",
146 		  query->module ?: "",
147 		  fmtlen, query->format ?: "",
148 		  query->first_lineno, query->last_lineno, query->class_string);
149 }
150 
ddebug_find_valid_class(struct ddebug_table const * dt,const char * class_string,int * class_id)151 static struct ddebug_class_map *ddebug_find_valid_class(struct ddebug_table const *dt,
152 							  const char *class_string, int *class_id)
153 {
154 	struct ddebug_class_map *map;
155 	int idx;
156 
157 	list_for_each_entry(map, &dt->maps, link) {
158 		idx = match_string(map->class_names, map->length, class_string);
159 		if (idx >= 0) {
160 			*class_id = idx + map->base;
161 			return map;
162 		}
163 	}
164 	*class_id = -ENOENT;
165 	return NULL;
166 }
167 
168 #define __outvar /* filled by callee */
169 /*
170  * Search the tables for _ddebug's which match the given `query' and
171  * apply the `flags' and `mask' to them.  Returns number of matching
172  * callsites, normally the same as number of changes.  If verbose,
173  * logs the changes.  Takes ddebug_lock.
174  */
ddebug_change(const struct ddebug_query * query,struct flag_settings * modifiers)175 static int ddebug_change(const struct ddebug_query *query,
176 			 struct flag_settings *modifiers)
177 {
178 	int i;
179 	struct ddebug_table *dt;
180 	unsigned int newflags;
181 	unsigned int nfound = 0;
182 	struct flagsbuf fbuf, nbuf;
183 	struct ddebug_class_map *map = NULL;
184 	int __outvar valid_class;
185 
186 	/* search for matching ddebugs */
187 	mutex_lock(&ddebug_lock);
188 	list_for_each_entry(dt, &ddebug_tables, link) {
189 
190 		/* match against the module name */
191 		if (query->module &&
192 		    !match_wildcard(query->module, dt->mod_name))
193 			continue;
194 
195 		if (query->class_string) {
196 			map = ddebug_find_valid_class(dt, query->class_string, &valid_class);
197 			if (!map)
198 				continue;
199 		} else {
200 			/* constrain query, do not touch class'd callsites */
201 			valid_class = _DPRINTK_CLASS_DFLT;
202 		}
203 
204 		for (i = 0; i < dt->num_ddebugs; i++) {
205 			struct _ddebug *dp = &dt->ddebugs[i];
206 
207 			/* match site against query-class */
208 			if (dp->class_id != valid_class)
209 				continue;
210 
211 			/* match against the source filename */
212 			if (query->filename &&
213 			    !match_wildcard(query->filename, dp->filename) &&
214 			    !match_wildcard(query->filename,
215 					   kbasename(dp->filename)) &&
216 			    !match_wildcard(query->filename,
217 					   trim_prefix(dp->filename)))
218 				continue;
219 
220 			/* match against the function */
221 			if (query->function &&
222 			    !match_wildcard(query->function, dp->function))
223 				continue;
224 
225 			/* match against the format */
226 			if (query->format) {
227 				if (*query->format == '^') {
228 					char *p;
229 					/* anchored search. match must be at beginning */
230 					p = strstr(dp->format, query->format+1);
231 					if (p != dp->format)
232 						continue;
233 				} else if (!strstr(dp->format, query->format))
234 					continue;
235 			}
236 
237 			/* match against the line number range */
238 			if (query->first_lineno &&
239 			    dp->lineno < query->first_lineno)
240 				continue;
241 			if (query->last_lineno &&
242 			    dp->lineno > query->last_lineno)
243 				continue;
244 
245 			nfound++;
246 
247 			newflags = (dp->flags & modifiers->mask) | modifiers->flags;
248 			if (newflags == dp->flags)
249 				continue;
250 #ifdef CONFIG_JUMP_LABEL
251 			if (dp->flags & _DPRINTK_FLAGS_PRINT) {
252 				if (!(newflags & _DPRINTK_FLAGS_PRINT))
253 					static_branch_disable(&dp->key.dd_key_true);
254 			} else if (newflags & _DPRINTK_FLAGS_PRINT) {
255 				static_branch_enable(&dp->key.dd_key_true);
256 			}
257 #endif
258 			v4pr_info("changed %s:%d [%s]%s %s => %s\n",
259 				  trim_prefix(dp->filename), dp->lineno,
260 				  dt->mod_name, dp->function,
261 				  ddebug_describe_flags(dp->flags, &fbuf),
262 				  ddebug_describe_flags(newflags, &nbuf));
263 			dp->flags = newflags;
264 		}
265 	}
266 	mutex_unlock(&ddebug_lock);
267 
268 	if (!nfound && verbose)
269 		pr_info("no matches for query\n");
270 
271 	return nfound;
272 }
273 
274 /*
275  * Split the buffer `buf' into space-separated words.
276  * Handles simple " and ' quoting, i.e. without nested,
277  * embedded or escaped \".  Return the number of words
278  * or <0 on error.
279  */
ddebug_tokenize(char * buf,char * words[],int maxwords)280 static int ddebug_tokenize(char *buf, char *words[], int maxwords)
281 {
282 	int nwords = 0;
283 
284 	while (*buf) {
285 		char *end;
286 
287 		/* Skip leading whitespace */
288 		buf = skip_spaces(buf);
289 		if (!*buf)
290 			break;	/* oh, it was trailing whitespace */
291 		if (*buf == '#')
292 			break;	/* token starts comment, skip rest of line */
293 
294 		/* find `end' of word, whitespace separated or quoted */
295 		if (*buf == '"' || *buf == '\'') {
296 			int quote = *buf++;
297 			for (end = buf; *end && *end != quote; end++)
298 				;
299 			if (!*end) {
300 				pr_err("unclosed quote: %s\n", buf);
301 				return -EINVAL;	/* unclosed quote */
302 			}
303 		} else {
304 			for (end = buf; *end && !isspace(*end); end++)
305 				;
306 			if (end == buf) {
307 				pr_err("parse err after word:%d=%s\n", nwords,
308 				       nwords ? words[nwords - 1] : "<none>");
309 				return -EINVAL;
310 			}
311 		}
312 
313 		/* `buf' is start of word, `end' is one past its end */
314 		if (nwords == maxwords) {
315 			pr_err("too many words, legal max <=%d\n", maxwords);
316 			return -EINVAL;	/* ran out of words[] before bytes */
317 		}
318 		if (*end)
319 			*end++ = '\0';	/* terminate the word */
320 		words[nwords++] = buf;
321 		buf = end;
322 	}
323 
324 	if (verbose >= 3) {
325 		int i;
326 		pr_info("split into words:");
327 		for (i = 0; i < nwords; i++)
328 			pr_cont(" \"%s\"", words[i]);
329 		pr_cont("\n");
330 	}
331 
332 	return nwords;
333 }
334 
335 /*
336  * Parse a single line number.  Note that the empty string ""
337  * is treated as a special case and converted to zero, which
338  * is later treated as a "don't care" value.
339  */
parse_lineno(const char * str,unsigned int * val)340 static inline int parse_lineno(const char *str, unsigned int *val)
341 {
342 	BUG_ON(str == NULL);
343 	if (*str == '\0') {
344 		*val = 0;
345 		return 0;
346 	}
347 	if (kstrtouint(str, 10, val) < 0) {
348 		pr_err("bad line-number: %s\n", str);
349 		return -EINVAL;
350 	}
351 	return 0;
352 }
353 
parse_linerange(struct ddebug_query * query,const char * first)354 static int parse_linerange(struct ddebug_query *query, const char *first)
355 {
356 	char *last = strchr(first, '-');
357 
358 	if (query->first_lineno || query->last_lineno) {
359 		pr_err("match-spec: line used 2x\n");
360 		return -EINVAL;
361 	}
362 	if (last)
363 		*last++ = '\0';
364 	if (parse_lineno(first, &query->first_lineno) < 0)
365 		return -EINVAL;
366 	if (last) {
367 		/* range <first>-<last> */
368 		if (parse_lineno(last, &query->last_lineno) < 0)
369 			return -EINVAL;
370 
371 		/* special case for last lineno not specified */
372 		if (query->last_lineno == 0)
373 			query->last_lineno = UINT_MAX;
374 
375 		if (query->last_lineno < query->first_lineno) {
376 			pr_err("last-line:%d < 1st-line:%d\n",
377 			       query->last_lineno,
378 			       query->first_lineno);
379 			return -EINVAL;
380 		}
381 	} else {
382 		query->last_lineno = query->first_lineno;
383 	}
384 	v3pr_info("parsed line %d-%d\n", query->first_lineno,
385 		 query->last_lineno);
386 	return 0;
387 }
388 
check_set(const char ** dest,char * src,char * name)389 static int check_set(const char **dest, char *src, char *name)
390 {
391 	int rc = 0;
392 
393 	if (*dest) {
394 		rc = -EINVAL;
395 		pr_err("match-spec:%s val:%s overridden by %s\n",
396 		       name, *dest, src);
397 	}
398 	*dest = src;
399 	return rc;
400 }
401 
402 /*
403  * Parse words[] as a ddebug query specification, which is a series
404  * of (keyword, value) pairs chosen from these possibilities:
405  *
406  * func <function-name>
407  * file <full-pathname>
408  * file <base-filename>
409  * module <module-name>
410  * format <escaped-string-to-find-in-format>
411  * line <lineno>
412  * line <first-lineno>-<last-lineno> // where either may be empty
413  *
414  * Only 1 of each type is allowed.
415  * Returns 0 on success, <0 on error.
416  */
ddebug_parse_query(char * words[],int nwords,struct ddebug_query * query,const char * modname)417 static int ddebug_parse_query(char *words[], int nwords,
418 			struct ddebug_query *query, const char *modname)
419 {
420 	unsigned int i;
421 	int rc = 0;
422 	char *fline;
423 
424 	/* check we have an even number of words */
425 	if (nwords % 2 != 0) {
426 		pr_err("expecting pairs of match-spec <value>\n");
427 		return -EINVAL;
428 	}
429 
430 	for (i = 0; i < nwords; i += 2) {
431 		char *keyword = words[i];
432 		char *arg = words[i+1];
433 
434 		if (!strcmp(keyword, "func")) {
435 			rc = check_set(&query->function, arg, "func");
436 		} else if (!strcmp(keyword, "file")) {
437 			if (check_set(&query->filename, arg, "file"))
438 				return -EINVAL;
439 
440 			/* tail :$info is function or line-range */
441 			fline = strchr(query->filename, ':');
442 			if (!fline)
443 				continue;
444 			*fline++ = '\0';
445 			if (isalpha(*fline) || *fline == '*' || *fline == '?') {
446 				/* take as function name */
447 				if (check_set(&query->function, fline, "func"))
448 					return -EINVAL;
449 			} else {
450 				if (parse_linerange(query, fline))
451 					return -EINVAL;
452 			}
453 		} else if (!strcmp(keyword, "module")) {
454 			rc = check_set(&query->module, arg, "module");
455 		} else if (!strcmp(keyword, "format")) {
456 			string_unescape_inplace(arg, UNESCAPE_SPACE |
457 							    UNESCAPE_OCTAL |
458 							    UNESCAPE_SPECIAL);
459 			rc = check_set(&query->format, arg, "format");
460 		} else if (!strcmp(keyword, "line")) {
461 			if (parse_linerange(query, arg))
462 				return -EINVAL;
463 		} else if (!strcmp(keyword, "class")) {
464 			rc = check_set(&query->class_string, arg, "class");
465 		} else {
466 			pr_err("unknown keyword \"%s\"\n", keyword);
467 			return -EINVAL;
468 		}
469 		if (rc)
470 			return rc;
471 	}
472 	if (!query->module && modname)
473 		/*
474 		 * support $modname.dyndbg=<multiple queries>, when
475 		 * not given in the query itself
476 		 */
477 		query->module = modname;
478 
479 	vpr_info_dq(query, "parsed");
480 	return 0;
481 }
482 
483 /*
484  * Parse `str' as a flags specification, format [-+=][p]+.
485  * Sets up *maskp and *flagsp to be used when changing the
486  * flags fields of matched _ddebug's.  Returns 0 on success
487  * or <0 on error.
488  */
ddebug_parse_flags(const char * str,struct flag_settings * modifiers)489 static int ddebug_parse_flags(const char *str, struct flag_settings *modifiers)
490 {
491 	int op, i;
492 
493 	switch (*str) {
494 	case '+':
495 	case '-':
496 	case '=':
497 		op = *str++;
498 		break;
499 	default:
500 		pr_err("bad flag-op %c, at start of %s\n", *str, str);
501 		return -EINVAL;
502 	}
503 	v3pr_info("op='%c'\n", op);
504 
505 	for (; *str ; ++str) {
506 		for (i = ARRAY_SIZE(opt_array) - 1; i >= 0; i--) {
507 			if (*str == opt_array[i].opt_char) {
508 				modifiers->flags |= opt_array[i].flag;
509 				break;
510 			}
511 		}
512 		if (i < 0) {
513 			pr_err("unknown flag '%c'\n", *str);
514 			return -EINVAL;
515 		}
516 	}
517 	v3pr_info("flags=0x%x\n", modifiers->flags);
518 
519 	/* calculate final flags, mask based upon op */
520 	switch (op) {
521 	case '=':
522 		/* modifiers->flags already set */
523 		modifiers->mask = 0;
524 		break;
525 	case '+':
526 		modifiers->mask = ~0U;
527 		break;
528 	case '-':
529 		modifiers->mask = ~modifiers->flags;
530 		modifiers->flags = 0;
531 		break;
532 	}
533 	v3pr_info("*flagsp=0x%x *maskp=0x%x\n", modifiers->flags, modifiers->mask);
534 
535 	return 0;
536 }
537 
ddebug_exec_query(char * query_string,const char * modname)538 static int ddebug_exec_query(char *query_string, const char *modname)
539 {
540 	struct flag_settings modifiers = {};
541 	struct ddebug_query query = {};
542 #define MAXWORDS 9
543 	int nwords, nfound;
544 	char *words[MAXWORDS];
545 
546 	nwords = ddebug_tokenize(query_string, words, MAXWORDS);
547 	if (nwords <= 0) {
548 		pr_err("tokenize failed\n");
549 		return -EINVAL;
550 	}
551 	/* check flags 1st (last arg) so query is pairs of spec,val */
552 	if (ddebug_parse_flags(words[nwords-1], &modifiers)) {
553 		pr_err("flags parse failed\n");
554 		return -EINVAL;
555 	}
556 	if (ddebug_parse_query(words, nwords-1, &query, modname)) {
557 		pr_err("query parse failed\n");
558 		return -EINVAL;
559 	}
560 	/* actually go and implement the change */
561 	nfound = ddebug_change(&query, &modifiers);
562 	vpr_info_dq(&query, nfound ? "applied" : "no-match");
563 
564 	return nfound;
565 }
566 
567 /* handle multiple queries in query string, continue on error, return
568    last error or number of matching callsites.  Module name is either
569    in param (for boot arg) or perhaps in query string.
570 */
ddebug_exec_queries(char * query,const char * modname)571 static int ddebug_exec_queries(char *query, const char *modname)
572 {
573 	char *split;
574 	int i, errs = 0, exitcode = 0, rc, nfound = 0;
575 
576 	for (i = 0; query; query = split) {
577 		split = strpbrk(query, ";\n");
578 		if (split)
579 			*split++ = '\0';
580 
581 		query = skip_spaces(query);
582 		if (!query || !*query || *query == '#')
583 			continue;
584 
585 		vpr_info("query %d: \"%s\" mod:%s\n", i, query, modname ?: "*");
586 
587 		rc = ddebug_exec_query(query, modname);
588 		if (rc < 0) {
589 			errs++;
590 			exitcode = rc;
591 		} else {
592 			nfound += rc;
593 		}
594 		i++;
595 	}
596 	if (i)
597 		v2pr_info("processed %d queries, with %d matches, %d errs\n",
598 			 i, nfound, errs);
599 
600 	if (exitcode)
601 		return exitcode;
602 	return nfound;
603 }
604 
605 /* apply a new bitmap to the sys-knob's current bit-state */
ddebug_apply_class_bitmap(const struct ddebug_class_param * dcp,unsigned long * new_bits,unsigned long * old_bits)606 static int ddebug_apply_class_bitmap(const struct ddebug_class_param *dcp,
607 				     unsigned long *new_bits, unsigned long *old_bits)
608 {
609 #define QUERY_SIZE 128
610 	char query[QUERY_SIZE];
611 	const struct ddebug_class_map *map = dcp->map;
612 	int matches = 0;
613 	int bi, ct;
614 
615 	v2pr_info("apply: 0x%lx to: 0x%lx\n", *new_bits, *old_bits);
616 
617 	for (bi = 0; bi < map->length; bi++) {
618 		if (test_bit(bi, new_bits) == test_bit(bi, old_bits))
619 			continue;
620 
621 		snprintf(query, QUERY_SIZE, "class %s %c%s", map->class_names[bi],
622 			 test_bit(bi, new_bits) ? '+' : '-', dcp->flags);
623 
624 		ct = ddebug_exec_queries(query, NULL);
625 		matches += ct;
626 
627 		v2pr_info("bit_%d: %d matches on class: %s -> 0x%lx\n", bi,
628 			  ct, map->class_names[bi], *new_bits);
629 	}
630 	return matches;
631 }
632 
633 /* stub to later conditionally add "$module." prefix where not already done */
634 #define KP_NAME(kp)	kp->name
635 
636 #define CLASSMAP_BITMASK(width) ((1UL << (width)) - 1)
637 
638 /* accept comma-separated-list of [+-] classnames */
param_set_dyndbg_classnames(const char * instr,const struct kernel_param * kp)639 static int param_set_dyndbg_classnames(const char *instr, const struct kernel_param *kp)
640 {
641 	const struct ddebug_class_param *dcp = kp->arg;
642 	const struct ddebug_class_map *map = dcp->map;
643 	unsigned long curr_bits, old_bits;
644 	char *cl_str, *p, *tmp;
645 	int cls_id, totct = 0;
646 	bool wanted;
647 
648 	cl_str = tmp = kstrdup_and_replace(instr, '\n', '\0', GFP_KERNEL);
649 	if (!tmp)
650 		return -ENOMEM;
651 
652 	/* start with previously set state-bits, then modify */
653 	curr_bits = old_bits = *dcp->bits;
654 	vpr_info("\"%s\" > %s:0x%lx\n", cl_str, KP_NAME(kp), curr_bits);
655 
656 	for (; cl_str; cl_str = p) {
657 		p = strchr(cl_str, ',');
658 		if (p)
659 			*p++ = '\0';
660 
661 		if (*cl_str == '-') {
662 			wanted = false;
663 			cl_str++;
664 		} else {
665 			wanted = true;
666 			if (*cl_str == '+')
667 				cl_str++;
668 		}
669 		cls_id = match_string(map->class_names, map->length, cl_str);
670 		if (cls_id < 0) {
671 			pr_err("%s unknown to %s\n", cl_str, KP_NAME(kp));
672 			continue;
673 		}
674 
675 		/* have one or more valid class_ids of one *_NAMES type */
676 		switch (map->map_type) {
677 		case DD_CLASS_TYPE_DISJOINT_NAMES:
678 			/* the +/- pertains to a single bit */
679 			if (test_bit(cls_id, &curr_bits) == wanted) {
680 				v3pr_info("no change on %s\n", cl_str);
681 				continue;
682 			}
683 			curr_bits ^= BIT(cls_id);
684 			totct += ddebug_apply_class_bitmap(dcp, &curr_bits, dcp->bits);
685 			*dcp->bits = curr_bits;
686 			v2pr_info("%s: changed bit %d:%s\n", KP_NAME(kp), cls_id,
687 				  map->class_names[cls_id]);
688 			break;
689 		case DD_CLASS_TYPE_LEVEL_NAMES:
690 			/* cls_id = N in 0..max. wanted +/- determines N or N-1 */
691 			old_bits = CLASSMAP_BITMASK(*dcp->lvl);
692 			curr_bits = CLASSMAP_BITMASK(cls_id + (wanted ? 1 : 0 ));
693 
694 			totct += ddebug_apply_class_bitmap(dcp, &curr_bits, &old_bits);
695 			*dcp->lvl = (cls_id + (wanted ? 1 : 0));
696 			v2pr_info("%s: changed bit-%d: \"%s\" %lx->%lx\n", KP_NAME(kp), cls_id,
697 				  map->class_names[cls_id], old_bits, curr_bits);
698 			break;
699 		default:
700 			pr_err("illegal map-type value %d\n", map->map_type);
701 		}
702 	}
703 	kfree(tmp);
704 	vpr_info("total matches: %d\n", totct);
705 	return 0;
706 }
707 
708 /**
709  * param_set_dyndbg_classes - class FOO >control
710  * @instr: string echo>d to sysfs, input depends on map_type
711  * @kp:    kp->arg has state: bits/lvl, map, map_type
712  *
713  * Enable/disable prdbgs by their class, as given in the arguments to
714  * DECLARE_DYNDBG_CLASSMAP.  For LEVEL map-types, enforce relative
715  * levels by bitpos.
716  *
717  * Returns: 0 or <0 if error.
718  */
param_set_dyndbg_classes(const char * instr,const struct kernel_param * kp)719 int param_set_dyndbg_classes(const char *instr, const struct kernel_param *kp)
720 {
721 	const struct ddebug_class_param *dcp = kp->arg;
722 	const struct ddebug_class_map *map = dcp->map;
723 	unsigned long inrep, new_bits, old_bits;
724 	int rc, totct = 0;
725 
726 	switch (map->map_type) {
727 
728 	case DD_CLASS_TYPE_DISJOINT_NAMES:
729 	case DD_CLASS_TYPE_LEVEL_NAMES:
730 		/* handle [+-]classnames list separately, we are done here */
731 		return param_set_dyndbg_classnames(instr, kp);
732 
733 	case DD_CLASS_TYPE_DISJOINT_BITS:
734 	case DD_CLASS_TYPE_LEVEL_NUM:
735 		/* numeric input, accept and fall-thru */
736 		rc = kstrtoul(instr, 0, &inrep);
737 		if (rc) {
738 			pr_err("expecting numeric input: %s > %s\n", instr, KP_NAME(kp));
739 			return -EINVAL;
740 		}
741 		break;
742 	default:
743 		pr_err("%s: bad map type: %d\n", KP_NAME(kp), map->map_type);
744 		return -EINVAL;
745 	}
746 
747 	/* only _BITS,_NUM (numeric) map-types get here */
748 	switch (map->map_type) {
749 	case DD_CLASS_TYPE_DISJOINT_BITS:
750 		/* expect bits. mask and warn if too many */
751 		if (inrep & ~CLASSMAP_BITMASK(map->length)) {
752 			pr_warn("%s: input: 0x%lx exceeds mask: 0x%lx, masking\n",
753 				KP_NAME(kp), inrep, CLASSMAP_BITMASK(map->length));
754 			inrep &= CLASSMAP_BITMASK(map->length);
755 		}
756 		v2pr_info("bits:%lx > %s\n", inrep, KP_NAME(kp));
757 		totct += ddebug_apply_class_bitmap(dcp, &inrep, dcp->bits);
758 		*dcp->bits = inrep;
759 		break;
760 	case DD_CLASS_TYPE_LEVEL_NUM:
761 		/* input is bitpos, of highest verbosity to be enabled */
762 		if (inrep > map->length) {
763 			pr_warn("%s: level:%ld exceeds max:%d, clamping\n",
764 				KP_NAME(kp), inrep, map->length);
765 			inrep = map->length;
766 		}
767 		old_bits = CLASSMAP_BITMASK(*dcp->lvl);
768 		new_bits = CLASSMAP_BITMASK(inrep);
769 		v2pr_info("lvl:%ld bits:0x%lx > %s\n", inrep, new_bits, KP_NAME(kp));
770 		totct += ddebug_apply_class_bitmap(dcp, &new_bits, &old_bits);
771 		*dcp->lvl = inrep;
772 		break;
773 	default:
774 		pr_warn("%s: bad map type: %d\n", KP_NAME(kp), map->map_type);
775 	}
776 	vpr_info("%s: total matches: %d\n", KP_NAME(kp), totct);
777 	return 0;
778 }
779 EXPORT_SYMBOL(param_set_dyndbg_classes);
780 
781 /**
782  * param_get_dyndbg_classes - classes reader
783  * @buffer: string description of controlled bits -> classes
784  * @kp:     kp->arg has state: bits, map
785  *
786  * Reads last written state, underlying prdbg state may have been
787  * altered by direct >control.  Displays 0x for DISJOINT, 0-N for
788  * LEVEL Returns: #chars written or <0 on error
789  */
param_get_dyndbg_classes(char * buffer,const struct kernel_param * kp)790 int param_get_dyndbg_classes(char *buffer, const struct kernel_param *kp)
791 {
792 	const struct ddebug_class_param *dcp = kp->arg;
793 	const struct ddebug_class_map *map = dcp->map;
794 
795 	switch (map->map_type) {
796 
797 	case DD_CLASS_TYPE_DISJOINT_NAMES:
798 	case DD_CLASS_TYPE_DISJOINT_BITS:
799 		return scnprintf(buffer, PAGE_SIZE, "0x%lx\n", *dcp->bits);
800 
801 	case DD_CLASS_TYPE_LEVEL_NAMES:
802 	case DD_CLASS_TYPE_LEVEL_NUM:
803 		return scnprintf(buffer, PAGE_SIZE, "%d\n", *dcp->lvl);
804 	default:
805 		return -1;
806 	}
807 }
808 EXPORT_SYMBOL(param_get_dyndbg_classes);
809 
810 const struct kernel_param_ops param_ops_dyndbg_classes = {
811 	.set = param_set_dyndbg_classes,
812 	.get = param_get_dyndbg_classes,
813 };
814 EXPORT_SYMBOL(param_ops_dyndbg_classes);
815 
816 #define PREFIX_SIZE 128
817 
remaining(int wrote)818 static int remaining(int wrote)
819 {
820 	if (PREFIX_SIZE - wrote > 0)
821 		return PREFIX_SIZE - wrote;
822 	return 0;
823 }
824 
__dynamic_emit_prefix(const struct _ddebug * desc,char * buf)825 static char *__dynamic_emit_prefix(const struct _ddebug *desc, char *buf)
826 {
827 	int pos_after_tid;
828 	int pos = 0;
829 
830 	if (desc->flags & _DPRINTK_FLAGS_INCL_TID) {
831 		if (in_interrupt())
832 			pos += snprintf(buf + pos, remaining(pos), "<intr> ");
833 		else
834 			pos += snprintf(buf + pos, remaining(pos), "[%d] ",
835 					task_pid_vnr(current));
836 	}
837 	pos_after_tid = pos;
838 	if (desc->flags & _DPRINTK_FLAGS_INCL_MODNAME)
839 		pos += snprintf(buf + pos, remaining(pos), "%s:",
840 				desc->modname);
841 	if (desc->flags & _DPRINTK_FLAGS_INCL_FUNCNAME)
842 		pos += snprintf(buf + pos, remaining(pos), "%s:",
843 				desc->function);
844 	if (desc->flags & _DPRINTK_FLAGS_INCL_SOURCENAME)
845 		pos += snprintf(buf + pos, remaining(pos), "%s:",
846 				trim_prefix(desc->filename));
847 	if (desc->flags & _DPRINTK_FLAGS_INCL_LINENO)
848 		pos += snprintf(buf + pos, remaining(pos), "%d:",
849 				desc->lineno);
850 	if (pos - pos_after_tid)
851 		pos += snprintf(buf + pos, remaining(pos), " ");
852 	if (pos >= PREFIX_SIZE)
853 		buf[PREFIX_SIZE - 1] = '\0';
854 
855 	return buf;
856 }
857 
dynamic_emit_prefix(struct _ddebug * desc,char * buf)858 static inline char *dynamic_emit_prefix(struct _ddebug *desc, char *buf)
859 {
860 	if (unlikely(desc->flags & _DPRINTK_FLAGS_INCL_ANY))
861 		return __dynamic_emit_prefix(desc, buf);
862 	return buf;
863 }
864 
__dynamic_pr_debug(struct _ddebug * descriptor,const char * fmt,...)865 void __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...)
866 {
867 	va_list args;
868 	struct va_format vaf;
869 	char buf[PREFIX_SIZE] = "";
870 
871 	BUG_ON(!descriptor);
872 	BUG_ON(!fmt);
873 
874 	va_start(args, fmt);
875 
876 	vaf.fmt = fmt;
877 	vaf.va = &args;
878 
879 	printk(KERN_DEBUG "%s%pV", dynamic_emit_prefix(descriptor, buf), &vaf);
880 
881 	va_end(args);
882 }
883 EXPORT_SYMBOL(__dynamic_pr_debug);
884 
__dynamic_dev_dbg(struct _ddebug * descriptor,const struct device * dev,const char * fmt,...)885 void __dynamic_dev_dbg(struct _ddebug *descriptor,
886 		      const struct device *dev, const char *fmt, ...)
887 {
888 	struct va_format vaf;
889 	va_list args;
890 
891 	BUG_ON(!descriptor);
892 	BUG_ON(!fmt);
893 
894 	va_start(args, fmt);
895 
896 	vaf.fmt = fmt;
897 	vaf.va = &args;
898 
899 	if (!dev) {
900 		printk(KERN_DEBUG "(NULL device *): %pV", &vaf);
901 	} else {
902 		char buf[PREFIX_SIZE] = "";
903 
904 		dev_printk_emit(LOGLEVEL_DEBUG, dev, "%s%s %s: %pV",
905 				dynamic_emit_prefix(descriptor, buf),
906 				dev_driver_string(dev), dev_name(dev),
907 				&vaf);
908 	}
909 
910 	va_end(args);
911 }
912 EXPORT_SYMBOL(__dynamic_dev_dbg);
913 
914 #ifdef CONFIG_NET
915 
__dynamic_netdev_dbg(struct _ddebug * descriptor,const struct net_device * dev,const char * fmt,...)916 void __dynamic_netdev_dbg(struct _ddebug *descriptor,
917 			  const struct net_device *dev, const char *fmt, ...)
918 {
919 	struct va_format vaf;
920 	va_list args;
921 
922 	BUG_ON(!descriptor);
923 	BUG_ON(!fmt);
924 
925 	va_start(args, fmt);
926 
927 	vaf.fmt = fmt;
928 	vaf.va = &args;
929 
930 	if (dev && dev->dev.parent) {
931 		char buf[PREFIX_SIZE] = "";
932 
933 		dev_printk_emit(LOGLEVEL_DEBUG, dev->dev.parent,
934 				"%s%s %s %s%s: %pV",
935 				dynamic_emit_prefix(descriptor, buf),
936 				dev_driver_string(dev->dev.parent),
937 				dev_name(dev->dev.parent),
938 				netdev_name(dev), netdev_reg_state(dev),
939 				&vaf);
940 	} else if (dev) {
941 		printk(KERN_DEBUG "%s%s: %pV", netdev_name(dev),
942 		       netdev_reg_state(dev), &vaf);
943 	} else {
944 		printk(KERN_DEBUG "(NULL net_device): %pV", &vaf);
945 	}
946 
947 	va_end(args);
948 }
949 EXPORT_SYMBOL(__dynamic_netdev_dbg);
950 
951 #endif
952 
953 #if IS_ENABLED(CONFIG_INFINIBAND)
954 
__dynamic_ibdev_dbg(struct _ddebug * descriptor,const struct ib_device * ibdev,const char * fmt,...)955 void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
956 			 const struct ib_device *ibdev, const char *fmt, ...)
957 {
958 	struct va_format vaf;
959 	va_list args;
960 
961 	va_start(args, fmt);
962 
963 	vaf.fmt = fmt;
964 	vaf.va = &args;
965 
966 	if (ibdev && ibdev->dev.parent) {
967 		char buf[PREFIX_SIZE] = "";
968 
969 		dev_printk_emit(LOGLEVEL_DEBUG, ibdev->dev.parent,
970 				"%s%s %s %s: %pV",
971 				dynamic_emit_prefix(descriptor, buf),
972 				dev_driver_string(ibdev->dev.parent),
973 				dev_name(ibdev->dev.parent),
974 				dev_name(&ibdev->dev),
975 				&vaf);
976 	} else if (ibdev) {
977 		printk(KERN_DEBUG "%s: %pV", dev_name(&ibdev->dev), &vaf);
978 	} else {
979 		printk(KERN_DEBUG "(NULL ib_device): %pV", &vaf);
980 	}
981 
982 	va_end(args);
983 }
984 EXPORT_SYMBOL(__dynamic_ibdev_dbg);
985 
986 #endif
987 
988 /*
989  * Install a noop handler to make dyndbg look like a normal kernel cli param.
990  * This avoids warnings about dyndbg being an unknown cli param when supplied
991  * by a user.
992  */
dyndbg_setup(char * str)993 static __init int dyndbg_setup(char *str)
994 {
995 	return 1;
996 }
997 
998 __setup("dyndbg=", dyndbg_setup);
999 
1000 /*
1001  * File_ops->write method for <debugfs>/dynamic_debug/control.  Gathers the
1002  * command text from userspace, parses and executes it.
1003  */
1004 #define USER_BUF_PAGE 4096
ddebug_proc_write(struct file * file,const char __user * ubuf,size_t len,loff_t * offp)1005 static ssize_t ddebug_proc_write(struct file *file, const char __user *ubuf,
1006 				  size_t len, loff_t *offp)
1007 {
1008 	char *tmpbuf;
1009 	int ret;
1010 
1011 	if (len == 0)
1012 		return 0;
1013 	if (len > USER_BUF_PAGE - 1) {
1014 		pr_warn("expected <%d bytes into control\n", USER_BUF_PAGE);
1015 		return -E2BIG;
1016 	}
1017 	tmpbuf = memdup_user_nul(ubuf, len);
1018 	if (IS_ERR(tmpbuf))
1019 		return PTR_ERR(tmpbuf);
1020 	v2pr_info("read %zu bytes from userspace\n", len);
1021 
1022 	ret = ddebug_exec_queries(tmpbuf, NULL);
1023 	kfree(tmpbuf);
1024 	if (ret < 0)
1025 		return ret;
1026 
1027 	*offp += len;
1028 	return len;
1029 }
1030 
1031 /*
1032  * Set the iterator to point to the first _ddebug object
1033  * and return a pointer to that first object.  Returns
1034  * NULL if there are no _ddebugs at all.
1035  */
ddebug_iter_first(struct ddebug_iter * iter)1036 static struct _ddebug *ddebug_iter_first(struct ddebug_iter *iter)
1037 {
1038 	if (list_empty(&ddebug_tables)) {
1039 		iter->table = NULL;
1040 		return NULL;
1041 	}
1042 	iter->table = list_entry(ddebug_tables.next,
1043 				 struct ddebug_table, link);
1044 	iter->idx = iter->table->num_ddebugs;
1045 	return &iter->table->ddebugs[--iter->idx];
1046 }
1047 
1048 /*
1049  * Advance the iterator to point to the next _ddebug
1050  * object from the one the iterator currently points at,
1051  * and returns a pointer to the new _ddebug.  Returns
1052  * NULL if the iterator has seen all the _ddebugs.
1053  */
ddebug_iter_next(struct ddebug_iter * iter)1054 static struct _ddebug *ddebug_iter_next(struct ddebug_iter *iter)
1055 {
1056 	if (iter->table == NULL)
1057 		return NULL;
1058 	if (--iter->idx < 0) {
1059 		/* iterate to next table */
1060 		if (list_is_last(&iter->table->link, &ddebug_tables)) {
1061 			iter->table = NULL;
1062 			return NULL;
1063 		}
1064 		iter->table = list_entry(iter->table->link.next,
1065 					 struct ddebug_table, link);
1066 		iter->idx = iter->table->num_ddebugs;
1067 		--iter->idx;
1068 	}
1069 	return &iter->table->ddebugs[iter->idx];
1070 }
1071 
1072 /*
1073  * Seq_ops start method.  Called at the start of every
1074  * read() call from userspace.  Takes the ddebug_lock and
1075  * seeks the seq_file's iterator to the given position.
1076  */
ddebug_proc_start(struct seq_file * m,loff_t * pos)1077 static void *ddebug_proc_start(struct seq_file *m, loff_t *pos)
1078 {
1079 	struct ddebug_iter *iter = m->private;
1080 	struct _ddebug *dp;
1081 	int n = *pos;
1082 
1083 	mutex_lock(&ddebug_lock);
1084 
1085 	if (!n)
1086 		return SEQ_START_TOKEN;
1087 	if (n < 0)
1088 		return NULL;
1089 	dp = ddebug_iter_first(iter);
1090 	while (dp != NULL && --n > 0)
1091 		dp = ddebug_iter_next(iter);
1092 	return dp;
1093 }
1094 
1095 /*
1096  * Seq_ops next method.  Called several times within a read()
1097  * call from userspace, with ddebug_lock held.  Walks to the
1098  * next _ddebug object with a special case for the header line.
1099  */
ddebug_proc_next(struct seq_file * m,void * p,loff_t * pos)1100 static void *ddebug_proc_next(struct seq_file *m, void *p, loff_t *pos)
1101 {
1102 	struct ddebug_iter *iter = m->private;
1103 	struct _ddebug *dp;
1104 
1105 	if (p == SEQ_START_TOKEN)
1106 		dp = ddebug_iter_first(iter);
1107 	else
1108 		dp = ddebug_iter_next(iter);
1109 	++*pos;
1110 	return dp;
1111 }
1112 
1113 #define class_in_range(class_id, map)					\
1114 	(class_id >= map->base && class_id < map->base + map->length)
1115 
ddebug_class_name(struct ddebug_iter * iter,struct _ddebug * dp)1116 static const char *ddebug_class_name(struct ddebug_iter *iter, struct _ddebug *dp)
1117 {
1118 	struct ddebug_class_map *map;
1119 
1120 	list_for_each_entry(map, &iter->table->maps, link)
1121 		if (class_in_range(dp->class_id, map))
1122 			return map->class_names[dp->class_id - map->base];
1123 
1124 	return NULL;
1125 }
1126 
1127 /*
1128  * Seq_ops show method.  Called several times within a read()
1129  * call from userspace, with ddebug_lock held.  Formats the
1130  * current _ddebug as a single human-readable line, with a
1131  * special case for the header line.
1132  */
ddebug_proc_show(struct seq_file * m,void * p)1133 static int ddebug_proc_show(struct seq_file *m, void *p)
1134 {
1135 	struct ddebug_iter *iter = m->private;
1136 	struct _ddebug *dp = p;
1137 	struct flagsbuf flags;
1138 	char const *class;
1139 
1140 	if (p == SEQ_START_TOKEN) {
1141 		seq_puts(m,
1142 			 "# filename:lineno [module]function flags format\n");
1143 		return 0;
1144 	}
1145 
1146 	seq_printf(m, "%s:%u [%s]%s =%s \"",
1147 		   trim_prefix(dp->filename), dp->lineno,
1148 		   iter->table->mod_name, dp->function,
1149 		   ddebug_describe_flags(dp->flags, &flags));
1150 	seq_escape_str(m, dp->format, ESCAPE_SPACE, "\t\r\n\"");
1151 	seq_putc(m, '"');
1152 
1153 	if (dp->class_id != _DPRINTK_CLASS_DFLT) {
1154 		class = ddebug_class_name(iter, dp);
1155 		if (class)
1156 			seq_printf(m, " class:%s", class);
1157 		else
1158 			seq_printf(m, " class unknown, _id:%d", dp->class_id);
1159 	}
1160 	seq_putc(m, '\n');
1161 
1162 	return 0;
1163 }
1164 
1165 /*
1166  * Seq_ops stop method.  Called at the end of each read()
1167  * call from userspace.  Drops ddebug_lock.
1168  */
ddebug_proc_stop(struct seq_file * m,void * p)1169 static void ddebug_proc_stop(struct seq_file *m, void *p)
1170 {
1171 	mutex_unlock(&ddebug_lock);
1172 }
1173 
1174 static const struct seq_operations ddebug_proc_seqops = {
1175 	.start = ddebug_proc_start,
1176 	.next = ddebug_proc_next,
1177 	.show = ddebug_proc_show,
1178 	.stop = ddebug_proc_stop
1179 };
1180 
ddebug_proc_open(struct inode * inode,struct file * file)1181 static int ddebug_proc_open(struct inode *inode, struct file *file)
1182 {
1183 	return seq_open_private(file, &ddebug_proc_seqops,
1184 				sizeof(struct ddebug_iter));
1185 }
1186 
1187 static const struct file_operations ddebug_proc_fops = {
1188 	.owner = THIS_MODULE,
1189 	.open = ddebug_proc_open,
1190 	.read = seq_read,
1191 	.llseek = seq_lseek,
1192 	.release = seq_release_private,
1193 	.write = ddebug_proc_write
1194 };
1195 
1196 static const struct proc_ops proc_fops = {
1197 	.proc_open = ddebug_proc_open,
1198 	.proc_read = seq_read,
1199 	.proc_lseek = seq_lseek,
1200 	.proc_release = seq_release_private,
1201 	.proc_write = ddebug_proc_write
1202 };
1203 
ddebug_attach_module_classes(struct ddebug_table * dt,struct ddebug_class_map * classes,int num_classes)1204 static void ddebug_attach_module_classes(struct ddebug_table *dt,
1205 					 struct ddebug_class_map *classes,
1206 					 int num_classes)
1207 {
1208 	struct ddebug_class_map *cm;
1209 	int i, j, ct = 0;
1210 
1211 	for (cm = classes, i = 0; i < num_classes; i++, cm++) {
1212 
1213 		if (!strcmp(cm->mod_name, dt->mod_name)) {
1214 
1215 			v2pr_info("class[%d]: module:%s base:%d len:%d ty:%d\n", i,
1216 				  cm->mod_name, cm->base, cm->length, cm->map_type);
1217 
1218 			for (j = 0; j < cm->length; j++)
1219 				v3pr_info(" %d: %d %s\n", j + cm->base, j,
1220 					  cm->class_names[j]);
1221 
1222 			list_add(&cm->link, &dt->maps);
1223 			ct++;
1224 		}
1225 	}
1226 	if (ct)
1227 		vpr_info("module:%s attached %d classes\n", dt->mod_name, ct);
1228 }
1229 
1230 /*
1231  * Allocate a new ddebug_table for the given module
1232  * and add it to the global list.
1233  */
ddebug_add_module(struct _ddebug_info * di,const char * modname)1234 static int ddebug_add_module(struct _ddebug_info *di, const char *modname)
1235 {
1236 	struct ddebug_table *dt;
1237 
1238 	v3pr_info("add-module: %s.%d sites\n", modname, di->num_descs);
1239 	if (!di->num_descs) {
1240 		v3pr_info(" skip %s\n", modname);
1241 		return 0;
1242 	}
1243 
1244 	dt = kzalloc(sizeof(*dt), GFP_KERNEL);
1245 	if (dt == NULL) {
1246 		pr_err("error adding module: %s\n", modname);
1247 		return -ENOMEM;
1248 	}
1249 	/*
1250 	 * For built-in modules, name lives in .rodata and is
1251 	 * immortal. For loaded modules, name points at the name[]
1252 	 * member of struct module, which lives at least as long as
1253 	 * this struct ddebug_table.
1254 	 */
1255 	dt->mod_name = modname;
1256 	dt->ddebugs = di->descs;
1257 	dt->num_ddebugs = di->num_descs;
1258 
1259 	INIT_LIST_HEAD(&dt->link);
1260 	INIT_LIST_HEAD(&dt->maps);
1261 
1262 	if (di->classes && di->num_classes)
1263 		ddebug_attach_module_classes(dt, di->classes, di->num_classes);
1264 
1265 	mutex_lock(&ddebug_lock);
1266 	list_add_tail(&dt->link, &ddebug_tables);
1267 	mutex_unlock(&ddebug_lock);
1268 
1269 	vpr_info("%3u debug prints in module %s\n", di->num_descs, modname);
1270 	return 0;
1271 }
1272 
1273 /* helper for ddebug_dyndbg_(boot|module)_param_cb */
ddebug_dyndbg_param_cb(char * param,char * val,const char * modname,int on_err)1274 static int ddebug_dyndbg_param_cb(char *param, char *val,
1275 				const char *modname, int on_err)
1276 {
1277 	char *sep;
1278 
1279 	sep = strchr(param, '.');
1280 	if (sep) {
1281 		/* needed only for ddebug_dyndbg_boot_param_cb */
1282 		*sep = '\0';
1283 		modname = param;
1284 		param = sep + 1;
1285 	}
1286 	if (strcmp(param, "dyndbg"))
1287 		return on_err; /* determined by caller */
1288 
1289 	ddebug_exec_queries((val ? val : "+p"), modname);
1290 
1291 	return 0; /* query failure shouldn't stop module load */
1292 }
1293 
1294 /* handle both dyndbg and $module.dyndbg params at boot */
ddebug_dyndbg_boot_param_cb(char * param,char * val,const char * unused,void * arg)1295 static int ddebug_dyndbg_boot_param_cb(char *param, char *val,
1296 				const char *unused, void *arg)
1297 {
1298 	vpr_info("%s=\"%s\"\n", param, val);
1299 	return ddebug_dyndbg_param_cb(param, val, NULL, 0);
1300 }
1301 
1302 /*
1303  * modprobe foo finds foo.params in boot-args, strips "foo.", and
1304  * passes them to load_module().  This callback gets unknown params,
1305  * processes dyndbg params, rejects others.
1306  */
ddebug_dyndbg_module_param_cb(char * param,char * val,const char * module)1307 int ddebug_dyndbg_module_param_cb(char *param, char *val, const char *module)
1308 {
1309 	vpr_info("module: %s %s=\"%s\"\n", module, param, val);
1310 	return ddebug_dyndbg_param_cb(param, val, module, -ENOENT);
1311 }
1312 
ddebug_table_free(struct ddebug_table * dt)1313 static void ddebug_table_free(struct ddebug_table *dt)
1314 {
1315 	list_del_init(&dt->link);
1316 	kfree(dt);
1317 }
1318 
1319 #ifdef CONFIG_MODULES
1320 
1321 /*
1322  * Called in response to a module being unloaded.  Removes
1323  * any ddebug_table's which point at the module.
1324  */
ddebug_remove_module(const char * mod_name)1325 static int ddebug_remove_module(const char *mod_name)
1326 {
1327 	struct ddebug_table *dt, *nextdt;
1328 	int ret = -ENOENT;
1329 
1330 	mutex_lock(&ddebug_lock);
1331 	list_for_each_entry_safe(dt, nextdt, &ddebug_tables, link) {
1332 		if (dt->mod_name == mod_name) {
1333 			ddebug_table_free(dt);
1334 			ret = 0;
1335 			break;
1336 		}
1337 	}
1338 	mutex_unlock(&ddebug_lock);
1339 	if (!ret)
1340 		v2pr_info("removed module \"%s\"\n", mod_name);
1341 	return ret;
1342 }
1343 
ddebug_module_notify(struct notifier_block * self,unsigned long val,void * data)1344 static int ddebug_module_notify(struct notifier_block *self, unsigned long val,
1345 				void *data)
1346 {
1347 	struct module *mod = data;
1348 	int ret = 0;
1349 
1350 	switch (val) {
1351 	case MODULE_STATE_COMING:
1352 		ret = ddebug_add_module(&mod->dyndbg_info, mod->name);
1353 		if (ret)
1354 			WARN(1, "Failed to allocate memory: dyndbg may not work properly.\n");
1355 		break;
1356 	case MODULE_STATE_GOING:
1357 		ddebug_remove_module(mod->name);
1358 		break;
1359 	}
1360 
1361 	return notifier_from_errno(ret);
1362 }
1363 
1364 static struct notifier_block ddebug_module_nb = {
1365 	.notifier_call = ddebug_module_notify,
1366 	.priority = 0, /* dynamic debug depends on jump label */
1367 };
1368 
1369 #endif /* CONFIG_MODULES */
1370 
ddebug_remove_all_tables(void)1371 static void ddebug_remove_all_tables(void)
1372 {
1373 	mutex_lock(&ddebug_lock);
1374 	while (!list_empty(&ddebug_tables)) {
1375 		struct ddebug_table *dt = list_entry(ddebug_tables.next,
1376 						      struct ddebug_table,
1377 						      link);
1378 		ddebug_table_free(dt);
1379 	}
1380 	mutex_unlock(&ddebug_lock);
1381 }
1382 
1383 static __initdata int ddebug_init_success;
1384 
dynamic_debug_init_control(void)1385 static int __init dynamic_debug_init_control(void)
1386 {
1387 	struct proc_dir_entry *procfs_dir;
1388 	struct dentry *debugfs_dir;
1389 
1390 	if (!ddebug_init_success)
1391 		return -ENODEV;
1392 
1393 	/* Create the control file in debugfs if it is enabled */
1394 	if (debugfs_initialized()) {
1395 		debugfs_dir = debugfs_create_dir("dynamic_debug", NULL);
1396 		debugfs_create_file("control", 0644, debugfs_dir, NULL,
1397 				    &ddebug_proc_fops);
1398 	}
1399 
1400 	/* Also create the control file in procfs */
1401 	procfs_dir = proc_mkdir("dynamic_debug", NULL);
1402 	if (procfs_dir)
1403 		proc_create("control", 0644, procfs_dir, &proc_fops);
1404 
1405 	return 0;
1406 }
1407 
dynamic_debug_init(void)1408 static int __init dynamic_debug_init(void)
1409 {
1410 	struct _ddebug *iter, *iter_mod_start;
1411 	int ret, i, mod_sites, mod_ct;
1412 	const char *modname;
1413 	char *cmdline;
1414 
1415 	struct _ddebug_info di = {
1416 		.descs = __start___dyndbg,
1417 		.classes = __start___dyndbg_classes,
1418 		.num_descs = __stop___dyndbg - __start___dyndbg,
1419 		.num_classes = __stop___dyndbg_classes - __start___dyndbg_classes,
1420 	};
1421 
1422 #ifdef CONFIG_MODULES
1423 	ret = register_module_notifier(&ddebug_module_nb);
1424 	if (ret) {
1425 		pr_warn("Failed to register dynamic debug module notifier\n");
1426 		return ret;
1427 	}
1428 #endif /* CONFIG_MODULES */
1429 
1430 	if (&__start___dyndbg == &__stop___dyndbg) {
1431 		if (IS_ENABLED(CONFIG_DYNAMIC_DEBUG)) {
1432 			pr_warn("_ddebug table is empty in a CONFIG_DYNAMIC_DEBUG build\n");
1433 			return 1;
1434 		}
1435 		pr_info("Ignore empty _ddebug table in a CONFIG_DYNAMIC_DEBUG_CORE build\n");
1436 		ddebug_init_success = 1;
1437 		return 0;
1438 	}
1439 
1440 	iter = iter_mod_start = __start___dyndbg;
1441 	modname = iter->modname;
1442 	i = mod_sites = mod_ct = 0;
1443 
1444 	for (; iter < __stop___dyndbg; iter++, i++, mod_sites++) {
1445 
1446 		if (strcmp(modname, iter->modname)) {
1447 			mod_ct++;
1448 			di.num_descs = mod_sites;
1449 			di.descs = iter_mod_start;
1450 			ret = ddebug_add_module(&di, modname);
1451 			if (ret)
1452 				goto out_err;
1453 
1454 			mod_sites = 0;
1455 			modname = iter->modname;
1456 			iter_mod_start = iter;
1457 		}
1458 	}
1459 	di.num_descs = mod_sites;
1460 	di.descs = iter_mod_start;
1461 	ret = ddebug_add_module(&di, modname);
1462 	if (ret)
1463 		goto out_err;
1464 
1465 	ddebug_init_success = 1;
1466 	vpr_info("%d prdebugs in %d modules, %d KiB in ddebug tables, %d kiB in __dyndbg section\n",
1467 		 i, mod_ct, (int)((mod_ct * sizeof(struct ddebug_table)) >> 10),
1468 		 (int)((i * sizeof(struct _ddebug)) >> 10));
1469 
1470 	if (di.num_classes)
1471 		v2pr_info("  %d builtin ddebug class-maps\n", di.num_classes);
1472 
1473 	/* now that ddebug tables are loaded, process all boot args
1474 	 * again to find and activate queries given in dyndbg params.
1475 	 * While this has already been done for known boot params, it
1476 	 * ignored the unknown ones (dyndbg in particular).  Reusing
1477 	 * parse_args avoids ad-hoc parsing.  This will also attempt
1478 	 * to activate queries for not-yet-loaded modules, which is
1479 	 * slightly noisy if verbose, but harmless.
1480 	 */
1481 	cmdline = kstrdup(saved_command_line, GFP_KERNEL);
1482 	parse_args("dyndbg params", cmdline, NULL,
1483 		   0, 0, 0, NULL, &ddebug_dyndbg_boot_param_cb);
1484 	kfree(cmdline);
1485 	return 0;
1486 
1487 out_err:
1488 	ddebug_remove_all_tables();
1489 	return 0;
1490 }
1491 /* Allow early initialization for boot messages via boot param */
1492 early_initcall(dynamic_debug_init);
1493 
1494 /* Debugfs setup must be done later */
1495 fs_initcall(dynamic_debug_init_control);
1496