cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

dynamic_debug.c (28605B)


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