dynamic_debug.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949
  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. */
  12. #define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
  13. #include <linux/kernel.h>
  14. #include <linux/module.h>
  15. #include <linux/moduleparam.h>
  16. #include <linux/kallsyms.h>
  17. #include <linux/types.h>
  18. #include <linux/mutex.h>
  19. #include <linux/proc_fs.h>
  20. #include <linux/seq_file.h>
  21. #include <linux/list.h>
  22. #include <linux/sysctl.h>
  23. #include <linux/ctype.h>
  24. #include <linux/string.h>
  25. #include <linux/uaccess.h>
  26. #include <linux/dynamic_debug.h>
  27. #include <linux/debugfs.h>
  28. #include <linux/slab.h>
  29. #include <linux/jump_label.h>
  30. #include <linux/hardirq.h>
  31. #include <linux/sched.h>
  32. #include <linux/device.h>
  33. #include <linux/netdevice.h>
  34. extern struct _ddebug __start___verbose[];
  35. extern struct _ddebug __stop___verbose[];
  36. struct ddebug_table {
  37. struct list_head link;
  38. char *mod_name;
  39. unsigned int num_ddebugs;
  40. struct _ddebug *ddebugs;
  41. };
  42. struct ddebug_query {
  43. const char *filename;
  44. const char *module;
  45. const char *function;
  46. const char *format;
  47. unsigned int first_lineno, last_lineno;
  48. };
  49. struct ddebug_iter {
  50. struct ddebug_table *table;
  51. unsigned int idx;
  52. };
  53. static DEFINE_MUTEX(ddebug_lock);
  54. static LIST_HEAD(ddebug_tables);
  55. static int verbose = 0;
  56. module_param(verbose, int, 0644);
  57. /* Return the last part of a pathname */
  58. static inline const char *basename(const char *path)
  59. {
  60. const char *tail = strrchr(path, '/');
  61. return tail ? tail+1 : path;
  62. }
  63. /* Return the path relative to source root */
  64. static inline const char *trim_prefix(const char *path)
  65. {
  66. int skip = strlen(__FILE__) - strlen("lib/dynamic_debug.c");
  67. if (strncmp(path, __FILE__, skip))
  68. skip = 0; /* prefix mismatch, don't skip */
  69. return path + skip;
  70. }
  71. static struct { unsigned flag:8; char opt_char; } opt_array[] = {
  72. { _DPRINTK_FLAGS_PRINT, 'p' },
  73. { _DPRINTK_FLAGS_INCL_MODNAME, 'm' },
  74. { _DPRINTK_FLAGS_INCL_FUNCNAME, 'f' },
  75. { _DPRINTK_FLAGS_INCL_LINENO, 'l' },
  76. { _DPRINTK_FLAGS_INCL_TID, 't' },
  77. { _DPRINTK_FLAGS_NONE, '_' },
  78. };
  79. /* format a string into buf[] which describes the _ddebug's flags */
  80. static char *ddebug_describe_flags(struct _ddebug *dp, char *buf,
  81. size_t maxlen)
  82. {
  83. char *p = buf;
  84. int i;
  85. BUG_ON(maxlen < 6);
  86. for (i = 0; i < ARRAY_SIZE(opt_array); ++i)
  87. if (dp->flags & opt_array[i].flag)
  88. *p++ = opt_array[i].opt_char;
  89. if (p == buf)
  90. *p++ = '_';
  91. *p = '\0';
  92. return buf;
  93. }
  94. #define vpr_info_dq(q, msg) \
  95. do { \
  96. if (verbose) \
  97. /* trim last char off format print */ \
  98. pr_info("%s: func=\"%s\" file=\"%s\" " \
  99. "module=\"%s\" format=\"%.*s\" " \
  100. "lineno=%u-%u", \
  101. msg, \
  102. q->function ? q->function : "", \
  103. q->filename ? q->filename : "", \
  104. q->module ? q->module : "", \
  105. (int)(q->format ? strlen(q->format) - 1 : 0), \
  106. q->format ? q->format : "", \
  107. q->first_lineno, q->last_lineno); \
  108. } while (0)
  109. /*
  110. * Search the tables for _ddebug's which match the given
  111. * `query' and apply the `flags' and `mask' to them. Tells
  112. * the user which ddebug's were changed, or whether none
  113. * were matched.
  114. */
  115. static void ddebug_change(const struct ddebug_query *query,
  116. unsigned int flags, unsigned int mask)
  117. {
  118. int i;
  119. struct ddebug_table *dt;
  120. unsigned int newflags;
  121. unsigned int nfound = 0;
  122. char flagbuf[10];
  123. /* search for matching ddebugs */
  124. mutex_lock(&ddebug_lock);
  125. list_for_each_entry(dt, &ddebug_tables, link) {
  126. /* match against the module name */
  127. if (query->module && strcmp(query->module, dt->mod_name))
  128. continue;
  129. for (i = 0 ; i < dt->num_ddebugs ; i++) {
  130. struct _ddebug *dp = &dt->ddebugs[i];
  131. /* match against the source filename */
  132. if (query->filename &&
  133. strcmp(query->filename, dp->filename) &&
  134. strcmp(query->filename, basename(dp->filename)) &&
  135. strcmp(query->filename, trim_prefix(dp->filename)))
  136. continue;
  137. /* match against the function */
  138. if (query->function &&
  139. strcmp(query->function, dp->function))
  140. continue;
  141. /* match against the format */
  142. if (query->format &&
  143. !strstr(dp->format, query->format))
  144. continue;
  145. /* match against the line number range */
  146. if (query->first_lineno &&
  147. dp->lineno < query->first_lineno)
  148. continue;
  149. if (query->last_lineno &&
  150. dp->lineno > query->last_lineno)
  151. continue;
  152. nfound++;
  153. newflags = (dp->flags & mask) | flags;
  154. if (newflags == dp->flags)
  155. continue;
  156. dp->flags = newflags;
  157. if (verbose)
  158. pr_info("changed %s:%d [%s]%s =%s\n",
  159. trim_prefix(dp->filename), dp->lineno,
  160. dt->mod_name, dp->function,
  161. ddebug_describe_flags(dp, flagbuf,
  162. sizeof(flagbuf)));
  163. }
  164. }
  165. mutex_unlock(&ddebug_lock);
  166. if (!nfound && verbose)
  167. pr_info("no matches for query\n");
  168. }
  169. /*
  170. * Split the buffer `buf' into space-separated words.
  171. * Handles simple " and ' quoting, i.e. without nested,
  172. * embedded or escaped \". Return the number of words
  173. * or <0 on error.
  174. */
  175. static int ddebug_tokenize(char *buf, char *words[], int maxwords)
  176. {
  177. int nwords = 0;
  178. while (*buf) {
  179. char *end;
  180. /* Skip leading whitespace */
  181. buf = skip_spaces(buf);
  182. if (!*buf)
  183. break; /* oh, it was trailing whitespace */
  184. if (*buf == '#')
  185. break; /* token starts comment, skip rest of line */
  186. /* find `end' of word, whitespace separated or quoted */
  187. if (*buf == '"' || *buf == '\'') {
  188. int quote = *buf++;
  189. for (end = buf ; *end && *end != quote ; end++)
  190. ;
  191. if (!*end)
  192. return -EINVAL; /* unclosed quote */
  193. } else {
  194. for (end = buf ; *end && !isspace(*end) ; end++)
  195. ;
  196. BUG_ON(end == buf);
  197. }
  198. /* `buf' is start of word, `end' is one past its end */
  199. if (nwords == maxwords)
  200. return -EINVAL; /* ran out of words[] before bytes */
  201. if (*end)
  202. *end++ = '\0'; /* terminate the word */
  203. words[nwords++] = buf;
  204. buf = end;
  205. }
  206. if (verbose) {
  207. int i;
  208. pr_info("split into words:");
  209. for (i = 0 ; i < nwords ; i++)
  210. pr_cont(" \"%s\"", words[i]);
  211. pr_cont("\n");
  212. }
  213. return nwords;
  214. }
  215. /*
  216. * Parse a single line number. Note that the empty string ""
  217. * is treated as a special case and converted to zero, which
  218. * is later treated as a "don't care" value.
  219. */
  220. static inline int parse_lineno(const char *str, unsigned int *val)
  221. {
  222. char *end = NULL;
  223. BUG_ON(str == NULL);
  224. if (*str == '\0') {
  225. *val = 0;
  226. return 0;
  227. }
  228. *val = simple_strtoul(str, &end, 10);
  229. return end == NULL || end == str || *end != '\0' ? -EINVAL : 0;
  230. }
  231. /*
  232. * Undo octal escaping in a string, inplace. This is useful to
  233. * allow the user to express a query which matches a format
  234. * containing embedded spaces.
  235. */
  236. #define isodigit(c) ((c) >= '0' && (c) <= '7')
  237. static char *unescape(char *str)
  238. {
  239. char *in = str;
  240. char *out = str;
  241. while (*in) {
  242. if (*in == '\\') {
  243. if (in[1] == '\\') {
  244. *out++ = '\\';
  245. in += 2;
  246. continue;
  247. } else if (in[1] == 't') {
  248. *out++ = '\t';
  249. in += 2;
  250. continue;
  251. } else if (in[1] == 'n') {
  252. *out++ = '\n';
  253. in += 2;
  254. continue;
  255. } else if (isodigit(in[1]) &&
  256. isodigit(in[2]) &&
  257. isodigit(in[3])) {
  258. *out++ = ((in[1] - '0')<<6) |
  259. ((in[2] - '0')<<3) |
  260. (in[3] - '0');
  261. in += 4;
  262. continue;
  263. }
  264. }
  265. *out++ = *in++;
  266. }
  267. *out = '\0';
  268. return str;
  269. }
  270. static int check_set(const char **dest, char *src, char *name)
  271. {
  272. int rc = 0;
  273. if (*dest) {
  274. rc = -EINVAL;
  275. pr_err("match-spec:%s val:%s overridden by %s",
  276. name, *dest, src);
  277. }
  278. *dest = src;
  279. return rc;
  280. }
  281. /*
  282. * Parse words[] as a ddebug query specification, which is a series
  283. * of (keyword, value) pairs chosen from these possibilities:
  284. *
  285. * func <function-name>
  286. * file <full-pathname>
  287. * file <base-filename>
  288. * module <module-name>
  289. * format <escaped-string-to-find-in-format>
  290. * line <lineno>
  291. * line <first-lineno>-<last-lineno> // where either may be empty
  292. *
  293. * Only 1 of each type is allowed.
  294. * Returns 0 on success, <0 on error.
  295. */
  296. static int ddebug_parse_query(char *words[], int nwords,
  297. struct ddebug_query *query)
  298. {
  299. unsigned int i;
  300. int rc;
  301. /* check we have an even number of words */
  302. if (nwords % 2 != 0)
  303. return -EINVAL;
  304. memset(query, 0, sizeof(*query));
  305. for (i = 0 ; i < nwords ; i += 2) {
  306. if (!strcmp(words[i], "func"))
  307. rc = check_set(&query->function, words[i+1], "func");
  308. else if (!strcmp(words[i], "file"))
  309. rc = check_set(&query->filename, words[i+1], "file");
  310. else if (!strcmp(words[i], "module"))
  311. rc = check_set(&query->module, words[i+1], "module");
  312. else if (!strcmp(words[i], "format"))
  313. rc = check_set(&query->format, unescape(words[i+1]),
  314. "format");
  315. else if (!strcmp(words[i], "line")) {
  316. char *first = words[i+1];
  317. char *last = strchr(first, '-');
  318. if (query->first_lineno || query->last_lineno) {
  319. pr_err("match-spec:line given 2 times\n");
  320. return -EINVAL;
  321. }
  322. if (last)
  323. *last++ = '\0';
  324. if (parse_lineno(first, &query->first_lineno) < 0)
  325. return -EINVAL;
  326. if (last) {
  327. /* range <first>-<last> */
  328. if (parse_lineno(last, &query->last_lineno)
  329. < query->first_lineno) {
  330. pr_err("last-line < 1st-line\n");
  331. return -EINVAL;
  332. }
  333. } else {
  334. query->last_lineno = query->first_lineno;
  335. }
  336. } else {
  337. pr_err("unknown keyword \"%s\"\n", words[i]);
  338. return -EINVAL;
  339. }
  340. if (rc)
  341. return rc;
  342. }
  343. vpr_info_dq(query, "parsed");
  344. return 0;
  345. }
  346. /*
  347. * Parse `str' as a flags specification, format [-+=][p]+.
  348. * Sets up *maskp and *flagsp to be used when changing the
  349. * flags fields of matched _ddebug's. Returns 0 on success
  350. * or <0 on error.
  351. */
  352. static int ddebug_parse_flags(const char *str, unsigned int *flagsp,
  353. unsigned int *maskp)
  354. {
  355. unsigned flags = 0;
  356. int op = '=', i;
  357. switch (*str) {
  358. case '+':
  359. case '-':
  360. case '=':
  361. op = *str++;
  362. break;
  363. default:
  364. return -EINVAL;
  365. }
  366. if (verbose)
  367. pr_info("op='%c'\n", op);
  368. for ( ; *str ; ++str) {
  369. for (i = ARRAY_SIZE(opt_array) - 1; i >= 0; i--) {
  370. if (*str == opt_array[i].opt_char) {
  371. flags |= opt_array[i].flag;
  372. break;
  373. }
  374. }
  375. if (i < 0)
  376. return -EINVAL;
  377. }
  378. if (verbose)
  379. pr_info("flags=0x%x\n", flags);
  380. /* calculate final *flagsp, *maskp according to mask and op */
  381. switch (op) {
  382. case '=':
  383. *maskp = 0;
  384. *flagsp = flags;
  385. break;
  386. case '+':
  387. *maskp = ~0U;
  388. *flagsp = flags;
  389. break;
  390. case '-':
  391. *maskp = ~flags;
  392. *flagsp = 0;
  393. break;
  394. }
  395. if (verbose)
  396. pr_info("*flagsp=0x%x *maskp=0x%x\n", *flagsp, *maskp);
  397. return 0;
  398. }
  399. static int ddebug_exec_query(char *query_string)
  400. {
  401. unsigned int flags = 0, mask = 0;
  402. struct ddebug_query query;
  403. #define MAXWORDS 9
  404. int nwords;
  405. char *words[MAXWORDS];
  406. nwords = ddebug_tokenize(query_string, words, MAXWORDS);
  407. if (nwords <= 0)
  408. return -EINVAL;
  409. if (ddebug_parse_query(words, nwords-1, &query))
  410. return -EINVAL;
  411. if (ddebug_parse_flags(words[nwords-1], &flags, &mask))
  412. return -EINVAL;
  413. /* actually go and implement the change */
  414. ddebug_change(&query, flags, mask);
  415. return 0;
  416. }
  417. #define PREFIX_SIZE 64
  418. static int remaining(int wrote)
  419. {
  420. if (PREFIX_SIZE - wrote > 0)
  421. return PREFIX_SIZE - wrote;
  422. return 0;
  423. }
  424. static char *dynamic_emit_prefix(const struct _ddebug *desc, char *buf)
  425. {
  426. int pos_after_tid;
  427. int pos = 0;
  428. pos += snprintf(buf + pos, remaining(pos), "%s", KERN_DEBUG);
  429. if (desc->flags & _DPRINTK_FLAGS_INCL_TID) {
  430. if (in_interrupt())
  431. pos += snprintf(buf + pos, remaining(pos), "%s ",
  432. "<intr>");
  433. else
  434. pos += snprintf(buf + pos, remaining(pos), "[%d] ",
  435. task_pid_vnr(current));
  436. }
  437. pos_after_tid = pos;
  438. if (desc->flags & _DPRINTK_FLAGS_INCL_MODNAME)
  439. pos += snprintf(buf + pos, remaining(pos), "%s:",
  440. desc->modname);
  441. if (desc->flags & _DPRINTK_FLAGS_INCL_FUNCNAME)
  442. pos += snprintf(buf + pos, remaining(pos), "%s:",
  443. desc->function);
  444. if (desc->flags & _DPRINTK_FLAGS_INCL_LINENO)
  445. pos += snprintf(buf + pos, remaining(pos), "%d:",
  446. desc->lineno);
  447. if (pos - pos_after_tid)
  448. pos += snprintf(buf + pos, remaining(pos), " ");
  449. if (pos >= PREFIX_SIZE)
  450. buf[PREFIX_SIZE - 1] = '\0';
  451. return buf;
  452. }
  453. int __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...)
  454. {
  455. va_list args;
  456. int res;
  457. struct va_format vaf;
  458. char buf[PREFIX_SIZE];
  459. BUG_ON(!descriptor);
  460. BUG_ON(!fmt);
  461. va_start(args, fmt);
  462. vaf.fmt = fmt;
  463. vaf.va = &args;
  464. res = printk("%s%pV", dynamic_emit_prefix(descriptor, buf), &vaf);
  465. va_end(args);
  466. return res;
  467. }
  468. EXPORT_SYMBOL(__dynamic_pr_debug);
  469. int __dynamic_dev_dbg(struct _ddebug *descriptor,
  470. const struct device *dev, const char *fmt, ...)
  471. {
  472. struct va_format vaf;
  473. va_list args;
  474. int res;
  475. char buf[PREFIX_SIZE];
  476. BUG_ON(!descriptor);
  477. BUG_ON(!fmt);
  478. va_start(args, fmt);
  479. vaf.fmt = fmt;
  480. vaf.va = &args;
  481. res = __dev_printk(dynamic_emit_prefix(descriptor, buf), dev, &vaf);
  482. va_end(args);
  483. return res;
  484. }
  485. EXPORT_SYMBOL(__dynamic_dev_dbg);
  486. #ifdef CONFIG_NET
  487. int __dynamic_netdev_dbg(struct _ddebug *descriptor,
  488. const struct net_device *dev, const char *fmt, ...)
  489. {
  490. struct va_format vaf;
  491. va_list args;
  492. int res;
  493. char buf[PREFIX_SIZE];
  494. BUG_ON(!descriptor);
  495. BUG_ON(!fmt);
  496. va_start(args, fmt);
  497. vaf.fmt = fmt;
  498. vaf.va = &args;
  499. res = __netdev_printk(dynamic_emit_prefix(descriptor, buf), dev, &vaf);
  500. va_end(args);
  501. return res;
  502. }
  503. EXPORT_SYMBOL(__dynamic_netdev_dbg);
  504. #endif
  505. #define DDEBUG_STRING_SIZE 1024
  506. static __initdata char ddebug_setup_string[DDEBUG_STRING_SIZE];
  507. static __init int ddebug_setup_query(char *str)
  508. {
  509. if (strlen(str) >= DDEBUG_STRING_SIZE) {
  510. pr_warn("ddebug boot param string too large\n");
  511. return 0;
  512. }
  513. strlcpy(ddebug_setup_string, str, DDEBUG_STRING_SIZE);
  514. return 1;
  515. }
  516. __setup("ddebug_query=", ddebug_setup_query);
  517. /*
  518. * File_ops->write method for <debugfs>/dynamic_debug/conrol. Gathers the
  519. * command text from userspace, parses and executes it.
  520. */
  521. #define USER_BUF_PAGE 4096
  522. static ssize_t ddebug_proc_write(struct file *file, const char __user *ubuf,
  523. size_t len, loff_t *offp)
  524. {
  525. char *tmpbuf;
  526. int ret;
  527. if (len == 0)
  528. return 0;
  529. if (len > USER_BUF_PAGE - 1) {
  530. pr_warn("expected <%d bytes into control\n", USER_BUF_PAGE);
  531. return -E2BIG;
  532. }
  533. tmpbuf = kmalloc(len + 1, GFP_KERNEL);
  534. if (!tmpbuf)
  535. return -ENOMEM;
  536. if (copy_from_user(tmpbuf, ubuf, len)) {
  537. kfree(tmpbuf);
  538. return -EFAULT;
  539. }
  540. tmpbuf[len] = '\0';
  541. if (verbose)
  542. pr_info("read %d bytes from userspace\n", (int)len);
  543. ret = ddebug_exec_query(tmpbuf);
  544. kfree(tmpbuf);
  545. if (ret)
  546. return ret;
  547. *offp += len;
  548. return len;
  549. }
  550. /*
  551. * Set the iterator to point to the first _ddebug object
  552. * and return a pointer to that first object. Returns
  553. * NULL if there are no _ddebugs at all.
  554. */
  555. static struct _ddebug *ddebug_iter_first(struct ddebug_iter *iter)
  556. {
  557. if (list_empty(&ddebug_tables)) {
  558. iter->table = NULL;
  559. iter->idx = 0;
  560. return NULL;
  561. }
  562. iter->table = list_entry(ddebug_tables.next,
  563. struct ddebug_table, link);
  564. iter->idx = 0;
  565. return &iter->table->ddebugs[iter->idx];
  566. }
  567. /*
  568. * Advance the iterator to point to the next _ddebug
  569. * object from the one the iterator currently points at,
  570. * and returns a pointer to the new _ddebug. Returns
  571. * NULL if the iterator has seen all the _ddebugs.
  572. */
  573. static struct _ddebug *ddebug_iter_next(struct ddebug_iter *iter)
  574. {
  575. if (iter->table == NULL)
  576. return NULL;
  577. if (++iter->idx == iter->table->num_ddebugs) {
  578. /* iterate to next table */
  579. iter->idx = 0;
  580. if (list_is_last(&iter->table->link, &ddebug_tables)) {
  581. iter->table = NULL;
  582. return NULL;
  583. }
  584. iter->table = list_entry(iter->table->link.next,
  585. struct ddebug_table, link);
  586. }
  587. return &iter->table->ddebugs[iter->idx];
  588. }
  589. /*
  590. * Seq_ops start method. Called at the start of every
  591. * read() call from userspace. Takes the ddebug_lock and
  592. * seeks the seq_file's iterator to the given position.
  593. */
  594. static void *ddebug_proc_start(struct seq_file *m, loff_t *pos)
  595. {
  596. struct ddebug_iter *iter = m->private;
  597. struct _ddebug *dp;
  598. int n = *pos;
  599. if (verbose)
  600. pr_info("called m=%p *pos=%lld\n", m, (unsigned long long)*pos);
  601. mutex_lock(&ddebug_lock);
  602. if (!n)
  603. return SEQ_START_TOKEN;
  604. if (n < 0)
  605. return NULL;
  606. dp = ddebug_iter_first(iter);
  607. while (dp != NULL && --n > 0)
  608. dp = ddebug_iter_next(iter);
  609. return dp;
  610. }
  611. /*
  612. * Seq_ops next method. Called several times within a read()
  613. * call from userspace, with ddebug_lock held. Walks to the
  614. * next _ddebug object with a special case for the header line.
  615. */
  616. static void *ddebug_proc_next(struct seq_file *m, void *p, loff_t *pos)
  617. {
  618. struct ddebug_iter *iter = m->private;
  619. struct _ddebug *dp;
  620. if (verbose)
  621. pr_info("called m=%p p=%p *pos=%lld\n",
  622. m, p, (unsigned long long)*pos);
  623. if (p == SEQ_START_TOKEN)
  624. dp = ddebug_iter_first(iter);
  625. else
  626. dp = ddebug_iter_next(iter);
  627. ++*pos;
  628. return dp;
  629. }
  630. /*
  631. * Seq_ops show method. Called several times within a read()
  632. * call from userspace, with ddebug_lock held. Formats the
  633. * current _ddebug as a single human-readable line, with a
  634. * special case for the header line.
  635. */
  636. static int ddebug_proc_show(struct seq_file *m, void *p)
  637. {
  638. struct ddebug_iter *iter = m->private;
  639. struct _ddebug *dp = p;
  640. char flagsbuf[10];
  641. if (verbose)
  642. pr_info("called m=%p p=%p\n", m, p);
  643. if (p == SEQ_START_TOKEN) {
  644. seq_puts(m,
  645. "# filename:lineno [module]function flags format\n");
  646. return 0;
  647. }
  648. seq_printf(m, "%s:%u [%s]%s =%s \"",
  649. trim_prefix(dp->filename), dp->lineno,
  650. iter->table->mod_name, dp->function,
  651. ddebug_describe_flags(dp, flagsbuf, sizeof(flagsbuf)));
  652. seq_escape(m, dp->format, "\t\r\n\"");
  653. seq_puts(m, "\"\n");
  654. return 0;
  655. }
  656. /*
  657. * Seq_ops stop method. Called at the end of each read()
  658. * call from userspace. Drops ddebug_lock.
  659. */
  660. static void ddebug_proc_stop(struct seq_file *m, void *p)
  661. {
  662. if (verbose)
  663. pr_info("called m=%p p=%p\n", m, p);
  664. mutex_unlock(&ddebug_lock);
  665. }
  666. static const struct seq_operations ddebug_proc_seqops = {
  667. .start = ddebug_proc_start,
  668. .next = ddebug_proc_next,
  669. .show = ddebug_proc_show,
  670. .stop = ddebug_proc_stop
  671. };
  672. /*
  673. * File_ops->open method for <debugfs>/dynamic_debug/control. Does
  674. * the seq_file setup dance, and also creates an iterator to walk the
  675. * _ddebugs. Note that we create a seq_file always, even for O_WRONLY
  676. * files where it's not needed, as doing so simplifies the ->release
  677. * method.
  678. */
  679. static int ddebug_proc_open(struct inode *inode, struct file *file)
  680. {
  681. struct ddebug_iter *iter;
  682. int err;
  683. if (verbose)
  684. pr_info("called\n");
  685. iter = kzalloc(sizeof(*iter), GFP_KERNEL);
  686. if (iter == NULL)
  687. return -ENOMEM;
  688. err = seq_open(file, &ddebug_proc_seqops);
  689. if (err) {
  690. kfree(iter);
  691. return err;
  692. }
  693. ((struct seq_file *) file->private_data)->private = iter;
  694. return 0;
  695. }
  696. static const struct file_operations ddebug_proc_fops = {
  697. .owner = THIS_MODULE,
  698. .open = ddebug_proc_open,
  699. .read = seq_read,
  700. .llseek = seq_lseek,
  701. .release = seq_release_private,
  702. .write = ddebug_proc_write
  703. };
  704. /*
  705. * Allocate a new ddebug_table for the given module
  706. * and add it to the global list.
  707. */
  708. int ddebug_add_module(struct _ddebug *tab, unsigned int n,
  709. const char *name)
  710. {
  711. struct ddebug_table *dt;
  712. char *new_name;
  713. dt = kzalloc(sizeof(*dt), GFP_KERNEL);
  714. if (dt == NULL)
  715. return -ENOMEM;
  716. new_name = kstrdup(name, GFP_KERNEL);
  717. if (new_name == NULL) {
  718. kfree(dt);
  719. return -ENOMEM;
  720. }
  721. dt->mod_name = new_name;
  722. dt->num_ddebugs = n;
  723. dt->ddebugs = tab;
  724. mutex_lock(&ddebug_lock);
  725. list_add_tail(&dt->link, &ddebug_tables);
  726. mutex_unlock(&ddebug_lock);
  727. if (verbose)
  728. pr_info("%u debug prints in module %s\n", n, dt->mod_name);
  729. return 0;
  730. }
  731. EXPORT_SYMBOL_GPL(ddebug_add_module);
  732. static void ddebug_table_free(struct ddebug_table *dt)
  733. {
  734. list_del_init(&dt->link);
  735. kfree(dt->mod_name);
  736. kfree(dt);
  737. }
  738. /*
  739. * Called in response to a module being unloaded. Removes
  740. * any ddebug_table's which point at the module.
  741. */
  742. int ddebug_remove_module(const char *mod_name)
  743. {
  744. struct ddebug_table *dt, *nextdt;
  745. int ret = -ENOENT;
  746. if (verbose)
  747. pr_info("removing module \"%s\"\n", mod_name);
  748. mutex_lock(&ddebug_lock);
  749. list_for_each_entry_safe(dt, nextdt, &ddebug_tables, link) {
  750. if (!strcmp(dt->mod_name, mod_name)) {
  751. ddebug_table_free(dt);
  752. ret = 0;
  753. }
  754. }
  755. mutex_unlock(&ddebug_lock);
  756. return ret;
  757. }
  758. EXPORT_SYMBOL_GPL(ddebug_remove_module);
  759. static void ddebug_remove_all_tables(void)
  760. {
  761. mutex_lock(&ddebug_lock);
  762. while (!list_empty(&ddebug_tables)) {
  763. struct ddebug_table *dt = list_entry(ddebug_tables.next,
  764. struct ddebug_table,
  765. link);
  766. ddebug_table_free(dt);
  767. }
  768. mutex_unlock(&ddebug_lock);
  769. }
  770. static __initdata int ddebug_init_success;
  771. static int __init dynamic_debug_init_debugfs(void)
  772. {
  773. struct dentry *dir, *file;
  774. if (!ddebug_init_success)
  775. return -ENODEV;
  776. dir = debugfs_create_dir("dynamic_debug", NULL);
  777. if (!dir)
  778. return -ENOMEM;
  779. file = debugfs_create_file("control", 0644, dir, NULL,
  780. &ddebug_proc_fops);
  781. if (!file) {
  782. debugfs_remove(dir);
  783. return -ENOMEM;
  784. }
  785. return 0;
  786. }
  787. static int __init dynamic_debug_init(void)
  788. {
  789. struct _ddebug *iter, *iter_start;
  790. const char *modname = NULL;
  791. int ret = 0;
  792. int n = 0;
  793. if (__start___verbose == __stop___verbose) {
  794. pr_warn("_ddebug table is empty in a "
  795. "CONFIG_DYNAMIC_DEBUG build");
  796. return 1;
  797. }
  798. iter = __start___verbose;
  799. modname = iter->modname;
  800. iter_start = iter;
  801. for (; iter < __stop___verbose; iter++) {
  802. if (strcmp(modname, iter->modname)) {
  803. ret = ddebug_add_module(iter_start, n, modname);
  804. if (ret)
  805. goto out_free;
  806. n = 0;
  807. modname = iter->modname;
  808. iter_start = iter;
  809. }
  810. n++;
  811. }
  812. ret = ddebug_add_module(iter_start, n, modname);
  813. if (ret)
  814. goto out_free;
  815. /* ddebug_query boot param got passed -> set it up */
  816. if (ddebug_setup_string[0] != '\0') {
  817. ret = ddebug_exec_query(ddebug_setup_string);
  818. if (ret)
  819. pr_warn("Invalid ddebug boot param %s",
  820. ddebug_setup_string);
  821. else
  822. pr_info("ddebug initialized with string %s",
  823. ddebug_setup_string);
  824. }
  825. out_free:
  826. if (ret)
  827. ddebug_remove_all_tables();
  828. else
  829. ddebug_init_success = 1;
  830. return 0;
  831. }
  832. /* Allow early initialization for boot messages via boot param */
  833. arch_initcall(dynamic_debug_init);
  834. /* Debugfs setup must be done later */
  835. module_init(dynamic_debug_init_debugfs);