Skip to content

Commit

Permalink
dyndbg: refine export, rename to dynamic_debug_exec_queries()
Browse files Browse the repository at this point in the history
commit 4c0d778 ("dyndbg: export ddebug_exec_queries") had a few
problems:
 - broken non DYNAMIC_DEBUG_CORE configs, sparse warning
 - the exported function modifies query string, breaks on RO strings.
 - func name follows internal convention, shouldn't be exposed as is.

1st is fixed in header with ifdefd function prototype or stub defn.
Also remove an obsolete HAVE-symbol ifdef-comment, and add others.

Fix others by wrapping existing internal function with a new one,
named in accordance with module-prefix naming convention, before
export hits v5.9.0.  In new function, copy query string to a local
buffer, so users can pass hard-coded/RO queries, and internal function
can be used unchanged.

Fixes: 4c0d778 ("dyndbg: export ddebug_exec_queries")
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
Link: https://lore.kernel.org/r/20200831182210.850852-3-jim.cromie@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
jimc authored and gregkh committed Sep 4, 2020
1 parent b52a95e commit a2d375e
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 6 deletions.
20 changes: 16 additions & 4 deletions include/linux/dynamic_debug.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ struct _ddebug {


#if defined(CONFIG_DYNAMIC_DEBUG_CORE)

/* exported for module authors to exercise >control */
int dynamic_debug_exec_queries(const char *query, const char *modname);

int ddebug_add_module(struct _ddebug *tab, unsigned int n,
const char *modname);
extern int ddebug_remove_module(const char *mod_name);
Expand Down Expand Up @@ -105,7 +109,7 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
static_branch_unlikely(&descriptor.key.dd_key_false)
#endif

#else /* !HAVE_JUMP_LABEL */
#else /* !CONFIG_JUMP_LABEL */

#define _DPRINTK_KEY_INIT

Expand All @@ -117,7 +121,7 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)
#endif

#endif
#endif /* CONFIG_JUMP_LABEL */

#define __dynamic_func_call(id, fmt, func, ...) do { \
DEFINE_DYNAMIC_DEBUG_METADATA(id, fmt); \
Expand Down Expand Up @@ -172,10 +176,11 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
KERN_DEBUG, prefix_str, prefix_type, \
rowsize, groupsize, buf, len, ascii)

#else
#else /* !CONFIG_DYNAMIC_DEBUG_CORE */

#include <linux/string.h>
#include <linux/errno.h>
#include <linux/printk.h>

static inline int ddebug_add_module(struct _ddebug *tab, unsigned int n,
const char *modname)
Expand Down Expand Up @@ -210,6 +215,13 @@ static inline int ddebug_dyndbg_module_param_cb(char *param, char *val,
print_hex_dump(KERN_DEBUG, prefix_str, prefix_type, \
rowsize, groupsize, buf, len, ascii); \
} while (0)
#endif

static inline int dynamic_debug_exec_queries(const char *query, const char *modname)
{
pr_warn("kernel not built with CONFIG_DYNAMIC_DEBUG_CORE\n");
return 0;
}

#endif /* !CONFIG_DYNAMIC_DEBUG_CORE */

#endif
27 changes: 25 additions & 2 deletions lib/dynamic_debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -525,7 +525,7 @@ static int ddebug_exec_query(char *query_string, const char *modname)
last error or number of matching callsites. Module name is either
in param (for boot arg) or perhaps in query string.
*/
int ddebug_exec_queries(char *query, const char *modname)
static int ddebug_exec_queries(char *query, const char *modname)
{
char *split;
int i, errs = 0, exitcode = 0, rc, nfound = 0;
Expand Down Expand Up @@ -557,7 +557,30 @@ int ddebug_exec_queries(char *query, const char *modname)
return exitcode;
return nfound;
}
EXPORT_SYMBOL_GPL(ddebug_exec_queries);

/**
* dynamic_debug_exec_queries - select and change dynamic-debug prints
* @query: query-string described in admin-guide/dynamic-debug-howto
* @modname: string containing module name, usually &module.mod_name
*
* This uses the >/proc/dynamic_debug/control reader, allowing module
* authors to modify their dynamic-debug callsites. The modname is
* canonically struct module.mod_name, but can also be null or a
* module-wildcard, for example: "drm*".
*/
int dynamic_debug_exec_queries(const char *query, const char *modname)
{
int rc;
char *qry = kstrndup(query, PAGE_SIZE, GFP_KERNEL);

if (!query)
return -ENOMEM;

rc = ddebug_exec_queries(qry, modname);
kfree(qry);
return rc;
}
EXPORT_SYMBOL_GPL(dynamic_debug_exec_queries);

#define PREFIX_SIZE 64

Expand Down

0 comments on commit a2d375e

Please sign in to comment.