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