All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jim Cromie <jim.cromie@gmail.com>
To: Jason Baron <jbaron@akamai.com>, linux-kernel@vger.kernel.org
Cc: linux-mm@kvack.org, Jim Cromie <jim.cromie@gmail.com>
Subject: [RFC PATCH v5 24/28] dyndbg: make site pointer and checks on it optional (not quite)
Date: Tue, 11 May 2021 12:50:53 -0600	[thread overview]
Message-ID: <20210511185057.3815777-25-jim.cromie@gmail.com> (raw)
In-Reply-To: <20210511185057.3815777-1-jim.cromie@gmail.com>

Wrap declaration and uses of _ddebug.site pointer in ifdefs.
Mostly, this eliminates all the WARN_ONs in ddebug_site_get(),
which seem to be mostly proven (they were BUG_ONs).

This adds macro indirection around ifdef SITE_CHK; adding SITE_INIT_
to adjust the .site initializations, and SITE_COND, which abstracts a
logic test used by is_dyndbg_header_pair(i,s).

TODO: breaks when !defined SITE_CHK - the header, being just a struct
_ddebug, also lost the .site member.  Need to specialize the header
struct, then unionize it back in.

Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 include/linux/dynamic_debug.h | 20 ++++++++++++++++----
 lib/dynamic_debug.c           | 13 ++++++++++---
 2 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
index 06ae1d8d8c10..46901b5348ee 100644
--- a/include/linux/dynamic_debug.h
+++ b/include/linux/dynamic_debug.h
@@ -6,6 +6,18 @@
 #include <linux/jump_label.h>
 #endif
 
+#define SITE_CHK /* include .site pointer and checks on it */
+
+#ifdef SITE_CHK
+#define SITE_CHK_(...)		__VA_ARGS__
+#define SITE_COND(_i, _s)	(_s == _i->site)
+#define SITE_INIT_(_name)	.site = &_name,
+#else
+#define SITE_CHK_(...)
+#define SITE_COND(_i, _s)	(true)
+#define SITE_INIT_(name)
+#endif
+
 /*
  * A pair of these structs are created in 2 special ELF sections
  * (__dyndbg, __dyndbg_sites) for every dynamic debug callsite.
@@ -25,7 +37,7 @@ struct _ddebug_site {
 } __aligned(8);
 
 struct _ddebug {
-	struct _ddebug_site *site;
+	SITE_CHK_(struct _ddebug_site *site;)
 	/* format is always needed, lineno shares word with flags */
 	const char *format;
 	const unsigned lineno:18;
@@ -106,7 +118,7 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
 	};							\
 	static struct _ddebug  __aligned(8)			\
 	__section("__dyndbg") name = {				\
-		.site = &name##_site,				\
+		SITE_INIT_(name##_site)				\
 		.format = (fmt),				\
 		.lineno = __LINE__,				\
 		.flags = _DPRINTK_FLAGS_DEFAULT,		\
@@ -138,13 +150,13 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
 	__weak struct _ddebug __used __aligned(8)		\
 		__section(".gnu.linkonce.dyndbg")		\
 	_LINKONCE_dyndbg_header = {				\
-		.site = &_LINKONCE_dyndbg_site_header,		\
+		SITE_INIT_(_LINKONCE_dyndbg_site_header)	\
 		.format = KBUILD_MODNAME			\
 	}
 
 /* The header initializations as a distinguishing predicate */
 #define is_dyndbg_header_pair(iter, sitep)			\
-	(sitep == iter->site					\
+	(SITE_COND(iter, sitep)					\
 	 && (!iter->lineno)					\
 	 && (iter->format == sitep->modname)			\
 	 && (sitep->modname == sitep->function)			\
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index b83187e72ee0..9551c0d406b6 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -151,7 +151,7 @@ static struct _ddebug_site *ddebug_site_get(struct _ddebug *dp)
 	struct _ddebug *dh = dp - (dp->_index);
 
 	WARN_ON(!is_dyndbg_header_pair(dh, dh->site));
-
+#ifdef SITE_CHK
 	if (dp >= __start___dyndbg && dp < __stop___dyndbg) {
 
 		v5pr_info("get: %s is builtin: %d %s:%s:%d\n",
@@ -177,6 +177,9 @@ static struct _ddebug_site *ddebug_site_get(struct _ddebug *dp)
 		WARN_ON(&dh->site[dp->_index] != dp->site);
 
 	return dp->site;
+#else
+	return &dh->site[dp->_index];
+#endif
 }
 static inline void ddebug_site_put(struct _ddebug *dp)
 {
@@ -241,6 +244,7 @@ static void ddebug_alter_site(struct _ddebug *dp,
 	} else if (modifiers->flags & _DPRINTK_FLAGS_PRINT)
 		static_branch_enable(&dp->key.dd_key_true);
 #endif
+#ifdef SITE_CHK
 	/* delete site info for this callsite */
 	if (modifiers->flags & _DPRINTK_FLAGS_DELETE_SITE) {
 		if (dp->site) {
@@ -249,6 +253,7 @@ static void ddebug_alter_site(struct _ddebug *dp,
 			dp->site = NULL;
 		}
 	}
+#endif
 }
 
 /*
@@ -1073,7 +1078,9 @@ static int __ddebug_add_module(struct _ddebug *tab, struct _ddebug_site *sites,
 
 		v3pr_info(" header: %d %s.%s.%d\n", tab[0]._index, modname,
 			  tab[0].site->function, tab[0].lineno);
-		WARN_ON(tab[0].site != &sites[0]);
+
+		SITE_CHK_(BUG_ON(tab[0].site != &sites[0]));
+
 		if (numdbgs <= 1) {
 			v3pr_info(" skip header %s\n", modname);
 			return 0;
@@ -1251,7 +1258,7 @@ static int __init dynamic_debug_init(void)
 
 	for (i = 0; iter < __stop___dyndbg; iter++, site++, i++) {
 
-		WARN_ON(site != iter->site);
+		SITE_CHK_(WARN_ON(site != iter->site));
 
 		if (strcmp(modname, site->modname)) {
 			modct++;
-- 
2.31.1


  parent reply	other threads:[~2021-05-11 18:52 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-11 18:50 [RFC PATCH v5 00/28] dynamic debug diet plan Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 01/28] dyndbg: avoid calling dyndbg_emit_prefix when it has no work Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 02/28] dyndbg: drop uninformative vpr_info Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 03/28] dyndbg: split struct _ddebug's display fields to new _ddebug_site Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 04/28] dyndbg: __init iterate over __dyndbg & __dyndbg_site in parallel Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 05/28] dyndbg: refactor part of ddebug_change to ddebug_match_site Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 06/28] dyndbg: accept null site in ddebug_match_site Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 07/28] dyndbg: hoist ->site out of ddebug_match_site Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 08/28] dyndbg: accept null site in ddebug_change Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 09/28] dyndbg: accept null site in dynamic_emit_prefix Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 10/28] dyndbg: accept null site in ddebug_proc_show Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 11/28] dyndbg: refactor ddebug_alter_site out of ddebug_change Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 12/28] dyndbg: allow deleting site info via control interface Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 13/28] dyndbg+module: expose ddebug_sites to modules Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 14/28] dyndbg: add ddebug_site(_get|_put) abstraction Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 15/28] dyndbg: ddebug_add_module avoid adding empty modules Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 16/28] dyndbg: add _index to struct _ddebug Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 17/28] dyndbg: prevent build bugs via -DNO_DYNAMIC_DEBUG_TABLE Jim Cromie
2021-05-11 18:50   ` Jim Cromie
2021-05-12 14:55   ` Ard Biesheuvel
2021-05-12 14:55     ` Ard Biesheuvel
2021-05-12 14:55     ` Ard Biesheuvel
2021-05-12 18:03     ` jim.cromie
2021-05-12 18:03       ` jim.cromie
2021-05-12 18:03       ` jim.cromie
2021-05-11 18:50 ` [RFC PATCH v5 18/28] dyndbg: RFC - DEFINE_DYNAMIC_DEBUG_TABLE Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 19/28] dyndbg: RFC handle __dyndbg* sections in module.lds.h Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 20/28] dyndbg: ddebug_add_module() handle headers Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 21/28] dyndbg: validate ddebug_site_get invariants Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 22/28] dyndbg: fix NULL deref after deleting sites Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 23/28] dyndbg: dont show header records in control Jim Cromie
2021-05-11 18:50 ` Jim Cromie [this message]
2021-05-11 18:50 ` [RFC PATCH v5 25/28] dyndbg: swap WARN_ON for BUG_ON see what 0-day says Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 26/28] dyndbg: fixup protect header when deleting site Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 27/28] dyndbg: unionize _ddebug*_headers with struct _ddebug* Jim Cromie
2021-05-11 18:50 ` [RFC PATCH v5 28/28] dyndbg: RFC drop _ddebug.site pointer Jim Cromie
2021-05-12 22:08 ` Fwd: [RFC PATCH v5 00/28] dynamic debug diet plan 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=20210511185057.3815777-25-jim.cromie@gmail.com \
    --to=jim.cromie@gmail.com \
    --cc=jbaron@akamai.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.