Linux Audio

Check our new training course

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