Skip to content
  • Jim Cromie's avatar
    dynamic_debug: make dynamic-debug work for module initialization · b48420c1
    Jim Cromie authored
    This introduces a fake module param $module.dyndbg.  Its based upon
    Thomas Renninger's $module.ddebug boot-time debugging patch from
    https://lkml.org/lkml/2010/9/15/397
    
    
    
    The 'fake' module parameter is provided for all modules, whether or
    not they need it.  It is not explicitly added to each module, but is
    implemented in callbacks invoked from parse_args.
    
    For builtin modules, dynamic_debug_init() now directly calls
    parse_args(..., &ddebug_dyndbg_boot_params_cb), to process the params
    undeclared in the modules, just after the ddebug tables are processed.
    
    While its slightly weird to reprocess the boot params, parse_args() is
    already called repeatedly by do_initcall_levels().  More importantly,
    the dyndbg queries (given in ddebug_query or dyndbg params) cannot be
    activated until after the ddebug tables are ready, and reusing
    parse_args is cleaner than doing an ad-hoc parse.  This reparse would
    break options like inc_verbosity, but they probably should be params,
    like verbosity=3.
    
    ddebug_dyndbg_boot_params_cb() handles both bare dyndbg (aka:
    ddebug_query) and module-prefixed dyndbg params, and ignores all other
    parameters.  For example, the following will enable pr_debug()s in 4
    builtin modules, in the order given:
    
      dyndbg="module params +p; module aio +p" module.dyndbg=+p pci.dyndbg
    
    For loadable modules, parse_args() in load_module() calls
    ddebug_dyndbg_module_params_cb().  This handles bare dyndbg params as
    passed from modprobe, and errors on other unknown params.
    
    Note that modprobe reads /proc/cmdline, so "modprobe foo" grabs all
    foo.params, strips the "foo.", and passes these to the kernel.
    ddebug_dyndbg_module_params_cb() is again called for the unknown
    params; it handles dyndbg, and errors on others.  The "doing" arg
    added previously contains the module name.
    
    For non CONFIG_DYNAMIC_DEBUG builds, the stub function accepts
    and ignores $module.dyndbg params, other unknowns get -ENOENT.
    
    If no param value is given (as in pci.dyndbg example above), "+p" is
    assumed, which enables all pr_debug callsites in the module.
    
    The dyndbg fake parameter is not shown in /sys/module/*/parameters,
    thus it does not use any resources.  Changes to it are made via the
    control file.
    
    Also change pr_info in ddebug_exec_queries to vpr_info,
    no need to see it all the time.
    
    Signed-off-by: default avatarJim Cromie <jim.cromie@gmail.com>
    CC: Thomas Renninger <trenn@suse.de>
    CC: Rusty Russell <rusty@rustcorp.com.au>
    Acked-by: default avatarJason Baron <jbaron@redhat.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    b48420c1