From: Jim Cromie <jim.cromie@gmail.com>
To: jbaron@akamai.com, gregkh@linuxfoundation.org,
linux-kernel@vger.kernel.org
Cc: Jim Cromie <jim.cromie@gmail.com>
Subject: [RFC PATCH v6 17/34] dyndbg: add _index to struct _ddebug
Date: Sat, 29 May 2021 14:00:12 -0600 [thread overview]
Message-ID: <20210529200029.205306-18-jim.cromie@gmail.com> (raw)
In-Reply-To: <20210529200029.205306-1-jim.cromie@gmail.com>
we have: dp->site doing mapping: &__dyndbgs[N] -> &__dyndbg_sites[N].
We want to drop site, and do an indirect "up-over-down" maneuver (or
"back-over-and-map") to access sites[N]; this new _ddebug._index field
is that "N" above. This is a debug/unlikely path, so access cost is
unimportant compared to memory savings.
Once we can go from any N to 0, we have &array, and can use it in
container_of(), along with array-member name, to get the containing
struct (which doesnt exist yet).
The ._index is free, from unused padding in struct _ddebug (at least
on 64 bit machines). This commit just adds the ._index member, and
initializes it. That job falls to ddebug_add_module(). 2 cases:
loadable modules: ddebug_add_module( &whole-elf-section )
builtin modules: ddebug_add_module( &slice-of-DATA ), iteratively.
Previously, it didnt care which slice of "__dyndbgs" it was working,
but now we need to know the origin of the allocated memory, to
initialize our way back to it. Simplest way is to pass in the base
index of the current slice.
Since ddebug_add_module() is used indirectly by module.c, the new arg
is hidden in __ddebug_add_module(), and defaults to 0 in the wrapper.
Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
include/linux/dynamic_debug.h | 2 ++
lib/dynamic_debug.c | 25 ++++++++++++++++++++-----
2 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
index f789608ab935..c866b4a9760a 100644
--- a/include/linux/dynamic_debug.h
+++ b/include/linux/dynamic_debug.h
@@ -29,6 +29,7 @@ struct _ddebug {
/* format is always needed, lineno shares word with flags */
const char *format;
const unsigned lineno:18;
+ unsigned _index:14;
/*
* The flags field controls the behaviour at the callsite.
* The bits here are changed dynamically when the user
@@ -52,6 +53,7 @@ struct _ddebug {
#define _DPRINTK_FLAGS_DEFAULT 0
#endif
unsigned int flags:8;
+
#ifdef CONFIG_JUMP_LABEL
union {
struct static_key_true dd_key_true;
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index db7563a88d8a..ce134c939f01 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -1028,10 +1028,12 @@ static const struct proc_ops proc_fops = {
* Allocate a new ddebug_table for the given module
* and add it to the global list.
*/
-int ddebug_add_module(struct _ddebug *tab, struct _ddebug_site *sites,
- unsigned int numdbgs, const char *modname)
+static int __ddebug_add_module(struct _ddebug *tab, struct _ddebug_site *sites,
+ unsigned int numdbgs, unsigned int base,
+ const char *modname)
{
struct ddebug_table *dt;
+ int i;
v3pr_info("add-module: %s.%d sites\n", modname, numdbgs);
if (!numdbgs) {
@@ -1055,6 +1057,12 @@ int ddebug_add_module(struct _ddebug *tab, struct _ddebug_site *sites,
dt->ddebugs = tab;
dt->sites = sites;
+ for (i = 0; i < numdbgs; i++) {
+ tab[i]._index = base + i;
+ v3pr_info(" %d %d %s.%s.%d\n", i, tab[i]._index,
+ modname, sites[i].function, tab[i].lineno);
+ }
+
mutex_lock(&ddebug_lock);
list_add(&dt->link, &ddebug_tables);
mutex_unlock(&ddebug_lock);
@@ -1063,6 +1071,12 @@ int ddebug_add_module(struct _ddebug *tab, struct _ddebug_site *sites,
return 0;
}
+int ddebug_add_module(struct _ddebug *tab, struct _ddebug_site *sites,
+ unsigned int numdbgs, const char *modname)
+{
+ return __ddebug_add_module(tab, sites, numdbgs, 0, modname);
+}
+
/* helper for ddebug_dyndbg_(boot|module)_param_cb */
static int ddebug_dyndbg_param_cb(char *param, char *val,
const char *modname, int on_err)
@@ -1177,6 +1191,7 @@ static int __init dynamic_debug_init(void)
char *cmdline;
int ret = 0;
int site_ct = 0, entries = 0, modct = 0;
+ int mod_index = 0;
if (&__start___dyndbg == &__stop___dyndbg) {
if (IS_ENABLED(CONFIG_DYNAMIC_DEBUG)) {
@@ -1200,8 +1215,8 @@ static int __init dynamic_debug_init(void)
if (strcmp(modname, site->modname)) {
modct++;
- ret = ddebug_add_module(iter_mod_start, site_mod_start,
- site_ct, modname);
+ ret = __ddebug_add_module(iter_mod_start, site_mod_start,
+ site_ct, mod_index, modname);
if (ret)
goto out_err;
site_ct = 0;
@@ -1211,7 +1226,7 @@ static int __init dynamic_debug_init(void)
}
site_ct++;
}
- ret = ddebug_add_module(iter_mod_start, site_mod_start, site_ct, modname);
+ ret = __ddebug_add_module(iter_mod_start, site_mod_start, site_ct, mod_index, modname);
if (ret)
goto out_err;
--
2.31.1
next prev parent reply other threads:[~2021-05-29 20:03 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-29 19:59 [RFC PATCH v6 00/34] DYNAMIC_DEBUG diet progress, dropped 30kb Jim Cromie
2021-05-29 19:59 ` [RFC PATCH v6 01/34] dyndbg: avoid calling dyndbg_emit_prefix when it has no work Jim Cromie
2021-05-29 19:59 ` [RFC PATCH v6 02/34] dyndbg: drop uninformative vpr_info Jim Cromie
2021-05-29 19:59 ` [RFC PATCH v6 03/34] dyndbg: display KiB of data memory used Jim Cromie
2021-05-29 19:59 ` [RFC PATCH v6 04/34] dyndbg: split struct _ddebug's display fields to new _ddebug_site Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 05/34] dyndbg: __init iterate over __dyndbg & __dyndbg_site in parallel Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 06/34] dyndbg+module: expose ddebug_sites to modules Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 07/34] dyndbg: refactor part of ddebug_change to ddebug_match_site Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 08/34] dyndbg: accept null site in ddebug_match_site Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 09/34] dyndbg: hoist ->site out of ddebug_match_site Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 10/34] dyndbg: accept null site in ddebug_change Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 11/34] dyndbg: accept null site in dynamic_emit_prefix Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 12/34] dyndbg: accept null site in ddebug_proc_show Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 13/34] dyndbg: refactor ddebug_alter_site out of ddebug_change Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 14/34] dyndbg: allow deleting site info via control interface Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 15/34] dyndbg: add ddebug_site(_get|_put) abstraction Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 16/34] dyndbg: ddebug_add_module avoid adding empty modules Jim Cromie
2021-05-29 20:00 ` Jim Cromie [this message]
2021-05-29 20:00 ` [RFC PATCH v6 18/34] dyndbg: prevent build bugs via -DNO_DYNAMIC_DEBUG_TABLE Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 19/34] dyndbg: RFC - DEFINE_DYNAMIC_DEBUG_TABLE Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 20/34] dyndbg: RFC handle __dyndbg* sections in module.lds.h Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 21/34] dyndbg: ddebug_add_module() handle headers Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 22/34] dyndbg: validate ddebug_site_get invariants Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 23/34] dyndbg: fix NULL deref after deleting sites Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 24/34] dyndbg: dont show header records in control Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 25/34] dyndbg: make site pointer and checks on it optional (almost) Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 26/34] dyndbg: swap WARN_ON for BUG_ON see what 0-day says Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 27/34] dyndbg: fixup protect header when deleting site Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 28/34] dyndbg: unionize _ddebug*_headers with struct _ddebug* Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 29/34] dyndbg: RFC drop _ddebug.site pointer Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 30/34] dyndbg: split/copy ._index into 2 new fields: ._back, ._map Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 31/34] dyndbg: detect repeated site recs in add_module Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 32/34] dyndbg: pack module pr_debug sites Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 33/34] dyndbg: pack pr-debug site-recs in builtin modules Jim Cromie
2021-05-29 20:00 ` [RFC PATCH v6 34/34] dyndbg: prototype print-once and print-ratelimited RFC Jim Cromie
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210529200029.205306-18-jim.cromie@gmail.com \
--to=jim.cromie@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=jbaron@akamai.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox