14 Dec, 2017

1 commit

  • [ Upstream commit 1f3c790bd5989fcfec9e53ad8fa09f5b740c958f ]

    line-range is supposed to treat "1-" as "1-endoffile", so
    handle the special case by setting last_lineno to UINT_MAX.

    Fixes this error:

    dynamic_debug:ddebug_parse_query: last-line:0 < 1st-line:1
    dynamic_debug:ddebug_exec_query: query parse failed

    Link: http://lkml.kernel.org/r/10a6a101-e2be-209f-1f41-54637824788e@infradead.org
    Signed-off-by: Randy Dunlap
    Acked-by: Jason Baron
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Randy Dunlap
     

04 Aug, 2016

1 commit

  • Although dynamic debug is often only used for debug builds, sometimes
    its enabled for production builds as well. Minimize its impact by using
    jump labels. This reduces the text section by 7000+ bytes in the kernel
    image below. It does increase data, but this should only be referenced
    when changing the direction of the branches, and hence usually not in
    cache.

    text data bss dec hex filename
    8194852 4879776 925696 14000324 d5a0c4 vmlinux.pre
    8187337 4960224 925696 14073257 d6bda9 vmlinux.post

    Link: http://lkml.kernel.org/r/d165b465e8c89bc582d973758d40be44c33f018b.1467837322.git.jbaron@akamai.com
    Signed-off-by: Jason Baron
    Cc: "David S. Miller"
    Cc: Arnd Bergmann
    Cc: Benjamin Herrenschmidt
    Cc: Chris Metcalf
    Cc: Heiko Carstens
    Cc: Joe Perches
    Cc: Martin Schwidefsky
    Cc: Michael Ellerman
    Cc: Paul Mackerras
    Cc: Peter Zijlstra
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Jason Baron
     

04 Jan, 2016

1 commit


07 Nov, 2015

1 commit


20 May, 2015

1 commit

  • This adds an extra argument onto parse_params() to be used
    as a way to make the unused callback a bit more useful and
    generic by allowing the caller to pass on a data structure
    of its choice. An example use case is to allow us to easily
    make module parameters for every module which we will do
    next.

    @ parse @
    identifier name, args, params, num, level_min, level_max;
    identifier unknown, param, val, doing;
    type s16;
    @@
    extern char *parse_args(const char *name,
    char *args,
    const struct kernel_param *params,
    unsigned num,
    s16 level_min,
    s16 level_max,
    + void *arg,
    int (*unknown)(char *param, char *val,
    const char *doing
    + , void *arg
    ));

    @ parse_mod @
    identifier name, args, params, num, level_min, level_max;
    identifier unknown, param, val, doing;
    type s16;
    @@
    char *parse_args(const char *name,
    char *args,
    const struct kernel_param *params,
    unsigned num,
    s16 level_min,
    s16 level_max,
    + void *arg,
    int (*unknown)(char *param, char *val,
    const char *doing
    + , void *arg
    ))
    {
    ...
    }

    @ parse_args_found @
    expression R, E1, E2, E3, E4, E5, E6;
    identifier func;
    @@

    (
    R =
    parse_args(E1, E2, E3, E4, E5, E6,
    + NULL,
    func);
    |
    R =
    parse_args(E1, E2, E3, E4, E5, E6,
    + NULL,
    &func);
    |
    R =
    parse_args(E1, E2, E3, E4, E5, E6,
    + NULL,
    NULL);
    |
    parse_args(E1, E2, E3, E4, E5, E6,
    + NULL,
    func);
    |
    parse_args(E1, E2, E3, E4, E5, E6,
    + NULL,
    &func);
    |
    parse_args(E1, E2, E3, E4, E5, E6,
    + NULL,
    NULL);
    )

    @ parse_args_unused depends on parse_args_found @
    identifier parse_args_found.func;
    @@

    int func(char *param, char *val, const char *unused
    + , void *arg
    )
    {
    ...
    }

    @ mod_unused depends on parse_args_found @
    identifier parse_args_found.func;
    expression A1, A2, A3;
    @@

    - func(A1, A2, A3);
    + func(A1, A2, A3, NULL);

    Generated-by: Coccinelle SmPL
    Cc: cocci@systeme.lip6.fr
    Cc: Tejun Heo
    Cc: Arjan van de Ven
    Cc: Greg Kroah-Hartman
    Cc: Rusty Russell
    Cc: Christoph Hellwig
    Cc: Felipe Contreras
    Cc: Ewan Milne
    Cc: Jean Delvare
    Cc: Hannes Reinecke
    Cc: Jani Nikula
    Cc: linux-kernel@vger.kernel.org
    Reviewed-by: Tejun Heo
    Acked-by: Rusty Russell
    Signed-off-by: Luis R. Rodriguez
    Signed-off-by: Greg Kroah-Hartman

    Luis R. Rodriguez
     

11 Feb, 2015

1 commit

  • Pull trivial tree changes from Jiri Kosina:
    "Patches from trivial.git that keep the world turning around.

    Mostly documentation and comment fixes, and a two corner-case code
    fixes from Alan Cox"

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial:
    kexec, Kconfig: spell "architecture" properly
    mm: fix cleancache debugfs directory path
    blackfin: mach-common: ints-priority: remove unused function
    doubletalk: probe failure causes OOPS
    ARM: cache-l2x0.c: Make it clear that cache-l2x0 handles L310 cache controller
    msdos_fs.h: fix 'fields' in comment
    scsi: aic7xxx: fix comment
    ARM: l2c: fix comment
    ibmraid: fix writeable attribute with no store method
    dynamic_debug: fix comment
    doc: usbmon: fix spelling s/unpriviledged/unprivileged/
    x86: init_mem_mapping(): use capital BIOS in comment

    Linus Torvalds
     

02 Jan, 2015

1 commit


11 Dec, 2014

1 commit


14 Oct, 2014

1 commit


04 Oct, 2014

1 commit


21 Jul, 2014

1 commit

  • This way we'll always know in what status the device is, unless it's
    running normally (i.e. NETDEV_REGISTERED).

    Also, emit a warning once in case of a bad reg_state.

    CC: "David S. Miller"
    CC: Jason Baron
    CC: Eric Dumazet
    CC: Vlad Yasevich
    CC: stephen hemminger
    CC: Jerry Chu
    CC: Ben Hutchings
    CC: Joe Perches
    Signed-off-by: Veaceslav Falico
    Signed-off-by: David S. Miller

    Veaceslav Falico
     

28 Jan, 2014

3 commits


24 Jan, 2014

1 commit

  • Add wildcard '*'(matches zero or more characters) and '?' (matches one
    character) support when qurying debug flags.

    Now we can open debug messages using keywords. eg:
    1. open debug logs in all usb drivers
    echo "file drivers/usb/* +p" > /dynamic_debug/control
    2. open debug logs for usb xhci code
    echo "file *xhci* +p" > /dynamic_debug/control

    Signed-off-by: Du, Changbin
    Cc: Jason Baron
    Cc: Joe Perches
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Du, Changbin
     

29 Aug, 2013

1 commit


01 May, 2013

1 commit


30 Apr, 2013

1 commit


18 Jan, 2013

2 commits

  • Ma noted that dynamic-debug is silent about many query errors, so add
    pr_err()s to explain those errors, and tweak a few others. Also parse
    flags 1st, so that match-spec errs are slightly clearer.

    CC: Jianpeng Ma
    CC: Joe Perches
    Signed-off-by: Jim Cromie
    Signed-off-by: Jason Baron
    Signed-off-by: Greg Kroah-Hartman

    Jim Cromie
     
  • vpr_info_dq should be a function and vpr_info should have
    a do {} while (0)

    Add missing newlines to pr_s.

    Miscellaneous neatening too.
    braces, coalescing formats, alignments, etc...

    Signed-off-by: Joe Perches
    Signed-off-by: Jason Baron
    Signed-off-by: Greg Kroah-Hartman

    Joe Perches
     

18 Dec, 2012

1 commit


17 Sep, 2012

4 commits

  • Convert direct calls of vprintk_emit and printk_emit to the
    dev_ equivalents.

    Make create_syslog_header static.

    Signed-off-by: Joe Perches
    Acked-by: David S. Miller
    Tested-by: Jim Cromie
    Acked-by: Jason Baron
    Signed-off-by: Greg Kroah-Hartman

    Joe Perches
     
  • netdev_printk originally called dev_printk with %pV.

    This style emitted the complete dev_printk header with
    a colon followed by the netdev_name prefix followed
    by a colon.

    Now that netdev_printk does not call dev_printk, the
    extra colon is superfluous. Remove it.

    Example:
    old: sky2 0000:02:00.0: eth0: Link is up at 100 Mbps, full duplex, flow control both
    new: sky2 0000:02:00.0 eth0: Link is up at 100 Mbps, full duplex, flow control both

    Signed-off-by: Joe Perches
    Acked-by: David S. Miller
    Tested-by: Jim Cromie
    Acked-by: Jason Baron
    Signed-off-by: Greg Kroah-Hartman

    Joe Perches
     
  • A lot of stack is used in recursive printks with %pV.

    Using multiple levels of %pV (a logging function with %pV
    that calls another logging function with %pV) can consume
    more stack than necessary.

    Avoid excessive stack use by not calling dev_printk from
    netdev_printk and dynamic_netdev_dbg. Duplicate the logic
    and form of dev_printk instead.

    Make __netdev_printk static.
    Remove EXPORT_SYMBOL(__netdev_printk)
    Whitespace and brace style neatening.

    Signed-off-by: Joe Perches
    Acked-by: David S. Miller
    Tested-by: Jim Cromie
    Acked-by: Jason Baron
    Signed-off-by: Greg Kroah-Hartman

    Joe Perches
     
  • commit c4e00daaa9
    ("driver-core: extend dev_printk() to pass structured data")
    changed __dev_printk and broke dynamic-debug's ability to control the
    dynamic prefix of dev_dbg(dev,..).

    commit af7f2158fd
    ("drivers-core: make structured logging play nice with dynamic-debug")
    made a minimal correction.

    The current dynamic debug code uses up to 3 recursion levels via %pV.
    This can consume quite a bit of stack. Directly call printk_emit to
    reduce the recursion depth.

    These changes include:

    dev_dbg:
    o Create and use function create_syslog_header to format the syslog
    header for printk_emit uses.
    o Call create_syslog_header and neaten __dev_printk
    o Make __dev_printk static not global
    o Remove include header declaration of __dev_printk
    o Remove now unused EXPORT_SYMBOL() of __dev_printk
    o Whitespace neatening

    dynamic_dev_dbg:
    o Remove KERN_DEBUG from dynamic_emit_prefix
    o Call create_syslog_header and printk_emit
    o Whitespace neatening

    Signed-off-by: Joe Perches
    Acked-by: David S. Miller
    Tested-by: Jim Cromie
    Acked-by: Jason Baron
    Signed-off-by: Greg Kroah-Hartman

    Joe Perches
     

08 May, 2012

1 commit


05 May, 2012

1 commit


01 May, 2012

8 commits

  • 1- Call dynamic_debug_init() from early_initcall, not arch_initcall.
    2- Call dynamic_debug_init_debugfs() from fs_initcall, not module_init.

    RFC: This works for me on a 64 bit desktop and a i586 SBC, but is
    untested on other arches. I presume there is or was a reason
    original code used arch_initcall, maybe the constraints have changed.

    This makes facility available as soon as possible.

    2nd change has a downside when dynamic_debug.verbose=1; all the
    vpr_info()s called in the proc-fs code are activated, causing
    voluminous output from dmesg. TBD: Im unsure of this explanation, but
    the output is there. This could be fixed by changing those callsites
    to v2pr_info(if verbose > 1).

    1st change is still not early enough to enable pr_debugs in
    kernel/params, so parsing of boot-args isnt logged. The reparse of
    those args is however visible after params.dyndbg="+p" is processed.

    Signed-off-by: Jim Cromie
    Acked-by: Jason Baron
    Signed-off-by: Greg Kroah-Hartman

    Jim Cromie
     
  • Pass module name into ddebug_exec_queries(), ddebug_exec_query(), and
    ddebug_parse_query() as separate parameter. In ddebug_parse_query(),
    the module name is added into the query struct before the query-string
    is parsed. This allows the query-string to be shorter:

    instead of:
    $modname.dyndbg="module $modname +fp"
    do this:
    $modname.dyndbg="+fp"

    Omitting "module $modname" from the query string is actually required
    for $modname.dyndbg rules; the set-only-once check added in a previous
    patch will throw an error if its added again. ddebug_query="..." has
    no $modname associated with it, so the query string may include it.

    This also fixes redundant "module $modname" otherwise needed to handle
    multiple queries per string:

    $modname.dyndbg="func foo +fp; func bar +fp"

    Signed-off-by: Jim Cromie
    Acked-by: Jason Baron
    Signed-off-by: Greg Kroah-Hartman

    Jim Cromie
     
  • Print ram usage of dynamic-debug tables and verbose section so user
    knows cost of enabling CONFIG_DYNAMIC_DEBUG. This only counts the
    size of the _ddebug tables for builtins and the __verbose section that
    they refer to, not those used in loadable modules.

    Signed-off-by: Jim Cromie
    Acked-by: Jason Baron
    Signed-off-by: Greg Kroah-Hartman

    Jim Cromie
     
  • We dont want errors while parsing ddebug_query to unload ddebug
    tables, so set success after tables are loaded, and return 0 after
    query parsing is done.

    Simplify error handling code since its no longer used for success,
    and change goto label to out_err to clarify this.

    Signed-off-by: Jim Cromie
    Acked-by: Jason Baron
    Signed-off-by: Greg Kroah-Hartman

    Jim Cromie
     
  • Refactor ddebug_dyndbg_boot_param_cb and ddebug_dyndbg_module_param_cb
    into a common helper function, and call it from both. The handling of
    foo.dyndbg is unneeded by the latter, but harmless.

    The 2 callers differ only by pr_info and the return code they pass to
    the helper for when an unknown param is handled. I could slightly
    reduce dmesg clutter by putting the vpr_info in the common helper,
    after the return on_err, but that loses __func__ context, is overly
    silent on module_cb unknown param errors, and the clutter is only when
    dynamic_debug.verbose=1 anyway.

    Signed-off-by: Jim Cromie
    Acked-by: Jason Baron
    Signed-off-by: Greg Kroah-Hartman

    Jim Cromie
     
  • With ddebug_dyndbg_boot_params_cb() handling bare dyndbg params, we
    dont need ddebug_query param anymore. Add a warning when processing
    ddebug_query= param that it is deprecated, and to change it to dyndbg=

    Add a deprecation notice for v3.8 to feature-removal-schedule.txt, and
    add a suggested deprecation period of 3 releases to the header.

    Signed-off-by: Jim Cromie
    Acked-by: Jason Baron
    Signed-off-by: Greg Kroah-Hartman

    Jim Cromie
     
  • 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: Jim Cromie
    CC: Thomas Renninger
    CC: Rusty Russell
    Acked-by: Jason Baron
    Signed-off-by: Greg Kroah-Hartman

    Jim Cromie
     
  • Use vpr_info to declutter code, reduce indenting, and change one
    additional pr_info call in ddebug_exec_queries.

    Signed-off-by: Jim Cromie
    Acked-by: Jason Baron
    Signed-off-by: Greg Kroah-Hartman

    Jim Cromie
     

25 Jan, 2012

5 commits

  • Insert ddebug_exec_queries() in place of ddebug_exec_query(). It
    splits the query string on [;\n], and calls ddebug_exec_query() on
    each. All queries are processed independent of errors, allowing a
    query to fail, for example when a module is not installed. Empty
    lines and comments are skipped. Errors are counted, and the last
    error seen (negative) or the number of callsites found (0 or positive)
    is returned. Return code checks are altered accordingly.

    With this, multiple queries can be given in ddebug_query, allowing
    more selective enabling of callsites. As a side effect, a set of
    commands can be batched in:

    cat cmd-file > $DBGMT/dynamic_debug/control

    We dont want a ddebug_query syntax error to kill the dynamic debug
    facility, so dynamic_debug_init() zeros ddebug_exec_queries()'s return
    code after logging the appropriate message, so that ddebug tables are
    preserved and $DBGMT/dynamic_debug/control file is created. This
    would be appropriate even without accepting multiple queries.

    This patch also alters ddebug_change() to return number of callsites
    matched (which typically is the same as number of callsites changed).
    ddebug_exec_query() also returns the number found, or a negative value
    if theres a parse error on the query.

    Splitting on [;\n] prevents their use in format-specs, but selecting
    callsites on punctuation is brittle anyway, meaningful and selective
    substrings are more typical.

    Note: splitting queries on ';' before handling trailing #comments
    means that a ';' also terminates a comment, and text after the ';' is
    treated as another query. This trailing query will almost certainly
    result in a parse error and thus have no effect other than the error
    message. The double corner case with unexpected results is:

    ddebug_query="func foo +p # enable foo ; +p"

    Signed-off-by: Jim Cromie
    Signed-off-by: Jason Baron
    Signed-off-by: Greg Kroah-Hartman

    Jim Cromie
     
  • Factor pr_info(query) out of ddebug_parse_query, into vpr_info_dq(),
    for reuse later. Also change the printed labels: file, func to agree
    with the query-spec keywords accepted in the control file. Pass ""
    when string is null, to avoid "(null)" output from sprintf. For
    format print, use precision to skip last char, assuming its '\n', no
    great harm if not, its a debug msg.

    Signed-off-by: Jim Cromie
    Signed-off-by: Jason Baron
    Signed-off-by: Greg Kroah-Hartman

    Jim Cromie
     
  • trim_prefix(path) skips past the absolute source path root, and
    returns the pointer to the relative path from there. It is used to
    shorten the displayed path in $DBGMT/dynamic_debug/control via
    ddebug_proc_show(), and in ddebug_change() to allow relative filenames
    to be used in applied queries. For example:

    ~# echo file kernel/freezer.c +p > $DBGMT/dynamic_debug/control

    kernel/freezer.c:128 [freezer]cancel_freezing p " clean up: %s\012"

    trim_prefix(path) insures common prefix before trimming it, so
    out-of-tree module paths are shown as full absolute paths.

    Signed-off-by: Jim Cromie
    Signed-off-by: Jason Baron
    Signed-off-by: Greg Kroah-Hartman

    Jim Cromie
     
  • Current query write buffer is 256 bytes, on stack. In comparison, the
    ddebug_query boot-arg is 1024. Allocate the buffer off heap, and
    enlarge it to 4096 bytes, big enough for ~100 queries (at 40 bytes
    each), and error out if not. This makes it play nicely with large
    query sets (to be added later). The buffer should be enough for most
    uses, and others should probably be split into subsets.

    [jbaron@redhat.com: changed USER_BUF_PAGE from 4095 -> 4096 ]
    Signed-off-by: Jim Cromie
    Signed-off-by: Jason Baron
    Signed-off-by: Greg Kroah-Hartman

    Jim Cromie
     
  • If a token begins with #, the remainder of query string is a comment,
    so drop it. Doing it here avoids '#' in quoted strings.

    Signed-off-by: Jim Cromie
    Signed-off-by: Jason Baron
    Signed-off-by: Greg Kroah-Hartman

    Jim Cromie