All of lore.kernel.org
 help / color / mirror / Atom feed
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 14/34] dyndbg: allow deleting site info via control interface
Date: Sat, 29 May 2021 14:00:09 -0600	[thread overview]
Message-ID: <20210529200029.205306-15-jim.cromie@gmail.com> (raw)
In-Reply-To: <20210529200029.205306-1-jim.cromie@gmail.com>

Allow users & subsystems to selectively delete callsite info for
pr-debug callsites.  Hopefully, this can lead to actual recovery of
memory.

DRM is a potential user which would drop the sites:

- has distinct categories for logging, and can map them over to a
  format prefix, like: "drm:core:", "drm:kms:", etc.

- are happy with group control of all the callsites in a class/cateory.
  individual control is still possible using queries including line numbers

- don't need dynamic "module:function:line:" prefixes in log messages

- don't care about loss of context in /proc/dynamic_debug/control

before:

init/initramfs.c:485 [initramfs]unpack_to_rootfs =_ "Detected %s compressed data\012"
init/main.c:1337 [main]run_init_process =pm "    %s\012"
init/main.c:1335 [main]run_init_process =pm "  with environment:\012"
init/main.c:1334 [main]run_init_process =pm "    %s\012"
init/main.c:1332 [main]run_init_process =pm "  with arguments:\012"
init/main.c:1121 [main]initcall_blacklisted =pm "initcall %s blacklisted\012"
init/main.c:1082 [main]initcall_blacklist =pm "blacklisting initcall %s\012"

then:
  bash-5.0# echo file init/main.c +D > /proc/dynamic_debug/control

after:

init/initramfs.c:485 [initramfs]unpack_to_rootfs =_ "Detected %s compressed data\012"
[main]:1337 =pmD "    %s\012"
[main]:1335 =pmD "  with environment:\012"
[main]:1334 =pmD "    %s\012"
[main]:1332 =pmD "  with arguments:\012"
[main]:1121 =pmD "initcall %s blacklisted\012"
[main]:1082 =pmD "blacklisting initcall %s\012"

Notes:

If Drm adopted dyndbg, i915 + drm* would add ~1600 prdebugs, amdgpu +
drm* would add ~3200 callsites, so the additional memory costs are
substantial.  In trade, drm and drivers would avoid lots of calls to
drm_debug_enabled().  This patch should reduce the costs.

Using this interface, drm could drop site info for all categories /
prefixes controlled by bits in drm.debug, while preserving site info
and individual selectivity for any uncategorized prdebugs, and for all
other modules.

Lastly, because lineno field was not moved into _ddebug_callsite, it
can be used to modify a single[*] callsite even if drm has dropped all
the callsite data:

  echo module $mod format ^$prefix line $line +p >control

Dropping site info is a one-way, information losing operation, so
minor misuse is possible.  Worst case is maybe (depending upon
previous settings) some loss of logging context/decorations.

  echo +D > /proc/dynamic_debug/control

[*] amdgpu has some macros invoking clusters of pr_debugs; each use of
them creates a cluster of pr-debugs with the same line number.

Signed-off-by: Jim Cromie <jim.cromie@gmail.com>
---
 include/linux/dynamic_debug.h | 1 +
 lib/dynamic_debug.c           | 9 +++++++++
 2 files changed, 10 insertions(+)

diff --git a/include/linux/dynamic_debug.h b/include/linux/dynamic_debug.h
index 40ea086853ff..f789608ab935 100644
--- a/include/linux/dynamic_debug.h
+++ b/include/linux/dynamic_debug.h
@@ -40,6 +40,7 @@ struct _ddebug {
 #define _DPRINTK_FLAGS_INCL_FUNCNAME	(1<<2)
 #define _DPRINTK_FLAGS_INCL_LINENO	(1<<3)
 #define _DPRINTK_FLAGS_INCL_TID		(1<<4)
+#define _DPRINTK_FLAGS_DELETE_SITE	(1<<7) /* drop site info to save ram */
 
 #define _DPRINTK_FLAGS_INCL_ANY		\
 	(_DPRINTK_FLAGS_INCL_MODNAME | _DPRINTK_FLAGS_INCL_FUNCNAME |\
diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index ad7cda840733..a4cb048357fb 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -93,6 +93,7 @@ static struct { unsigned flag:8; char opt_char; } opt_array[] = {
 	{ _DPRINTK_FLAGS_INCL_LINENO, 'l' },
 	{ _DPRINTK_FLAGS_INCL_TID, 't' },
 	{ _DPRINTK_FLAGS_NONE, '_' },
+	{ _DPRINTK_FLAGS_DELETE_SITE, 'D' },
 };
 
 struct flagsbuf { char buf[ARRAY_SIZE(opt_array)+1]; };
@@ -202,6 +203,14 @@ static void ddebug_alter_site(struct _ddebug *dp,
 	} else if (modifiers->flags & _DPRINTK_FLAGS_PRINT)
 		static_branch_enable(&dp->key.dd_key_true);
 #endif
+	/* delete site info for this callsite */
+	if (modifiers->flags & _DPRINTK_FLAGS_DELETE_SITE) {
+		if (dp->site) {
+			vpr_info("dropping site info %s.%s.%d\n", dp->site->filename,
+				dp->site->function, dp->lineno);
+			dp->site = NULL;
+		}
+	}
 }
 
 /*
-- 
2.31.1


  parent reply	other threads:[~2021-05-29 20:02 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 ` Jim Cromie [this message]
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 ` [RFC PATCH v6 17/34] dyndbg: add _index to struct _ddebug Jim Cromie
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-15-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 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.