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