mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Łukasz Bartosik" <lb@semihalf.com>
To: Jason Baron <jbaron@akamai.com>,
	Jim Cromie <jim.cromie@gmail.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Kees Cook <keescook@chromium.org>,
	Douglas Anderson <dianders@chromium.org>
Cc: Guenter Roeck <groeck@google.com>,
	Yaniv Tzoreff <yanivt@google.com>,
	Benson Leung <bleung@google.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	Vincent Whitchurch <vincent.whitchurch@axis.com>,
	Pekka Paalanen <ppaalanen@gmail.com>,
	Sean Paul <seanpaul@chromium.org>,
	Daniel Vetter <daniel@ffwll.ch>,
	linux-kernel@vger.kernel.org, upstream@semihalf.com
Subject: [PATCH v2 08/15] dyndbg: move flags field to a new structure
Date: Fri,  1 Dec 2023 00:40:41 +0100	[thread overview]
Message-ID: <20231130234048.157509-9-lb@semihalf.com> (raw)
In-Reply-To: <20231130234048.157509-1-lb@semihalf.com>

Add a new structure ctrl and place it in 4 padding bytes
of _ddebug struct. Move flags field to the ctrl struct
and create setter and getter for the flags field. Add unused
fields to explicitly emphasise size of each bitfield.
This step prepares for addition of a trace_dst field.

Layout of _ddebug struct after addition of ctrl is:

struct _ddebug {
        union {
                struct static_key_true dd_key_true;      /*     0    16 */
                struct static_key_false dd_key_false;    /*     0    16 */
        } key;                                           /*     0    16 */
        union {
                struct static_key_true     dd_key_true;  /*     0    16 */
                struct static_key_false    dd_key_false; /*     0    16 */
        };

        const char  *              modname;              /*    16     8 */
        const char  *              function;             /*    24     8 */
        const char  *              filename;             /*    32     8 */
        const char  *              format;               /*    40     8 */
        unsigned int               lineno:18;            /*    48: 0  4 */
        unsigned int               class_id:6;           /*    48:18  4 */
        unsigned int               unused:8;             /*    48:24  4 */
        struct dd_ctrl             ctrl;                 /*    52     4 */

        /* size: 56, cachelines: 1, members: 9 */
        /* last cacheline: 56 bytes */
} __attribute__((__aligned__(8)));

Signed-off-by: Łukasz Bartosik <lb@semihalf.com>
---
 include/linux/dynamic_debug.h |  9 +++++--
 lib/dynamic_debug.c           | 44 ++++++++++++++++++++++-------------
 2 files changed, 35 insertions(+), 18 deletions(-)

diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
index b9237e4ecd1b..684766289bfc 100644
--- a/include/linux/dynamic_debug.h
+++ b/include/linux/dynamic_debug.h
@@ -32,6 +32,8 @@ struct _ddebug {
 #define CLS_BITS 6
 	unsigned int class_id:CLS_BITS;
 #define _DPRINTK_CLASS_DFLT		((1 << CLS_BITS) - 1)
+	unsigned int unused:8;
+
 	/*
 	 * The flags field controls the behaviour at the callsite.
 	 * The bits here are changed dynamically when the user
@@ -58,7 +60,10 @@ struct _ddebug {
 #else
 #define _DPRINTK_FLAGS_DEFAULT 0
 #endif
-	unsigned int flags:8;
+	struct {
+		unsigned int flags:8;
+		unsigned unused:24;
+	} ctrl;
 } __attribute__((aligned(8)));
 
 enum class_map_type {
@@ -171,7 +176,7 @@ void __dynamic_ibdev_dbg(struct _ddebug *descriptor,
 		.filename = __FILE__,				\
 		.format = (fmt),				\
 		.lineno = __LINE__,				\
-		.flags = _DPRINTK_FLAGS_DEFAULT,		\
+		.ctrl = { .flags = _DPRINTK_FLAGS_DEFAULT },	\
 		.class_id = cls,				\
 		_DPRINTK_KEY_INIT				\
 	};							\
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 9682277f3909..f47cb76e0e3d 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -80,6 +80,16 @@ module_param(verbose, int, 0644);
 MODULE_PARM_DESC(verbose, " dynamic_debug/control processing "
 		 "( 0 = off (default), 1 = module add/rm, 2 = >control summary, 3 = parsing, 4 = per-site changes)");
 
+static inline unsigned int get_flags(const struct _ddebug *desc)
+{
+	return desc->ctrl.flags;
+}
+
+static inline void set_flags(struct _ddebug *desc, unsigned int val)
+{
+	desc->ctrl.flags = val;
+}
+
 /* Return the path relative to source root */
 static inline const char *trim_prefix(const char *path)
 {
@@ -247,11 +257,11 @@ static int ddebug_change(const struct ddebug_query *query,
 
 			nfound++;
 
-			newflags = (dp->flags & modifiers->mask) | modifiers->flags;
-			if (newflags == dp->flags)
+			newflags = (get_flags(dp) & modifiers->mask) | modifiers->flags;
+			if (newflags == get_flags(dp))
 				continue;
 #ifdef CONFIG_JUMP_LABEL
-			if (dp->flags & _DPRINTK_FLAGS_ENABLED) {
+			if (get_flags(dp) & _DPRINTK_FLAGS_ENABLED) {
 				if (!(newflags & _DPRINTK_FLAGS_ENABLED))
 					static_branch_disable(&dp->key.dd_key_true);
 			} else if (newflags & _DPRINTK_FLAGS_ENABLED) {
@@ -261,9 +271,9 @@ static int ddebug_change(const struct ddebug_query *query,
 			v4pr_info("changed %s:%d [%s]%s %s => %s\n",
 				  trim_prefix(dp->filename), dp->lineno,
 				  dt->mod_name, dp->function,
-				  ddebug_describe_flags(dp->flags, &fbuf),
+				  ddebug_describe_flags(get_flags(dp), &fbuf),
 				  ddebug_describe_flags(newflags, &nbuf));
-			dp->flags = newflags;
+			set_flags(dp, newflags);
 		}
 	}
 	mutex_unlock(&ddebug_lock);
@@ -824,10 +834,11 @@ static int remaining(int wrote)
 
 static char *__dynamic_emit_prefix(const struct _ddebug *desc, char *buf)
 {
+	unsigned int flags = get_flags(desc);
 	int pos_after_tid;
 	int pos = 0;
 
-	if (desc->flags & _DPRINTK_FLAGS_INCL_TID) {
+	if (flags & _DPRINTK_FLAGS_INCL_TID) {
 		if (in_interrupt())
 			pos += snprintf(buf + pos, remaining(pos), "<intr> ");
 		else
@@ -835,16 +846,16 @@ static char *__dynamic_emit_prefix(const struct _ddebug *desc, char *buf)
 					task_pid_vnr(current));
 	}
 	pos_after_tid = pos;
-	if (desc->flags & _DPRINTK_FLAGS_INCL_MODNAME)
+	if (flags & _DPRINTK_FLAGS_INCL_MODNAME)
 		pos += snprintf(buf + pos, remaining(pos), "%s:",
 				desc->modname);
-	if (desc->flags & _DPRINTK_FLAGS_INCL_FUNCNAME)
+	if (flags & _DPRINTK_FLAGS_INCL_FUNCNAME)
 		pos += snprintf(buf + pos, remaining(pos), "%s:",
 				desc->function);
-	if (desc->flags & _DPRINTK_FLAGS_INCL_SOURCENAME)
+	if (flags & _DPRINTK_FLAGS_INCL_SOURCENAME)
 		pos += snprintf(buf + pos, remaining(pos), "%s:",
 				trim_prefix(desc->filename));
-	if (desc->flags & _DPRINTK_FLAGS_INCL_LINENO)
+	if (flags & _DPRINTK_FLAGS_INCL_LINENO)
 		pos += snprintf(buf + pos, remaining(pos), "%d:",
 				desc->lineno);
 	if (pos - pos_after_tid)
@@ -857,7 +868,7 @@ static char *__dynamic_emit_prefix(const struct _ddebug *desc, char *buf)
 
 static inline char *dynamic_emit_prefix(struct _ddebug *desc, char *buf)
 {
-	if (unlikely(desc->flags & _DPRINTK_FLAGS_INCL_ANY))
+	if (unlikely(get_flags(desc) & _DPRINTK_FLAGS_INCL_ANY))
 		return __dynamic_emit_prefix(desc, buf);
 	return buf;
 }
@@ -916,7 +927,8 @@ static void ddebug_trace(struct _ddebug *desc, const struct device *dev,
 __printf(2, 3)
 static void ddebug_printk(struct _ddebug *desc, const char *fmt, ...)
 {
-	if (desc->flags & _DPRINTK_FLAGS_TRACE) {
+
+	if (get_flags(desc) & _DPRINTK_FLAGS_TRACE) {
 		va_list args;
 
 		va_start(args, fmt);
@@ -928,7 +940,7 @@ static void ddebug_printk(struct _ddebug *desc, const char *fmt, ...)
 		va_end(args);
 	}
 
-	if (desc->flags & _DPRINTK_FLAGS_PRINTK) {
+	if (get_flags(desc) & _DPRINTK_FLAGS_PRINTK) {
 		va_list args;
 
 		va_start(args, fmt);
@@ -942,7 +954,7 @@ static void ddebug_dev_printk(struct _ddebug *desc, const struct device *dev,
 			      const char *fmt, ...)
 {
 
-	if (desc->flags & _DPRINTK_FLAGS_TRACE) {
+	if (get_flags(desc) & _DPRINTK_FLAGS_TRACE) {
 		va_list args;
 
 		va_start(args, fmt);
@@ -950,7 +962,7 @@ static void ddebug_dev_printk(struct _ddebug *desc, const struct device *dev,
 		va_end(args);
 	}
 
-	if (desc->flags & _DPRINTK_FLAGS_PRINTK) {
+	if (get_flags(desc) & _DPRINTK_FLAGS_PRINTK) {
 		va_list args;
 
 		va_start(args, fmt);
@@ -1246,7 +1258,7 @@ static int ddebug_proc_show(struct seq_file *m, void *p)
 	seq_printf(m, "%s:%u [%s]%s =%s \"",
 		   trim_prefix(dp->filename), dp->lineno,
 		   iter->table->mod_name, dp->function,
-		   ddebug_describe_flags(dp->flags, &flags));
+		   ddebug_describe_flags(get_flags(dp), &flags));
 	seq_escape_str(m, dp->format, ESCAPE_SPACE, "\t\r\n\"");
 	seq_puts(m, "\"");
 
-- 
2.43.0.rc2.451.g8631bc7472-goog


  parent reply	other threads:[~2023-11-30 23:41 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-30 23:40 [PATCH v2 00/15] dyndbg: add support for writing debug logs to trace Łukasz Bartosik
2023-11-30 23:40 ` [PATCH v2 01/15] dyndbg: add _DPRINTK_FLAGS_ENABLED Łukasz Bartosik
2023-11-30 23:40 ` [PATCH v2 02/15] dyndbg: add _DPRINTK_FLAGS_TRACE Łukasz Bartosik
2023-11-30 23:40 ` [PATCH v2 03/15] dyndbg: add write events to tracefs code Łukasz Bartosik
2023-11-30 23:40 ` [PATCH v2 04/15] dyndbg: add 2 trace-events: prdbg, devdbg Łukasz Bartosik
2023-11-30 23:40 ` [PATCH v2 05/15] tracefs: add __get_str_strip_nl - RFC Łukasz Bartosik
2023-12-01  0:25   ` Steven Rostedt
2023-12-01  9:00     ` Łukasz Bartosik
2023-12-08  0:15       ` [re: PATCH v2 00/15 - 00/11] dyndbg: add support for writing debug logs to trace Jim Cromie
2023-12-08  0:15         ` [re: PATCH v2 00/15 - 01/11] dyndbg: export _print_hex_dump Jim Cromie
2023-12-08  0:15         ` [re: PATCH v2 00/15 - 02/11] dyndbg: tweak pr_info format s/trace dest/trace_dest/ Jim Cromie
2023-12-08  0:15         ` [re: PATCH v2 00/15 - 03/11] dyndbg: disambiguate quoting in a debug msg Jim Cromie
2023-12-18 16:34           ` Petr Mladek
2023-12-19 23:38             ` jim.cromie
2024-01-04  7:54               ` Petr Mladek
2024-01-05  0:06                 ` jim.cromie
2023-12-08  0:15         ` [re: PATCH v2 00/15 - 04/11] dyndbg: fix old BUG_ON in >control parser Jim Cromie
2023-12-08  0:15         ` [re: PATCH v2 00/15 - 05/11] dyndbg: change +T:name_terminator to dot Jim Cromie
2023-12-18 17:29           ` Petr Mladek
2023-12-21 15:21             ` Łukasz Bartosik
2024-01-04  7:54               ` Petr Mladek
2024-01-08 12:21                 ` Łukasz Bartosik
2023-12-08  0:15         ` [re: PATCH v2 00/15 - 06/11] dyndbg: treat comma as a token separator Jim Cromie
2023-12-08  0:15         ` [re: PATCH v2 00/15 - 07/11] dyndbg: __skip_spaces Jim Cromie
2023-12-18 17:17           ` Petr Mladek
2023-12-21 15:25             ` Łukasz Bartosik
2023-12-08  0:15         ` [re: PATCH v2 00/15 - 08/11] dyndbg: split multi-query strings with % Jim Cromie
2023-12-09  0:32           ` Łukasz Bartosik
2023-12-11  1:07             ` jim.cromie
2023-12-08  0:15         ` [re: PATCH v2 00/15 - 09/11] dyndbg: reduce verbose/debug clutter Jim Cromie
2023-12-08  0:15         ` [re: PATCH v2 00/15 - 10/11] dyndbg: move lock,unlock into ddebug_change, drop goto Jim Cromie
2023-12-09  0:32           ` Łukasz Bartosik
2023-12-08  0:15         ` [re: PATCH v2 00/15 - 11/11] dyndbg: id the bad word in parse-flags err msg Jim Cromie
2023-12-09  0:31         ` [re: PATCH v2 00/15 - 00/11] dyndbg: add support for writing debug logs to trace Łukasz Bartosik
2023-12-14 15:20           ` Łukasz Bartosik
2023-12-16  3:09             ` jim.cromie
2023-12-18  1:01               ` Łukasz Bartosik
2023-12-18 14:12                 ` Łukasz Bartosik
2023-11-30 23:40 ` [PATCH v2 06/15] dyndbg: use __get_str_strip_nl in prdbg and devdbg Łukasz Bartosik
2023-11-30 23:40 ` [PATCH v2 07/15] dyndbg: repack _ddebug structure Łukasz Bartosik
2023-11-30 23:40 ` Łukasz Bartosik [this message]
2023-11-30 23:40 ` [PATCH v2 09/15] dyndbg: add trace destination field to _ddebug Łukasz Bartosik
2023-12-14  7:09   ` jim.cromie
2023-12-14 15:46     ` Łukasz Bartosik
2023-11-30 23:40 ` [PATCH v2 10/15] dyndbg: add open and close commands for trace Łukasz Bartosik
2023-12-16  6:17   ` jim.cromie
2023-12-18  1:07     ` Łukasz Bartosik
2024-01-05 22:46   ` Jason Baron
2024-01-09 15:19     ` jim.cromie
2024-01-10 12:40       ` Łukasz Bartosik
2023-11-30 23:40 ` [PATCH v2 11/15] dyndbg: don't close trace instance when in use Łukasz Bartosik
2023-11-30 23:40 ` [PATCH v2 12/15] dyndbg: add processing of T(race) flag argument Łukasz Bartosik
2023-11-30 23:40 ` [PATCH v2 13/15] dyndbg: add support for default trace destination Łukasz Bartosik
2023-11-30 23:40 ` [PATCH v2 14/15] dyndbg: write debug logs to trace instance Łukasz Bartosik
2023-11-30 23:40 ` [PATCH v2 15/15] dyndbg: add support for hex_dump output to trace Łukasz Bartosik

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=20231130234048.157509-9-lb@semihalf.com \
    --to=lb@semihalf.com \
    --cc=akpm@linux-foundation.org \
    --cc=bleung@google.com \
    --cc=daniel@ffwll.ch \
    --cc=dianders@chromium.org \
    --cc=groeck@google.com \
    --cc=jbaron@akamai.com \
    --cc=jim.cromie@gmail.com \
    --cc=keescook@chromium.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=ppaalanen@gmail.com \
    --cc=rostedt@goodmis.org \
    --cc=seanpaul@chromium.org \
    --cc=upstream@semihalf.com \
    --cc=vincent.whitchurch@axis.com \
    --cc=yanivt@google.com \
    /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

all inboxes | Powered by JetHome®