linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v7 0/5] printk: Userspace format indexing support
@ 2021-06-15 16:52 Chris Down
  2021-06-15 16:52 ` [PATCH v7 1/5] string_helpers: Escape double quotes in escape_special Chris Down
                   ` (5 more replies)
  0 siblings, 6 replies; 31+ messages in thread
From: Chris Down @ 2021-06-15 16:52 UTC (permalink / raw)
  To: linux-kernel
  Cc: Petr Mladek, Jessica Yu, Sergey Senozhatsky, John Ogness,
	Steven Rostedt, Greg Kroah-Hartman, Johannes Weiner, Kees Cook,
	Andy Shevchenko, Rasmus Villemoes, kernel-team

We have a number of systems industry-wide that have a subset of their
functionality that works as follows:

1. Receive a message from local kmsg, serial console, or netconsole;
2. Apply a set of rules to classify the message;
3. Do something based on this classification (like scheduling a
   remediation for the machine), rinse, and repeat.

As a couple of examples of places we have this implemented just inside
Facebook, although this isn't a Facebook-specific problem, we have this
inside our netconsole processing (for alarm classification), and as part
of our machine health checking. We use these messages to determine
fairly important metrics around production health, and it's important
that we get them right.

While for some kinds of issues we have counters, tracepoints, or metrics
with a stable interface which can reliably indicate the issue, in order
to react to production issues quickly we need to work with the interface
which most kernel developers naturally use when developing: printk.

Most production issues come from unexpected phenomena, and as such
usually the code in question doesn't have easily usable tracepoints or
other counters available for the specific problem being mitigated. We
have a number of lines of monitoring defence against problems in
production (host metrics, process metrics, service metrics, etc), and
where it's not feasible to reliably monitor at another level, this kind
of pragmatic netconsole monitoring is essential.

As one would expect, monitoring using printk is rather brittle for a
number of reasons -- most notably that the message might disappear
entirely in a new version of the kernel, or that the message may change
in some way that the regex or other classification methods start to
silently fail.

One factor that makes this even harder is that, under normal operation,
many of these messages are never expected to be hit. For example, there
may be a rare hardware bug which one wants to detect if it was to ever
happen again, but its recurrence is not likely or anticipated. This
precludes using something like checking whether the printk in question
was printed somewhere fleetwide recently to determine whether the
message in question is still present or not, since we don't anticipate
that it should be printed anywhere, but still need to monitor for its
future presence in the long-term.

This class of issue has happened on a number of occasions, causing
unhealthy machines with hardware issues to remain in production for
longer than ideal. As a recent example, some monitoring around
blk_update_request fell out of date and caused semi-broken machines to
remain in production for longer than would be desirable.

Searching through the codebase to find the message is also extremely
fragile, because many of the messages are further constructed beyond
their callsite (eg. btrfs_printk and other module-specific wrappers,
each with their own functionality). Even if they aren't, guessing the
format and formulation of the underlying message based on the aesthetics
of the message emitted is not a recipe for success at scale, and our
previous issues with fleetwide machine health checking demonstrate as
much.

This provides a solution to the issue of silently changed or deleted
printks: we record pointers to all printk format strings known at
compile time into a new .printk_index section, both in vmlinux and
modules. At runtime, this can then be iterated by looking at
<debugfs>/printk/index/<module>, which emits the following format, both
readable by humans and able to be parsed by machines:

    $ head -1 vmlinux; shuf -n 5 vmlinux
    # <level[,flags]> filename:line function "format"
    <5> block/blk-settings.c:661 disk_stack_limits "%s: Warning: Device %s is misaligned\n"
    <4> kernel/trace/trace.c:8296 trace_create_file "Could not create tracefs '%s' entry\n"
    <6> arch/x86/kernel/hpet.c:144 _hpet_print_config "hpet: %s(%d):\n"
    <6> init/do_mounts.c:605 prepare_namespace "Waiting for root device %s...\n"
    <6> drivers/acpi/osl.c:1410 acpi_no_auto_serialize_setup "ACPI: auto-serialization disabled\n"

This mitigates the majority of cases where we have a highly-specific
printk which we want to match on, as we can now enumerate and check
whether the format changed or the printk callsite disappeared entirely
in userspace. This allows us to catch changes to printks we monitor
earlier and decide what to do about it before it becomes problematic.

There is no additional runtime cost for printk callers or printk itself,
and the assembly generated is exactly the same.

---

v2:

- Use seq_printf instead of step by step accumulation
- Scope fptr closer to its use
- Prevent seq_file from needing to alloc a new buffer
- Always provide KERN_SOH + level, even if caller omitted it
- Provide one file per module
- Update changelog to show ease of parsing
- Provide printk -> _printk for ARCH=um (thanks, LKP robot)
- Move to debugfs (thanks, Steven)

---

v3:

- Reduce locking during open by moving size lifetime to the inode
- Don't explicitly check for debugfs errors (thanks, gregkh)

---

v4:

- Fix a missed `extern int printk` fixup in ia64 (thanks, lkp)

---

v5:

Thanks Petr for the extensive feedback.

- Move all module handling from module notifier to module.[ch] directly
- Change to readable output format
  - Handled by new string_escape(ESCAPE_PRINTF)
- Add file/line/function information
- Mass rename everything to printk_index/CONFIG_PRINTK_INDEX/pi_*
  - As a result, this version does away with the mutex/hashtable
- Use seq_file iteration API instead of simple_open
- Remove debugfs file first to avoid ENOENT
- Tear down backing datastructure if debugfs file creation fails
- Move code under ifdef guard to kernel/printk/index.c
- Add pi_sec (formerly printk_fmt_sec) documentation
- Handle coexisting LOG_CONT + level
- Add header to debugfs output
- ...and probably some other stuff I forgot. :-)

---

v6:

- Rebase on next-20210518
- Remove pi_sec, do on demand lookups instead
- Lookup debugfs file on demand
- pi_sec_{store,remove} now only changes debugfs, so renamed
- Don't check for debugfs failure (again)
- Extract lookup logic into pi_get_entry
- Make the stored struct `const __used`
- Use _p_func directly, which allows including void-returning functions
- Move more stuff outside PRINTK_INDEX #ifdef using __printk_index_emit
- Scope __{start,stop}_printk_index more tightly
- Move parse_prefix to printk_parse_prefix in internal.h
- Put PRINTK_INDEX definition below TRACEDATA
- Use a module notifier again
- pi_object -> pi_entry, with clearer vars
- Reword Kconfig
- Split out printk_info_flags/string_helpers stuff into patches
- Use seq_escape_str directly now that ESCAPE_APPEND exists
- Add dev_printk indexing support

---

v7:

- Rebase on next-20210615
- Change some GCC statement expressions where do {} while (0) could work
   - dev_* needs to be statement due to SCSI_LOG_ERROR_RECOVERY and similar
- Fix some weird continuation indentation
- Remove filename from index.c header
- Add explicit default case for non MODULE_STATE_COMING/MODULE_STATE_GOING
- Tersify !CONFIG_MODULES case for pi_setup_module_notifier
- Remove now unnecessary pi_start forward declaration
- Move to DEFINE_SEQ_ATTRIBUTE for dfs_index
- Add comment explaining why we have both ESCAPE_SPECIAL and subset as @only
- Remove post_fmt for now, since dev_printk doesn't have it and it looks rare
- Rename pre_fmt to subsys_fmt_prefix
- Avoid forward declarations for pi_{create,remove}_file by splitting
  pi_get_module_name from other CONFIG_MODULES dependents
- Don't show -1 for LOGLEVEL_DEFAULT with LOG_CONT, since it has a different
  semantic meaning
- Some improvements to comments based on feedback from Petr
- Split out printk_parse_prefix externalisation into a separate patch
- Move printk_parse_prefix into internal.h instead of printk_ringbuffer.h
- Now that level might be optional (eg. in LOG_CONT with no level case), update
  the header to match
- Reduce duplication in dev_printk

Chris Down (5):
  string_helpers: Escape double quotes in escape_special
  printk: Straighten out log_flags into printk_info_flags
  printk: Rework parse_prefix into printk_parse_prefix
  printk: Userspace format indexing support
  printk: index: Add indexing support to dev_printk

 MAINTAINERS                          |   5 +
 arch/arm/kernel/entry-v7m.S          |   2 +-
 arch/arm/lib/backtrace-clang.S       |   2 +-
 arch/arm/lib/backtrace.S             |   2 +-
 arch/arm/mach-rpc/io-acorn.S         |   2 +-
 arch/arm/vfp/vfphw.S                 |   6 +-
 arch/ia64/include/uapi/asm/cmpxchg.h |   4 +-
 arch/openrisc/kernel/entry.S         |   6 +-
 arch/powerpc/kernel/head_fsl_booke.S |   2 +-
 arch/um/include/shared/user.h        |   3 +-
 arch/x86/kernel/head_32.S            |   2 +-
 drivers/base/core.c                  |   6 +-
 include/asm-generic/vmlinux.lds.h    |  13 ++
 include/linux/dev_printk.h           |  66 ++++++---
 include/linux/module.h               |   5 +
 include/linux/printk.h               |  95 ++++++++++++-
 init/Kconfig                         |  14 ++
 kernel/module.c                      |   5 +
 kernel/printk/Makefile               |   1 +
 kernel/printk/index.c                | 195 +++++++++++++++++++++++++++
 kernel/printk/internal.h             |   8 ++
 kernel/printk/printk.c               |  60 ++++-----
 lib/string_helpers.c                 |   4 +
 lib/test-string_helpers.c            |  14 +-
 24 files changed, 446 insertions(+), 76 deletions(-)
 create mode 100644 kernel/printk/index.c

-- 
2.31.1


^ permalink raw reply	[flat|nested] 31+ messages in thread

* [PATCH v7 1/5] string_helpers: Escape double quotes in escape_special
  2021-06-15 16:52 [PATCH v7 0/5] printk: Userspace format indexing support Chris Down
@ 2021-06-15 16:52 ` Chris Down
  2021-06-15 21:42   ` Andy Shevchenko
  2021-06-15 16:52 ` [PATCH v7 2/5] printk: Straighten out log_flags into printk_info_flags Chris Down
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 31+ messages in thread
From: Chris Down @ 2021-06-15 16:52 UTC (permalink / raw)
  To: linux-kernel
  Cc: Petr Mladek, Jessica Yu, Sergey Senozhatsky, John Ogness,
	Steven Rostedt, Greg Kroah-Hartman, Johannes Weiner, Kees Cook,
	Andy Shevchenko, Rasmus Villemoes, kernel-team

From an abstract point of view, escape_special's counterpart,
unescape_special, already handles the unescaping of blackslashed double
quote sequences.

As a more practical example, printk indexing is an example case where
this is already practically useful. Compare an example with
`ESCAPE_SPECIAL | ESCAPE_SPACE`, with quotes not escaped:

    [root@ktst ~]# grep drivers/pci/pci-stub.c:69 /sys/kernel/debug/printk/index/vmlinux
    <4> drivers/pci/pci-stub.c:69 pci_stub_init "pci-stub: invalid ID string "%s"\n"

...and the same after this patch:

    [root@ktst ~]# grep drivers/pci/pci-stub.c:69 /sys/kernel/debug/printk/index/vmlinux
    <4> drivers/pci/pci-stub.c:69 pci_stub_init "pci-stub: invalid ID string \"%s\"\n"

One can of course, alternatively, use ESCAPE_APPEND with a quote in
@only, but without this patch quotes are coerced into hex or octal which
can hurt readability quite significantly.

I've checked uses of ESCAPE_SPECIAL and %pE across the codebase, and I'm
pretty confident that this shouldn't affect any stable interfaces.

Signed-off-by: Chris Down <chris@chrisdown.name>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>
---
 lib/string_helpers.c      |  4 ++++
 lib/test-string_helpers.c | 14 +++++++-------
 2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/lib/string_helpers.c b/lib/string_helpers.c
index 5a35c7e16e96..3806a52ce697 100644
--- a/lib/string_helpers.c
+++ b/lib/string_helpers.c
@@ -361,6 +361,9 @@ static bool escape_special(unsigned char c, char **dst, char *end)
 	case '\e':
 		to = 'e';
 		break;
+	case '"':
+		to = '"';
+		break;
 	default:
 		return false;
 	}
@@ -474,6 +477,7 @@ static bool escape_hex(unsigned char c, char **dst, char *end)
  *		'\t' - horizontal tab
  *		'\v' - vertical tab
  *	%ESCAPE_SPECIAL:
+ *		'\"' - double quote
  *		'\\' - backslash
  *		'\a' - alert (BEL)
  *		'\e' - escape
diff --git a/lib/test-string_helpers.c b/lib/test-string_helpers.c
index 2185d71704f0..437d8e6b7cb1 100644
--- a/lib/test-string_helpers.c
+++ b/lib/test-string_helpers.c
@@ -140,13 +140,13 @@ static const struct test_string_2 escape0[] __initconst = {{
 },{
 	.in = "\\h\\\"\a\e\\",
 	.s1 = {{
-		.out = "\\\\h\\\\\"\\a\\e\\\\",
+		.out = "\\\\h\\\\\\\"\\a\\e\\\\",
 		.flags = ESCAPE_SPECIAL,
 	},{
-		.out = "\\\\\\150\\\\\\042\\a\\e\\\\",
+		.out = "\\\\\\150\\\\\\\"\\a\\e\\\\",
 		.flags = ESCAPE_SPECIAL | ESCAPE_OCTAL,
 	},{
-		.out = "\\\\\\x68\\\\\\x22\\a\\e\\\\",
+		.out = "\\\\\\x68\\\\\\\"\\a\\e\\\\",
 		.flags = ESCAPE_SPECIAL | ESCAPE_HEX,
 	},{
 		/* terminator */
@@ -157,10 +157,10 @@ static const struct test_string_2 escape0[] __initconst = {{
 		.out = "\eb \\C\007\"\x90\\r]",
 		.flags = ESCAPE_SPACE,
 	},{
-		.out = "\\eb \\\\C\\a\"\x90\r]",
+		.out = "\\eb \\\\C\\a\\\"\x90\r]",
 		.flags = ESCAPE_SPECIAL,
 	},{
-		.out = "\\eb \\\\C\\a\"\x90\\r]",
+		.out = "\\eb \\\\C\\a\\\"\x90\\r]",
 		.flags = ESCAPE_SPACE | ESCAPE_SPECIAL,
 	},{
 		.out = "\\033\\142\\040\\134\\103\\007\\042\\220\\015\\135",
@@ -169,10 +169,10 @@ static const struct test_string_2 escape0[] __initconst = {{
 		.out = "\\033\\142\\040\\134\\103\\007\\042\\220\\r\\135",
 		.flags = ESCAPE_SPACE | ESCAPE_OCTAL,
 	},{
-		.out = "\\e\\142\\040\\\\\\103\\a\\042\\220\\015\\135",
+		.out = "\\e\\142\\040\\\\\\103\\a\\\"\\220\\015\\135",
 		.flags = ESCAPE_SPECIAL | ESCAPE_OCTAL,
 	},{
-		.out = "\\e\\142\\040\\\\\\103\\a\\042\\220\\r\\135",
+		.out = "\\e\\142\\040\\\\\\103\\a\\\"\\220\\r\\135",
 		.flags = ESCAPE_SPACE | ESCAPE_SPECIAL | ESCAPE_OCTAL,
 	},{
 		.out = "\eb \\C\007\"\x90\r]",
-- 
2.31.1


^ permalink raw reply	[flat|nested] 31+ messages in thread

* [PATCH v7 2/5] printk: Straighten out log_flags into printk_info_flags
  2021-06-15 16:52 [PATCH v7 0/5] printk: Userspace format indexing support Chris Down
  2021-06-15 16:52 ` [PATCH v7 1/5] string_helpers: Escape double quotes in escape_special Chris Down
@ 2021-06-15 16:52 ` Chris Down
  2021-06-15 16:52 ` [PATCH v7 3/5] printk: Rework parse_prefix into printk_parse_prefix Chris Down
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 31+ messages in thread
From: Chris Down @ 2021-06-15 16:52 UTC (permalink / raw)
  To: linux-kernel
  Cc: Petr Mladek, Jessica Yu, Sergey Senozhatsky, John Ogness,
	Steven Rostedt, Greg Kroah-Hartman, Johannes Weiner, Kees Cook,
	Andy Shevchenko, Rasmus Villemoes, kernel-team

In the past, `enum log_flags` was part of `struct log`, hence the name.
`struct log` has since been reworked and now this struct is stored
inside `struct printk_info`. However, the name was never updated, which
is somewhat confusing -- especially since these flags operate at the
record level rather than at the level of an abstract log.

printk_info_flags also joins its other metadata struct friends in
printk_ringbuffer.h.

Signed-off-by: Chris Down <chris@chrisdown.name>
Reviewed-by: Petr Mladek <pmladek@suse.com>
---
 kernel/printk/internal.h |  6 ++++++
 kernel/printk/printk.c   | 43 +++++++++++++++++++---------------------
 2 files changed, 26 insertions(+), 23 deletions(-)

diff --git a/kernel/printk/internal.h b/kernel/printk/internal.h
index 51615c909b2f..1075e60fcd98 100644
--- a/kernel/printk/internal.h
+++ b/kernel/printk/internal.h
@@ -12,6 +12,12 @@
 
 #define PRINTK_NMI_CONTEXT_OFFSET	0x010000000
 
+/* Flags for a single printk record. */
+enum printk_info_flags {
+	LOG_NEWLINE	= 2,	/* text ended with a newline */
+	LOG_CONT	= 8,	/* text is a fragment of a continuation line */
+};
+
 __printf(4, 0)
 int vprintk_store(int facility, int level,
 		  const struct dev_printk_info *dev_info,
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 114e9963f903..3201bb0c269c 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -350,11 +350,6 @@ static int console_msg_format = MSG_FORMAT_DEFAULT;
  * non-prinatable characters are escaped in the "\xff" notation.
  */
 
-enum log_flags {
-	LOG_NEWLINE	= 2,	/* text ended with a newline */
-	LOG_CONT	= 8,	/* text is a fragment of a continuation line */
-};
-
 /* syslog_lock protects syslog_* variables and write access to clear_seq. */
 static DEFINE_RAW_SPINLOCK(syslog_lock);
 
@@ -1966,19 +1961,20 @@ static inline u32 printk_caller_id(void)
  *
  * @text:     The terminated text message.
  * @level:    A pointer to the current level value, will be updated.
- * @lflags:   A pointer to the current log flags, will be updated.
+ * @flags:    A pointer to the current printk_info flags, will be updated.
  *
  * @level may be NULL if the caller is not interested in the parsed value.
  * Otherwise the variable pointed to by @level must be set to
  * LOGLEVEL_DEFAULT in order to be updated with the parsed value.
  *
- * @lflags may be NULL if the caller is not interested in the parsed value.
- * Otherwise the variable pointed to by @lflags will be OR'd with the parsed
+ * @flags may be NULL if the caller is not interested in the parsed value.
+ * Otherwise the variable pointed to by @flags will be OR'd with the parsed
  * value.
  *
  * Return: The length of the parsed level and control flags.
  */
-static u16 parse_prefix(char *text, int *level, enum log_flags *lflags)
+static u16 parse_prefix(char *text, int *level,
+			enum printk_info_flags *flags)
 {
 	u16 prefix_len = 0;
 	int kern_level;
@@ -1994,8 +1990,8 @@ static u16 parse_prefix(char *text, int *level, enum log_flags *lflags)
 				*level = kern_level - '0';
 			break;
 		case 'c':	/* KERN_CONT */
-			if (lflags)
-				*lflags |= LOG_CONT;
+			if (flags)
+				*flags |= LOG_CONT;
 		}
 
 		prefix_len += 2;
@@ -2005,8 +2001,9 @@ static u16 parse_prefix(char *text, int *level, enum log_flags *lflags)
 	return prefix_len;
 }
 
-static u16 printk_sprint(char *text, u16 size, int facility, enum log_flags *lflags,
-			 const char *fmt, va_list args)
+static u16 printk_sprint(char *text, u16 size, int facility,
+			 enum printk_info_flags *flags, const char *fmt,
+			 va_list args)
 {
 	u16 text_len;
 
@@ -2015,7 +2012,7 @@ static u16 printk_sprint(char *text, u16 size, int facility, enum log_flags *lfl
 	/* Mark and strip a trailing newline. */
 	if (text_len && text[text_len - 1] == '\n') {
 		text_len--;
-		*lflags |= LOG_NEWLINE;
+		*flags |= LOG_NEWLINE;
 	}
 
 	/* Strip log level and control flags. */
@@ -2039,7 +2036,7 @@ int vprintk_store(int facility, int level,
 {
 	const u32 caller_id = printk_caller_id();
 	struct prb_reserved_entry e;
-	enum log_flags lflags = 0;
+	enum printk_info_flags flags = 0;
 	struct printk_record r;
 	u16 trunc_msg_len = 0;
 	char prefix_buf[8];
@@ -2071,22 +2068,22 @@ int vprintk_store(int facility, int level,
 
 	/* Extract log level or control flags. */
 	if (facility == 0)
-		parse_prefix(&prefix_buf[0], &level, &lflags);
+		parse_prefix(&prefix_buf[0], &level, &flags);
 
 	if (level == LOGLEVEL_DEFAULT)
 		level = default_message_loglevel;
 
 	if (dev_info)
-		lflags |= LOG_NEWLINE;
+		flags |= LOG_NEWLINE;
 
-	if (lflags & LOG_CONT) {
+	if (flags & LOG_CONT) {
 		prb_rec_init_wr(&r, reserve_size);
 		if (prb_reserve_in_last(&e, prb, &r, caller_id, LOG_LINE_MAX)) {
 			text_len = printk_sprint(&r.text_buf[r.info->text_len], reserve_size,
-						 facility, &lflags, fmt, args);
+						 facility, &flags, fmt, args);
 			r.info->text_len += text_len;
 
-			if (lflags & LOG_NEWLINE) {
+			if (flags & LOG_NEWLINE) {
 				r.info->flags |= LOG_NEWLINE;
 				prb_final_commit(&e);
 			} else {
@@ -2113,20 +2110,20 @@ int vprintk_store(int facility, int level,
 	}
 
 	/* fill message */
-	text_len = printk_sprint(&r.text_buf[0], reserve_size, facility, &lflags, fmt, args);
+	text_len = printk_sprint(&r.text_buf[0], reserve_size, facility, &flags, fmt, args);
 	if (trunc_msg_len)
 		memcpy(&r.text_buf[text_len], trunc_msg, trunc_msg_len);
 	r.info->text_len = text_len + trunc_msg_len;
 	r.info->facility = facility;
 	r.info->level = level & 7;
-	r.info->flags = lflags & 0x1f;
+	r.info->flags = flags & 0x1f;
 	r.info->ts_nsec = ts_nsec;
 	r.info->caller_id = caller_id;
 	if (dev_info)
 		memcpy(&r.info->dev_info, dev_info, sizeof(r.info->dev_info));
 
 	/* A message without a trailing newline can be continued. */
-	if (!(lflags & LOG_NEWLINE))
+	if (!(flags & LOG_NEWLINE))
 		prb_commit(&e);
 	else
 		prb_final_commit(&e);
-- 
2.31.1


^ permalink raw reply	[flat|nested] 31+ messages in thread

* [PATCH v7 3/5] printk: Rework parse_prefix into printk_parse_prefix
  2021-06-15 16:52 [PATCH v7 0/5] printk: Userspace format indexing support Chris Down
  2021-06-15 16:52 ` [PATCH v7 1/5] string_helpers: Escape double quotes in escape_special Chris Down
  2021-06-15 16:52 ` [PATCH v7 2/5] printk: Straighten out log_flags into printk_info_flags Chris Down
@ 2021-06-15 16:52 ` Chris Down
  2021-06-17  8:02   ` Petr Mladek
  2021-06-15 16:52 ` [PATCH v7 4/5] printk: Userspace format indexing support Chris Down
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 31+ messages in thread
From: Chris Down @ 2021-06-15 16:52 UTC (permalink / raw)
  To: linux-kernel
  Cc: Petr Mladek, Jessica Yu, Sergey Senozhatsky, John Ogness,
	Steven Rostedt, Greg Kroah-Hartman, Johannes Weiner, Kees Cook,
	Andy Shevchenko, Rasmus Villemoes, kernel-team

parse_prefix is needed externally by later patches, so move it into a
context where it can be used as such. Also give it the printk_ prefix to
reduce the chance of collisions.

Signed-off-by: Chris Down <chris@chrisdown.name>
Cc: Petr Mladek <pmladek@suse.com>
---
 kernel/printk/internal.h | 2 ++
 kernel/printk/printk.c   | 8 ++++----
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/kernel/printk/internal.h b/kernel/printk/internal.h
index 1075e60fcd98..1596e2837318 100644
--- a/kernel/printk/internal.h
+++ b/kernel/printk/internal.h
@@ -57,6 +57,8 @@ bool printk_percpu_data_ready(void);
 
 void defer_console_output(void);
 
+u16 printk_parse_prefix(const char *text, int *level,
+			enum printk_info_flags *flags);
 #else
 
 /*
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 3201bb0c269c..26d52aea9969 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -1957,7 +1957,7 @@ static inline u32 printk_caller_id(void)
 }
 
 /**
- * parse_prefix - Parse level and control flags.
+ * printk_parse_prefix - Parse level and control flags.
  *
  * @text:     The terminated text message.
  * @level:    A pointer to the current level value, will be updated.
@@ -1973,7 +1973,7 @@ static inline u32 printk_caller_id(void)
  *
  * Return: The length of the parsed level and control flags.
  */
-static u16 parse_prefix(char *text, int *level,
+u16 printk_parse_prefix(const char *text, int *level,
 			enum printk_info_flags *flags)
 {
 	u16 prefix_len = 0;
@@ -2019,7 +2019,7 @@ static u16 printk_sprint(char *text, u16 size, int facility,
 	if (facility == 0) {
 		u16 prefix_len;
 
-		prefix_len = parse_prefix(text, NULL, NULL);
+		prefix_len = printk_parse_prefix(text, NULL, NULL);
 		if (prefix_len) {
 			text_len -= prefix_len;
 			memmove(text, text + prefix_len, text_len);
@@ -2068,7 +2068,7 @@ int vprintk_store(int facility, int level,
 
 	/* Extract log level or control flags. */
 	if (facility == 0)
-		parse_prefix(&prefix_buf[0], &level, &flags);
+		printk_parse_prefix(&prefix_buf[0], &level, &flags);
 
 	if (level == LOGLEVEL_DEFAULT)
 		level = default_message_loglevel;
-- 
2.31.1


^ permalink raw reply	[flat|nested] 31+ messages in thread

* [PATCH v7 4/5] printk: Userspace format indexing support
  2021-06-15 16:52 [PATCH v7 0/5] printk: Userspace format indexing support Chris Down
                   ` (2 preceding siblings ...)
  2021-06-15 16:52 ` [PATCH v7 3/5] printk: Rework parse_prefix into printk_parse_prefix Chris Down
@ 2021-06-15 16:52 ` Chris Down
  2021-06-17  7:36   ` kernel test robot
                     ` (2 more replies)
  2021-06-15 16:52 ` [PATCH v7 5/5] printk: index: Add indexing support to dev_printk Chris Down
  2021-06-17 10:10 ` [PATCH v7 0/5] printk: Userspace format indexing support Petr Mladek
  5 siblings, 3 replies; 31+ messages in thread
From: Chris Down @ 2021-06-15 16:52 UTC (permalink / raw)
  To: linux-kernel
  Cc: Petr Mladek, Jessica Yu, Sergey Senozhatsky, John Ogness,
	Steven Rostedt, Greg Kroah-Hartman, Johannes Weiner, Kees Cook,
	Andy Shevchenko, Rasmus Villemoes, kernel-team

We have a number of systems industry-wide that have a subset of their
functionality that works as follows:

1. Receive a message from local kmsg, serial console, or netconsole;
2. Apply a set of rules to classify the message;
3. Do something based on this classification (like scheduling a
   remediation for the machine), rinse, and repeat.

As a couple of examples of places we have this implemented just inside
Facebook, although this isn't a Facebook-specific problem, we have this
inside our netconsole processing (for alarm classification), and as part
of our machine health checking. We use these messages to determine
fairly important metrics around production health, and it's important
that we get them right.

While for some kinds of issues we have counters, tracepoints, or metrics
with a stable interface which can reliably indicate the issue, in order
to react to production issues quickly we need to work with the interface
which most kernel developers naturally use when developing: printk.

Most production issues come from unexpected phenomena, and as such
usually the code in question doesn't have easily usable tracepoints or
other counters available for the specific problem being mitigated. We
have a number of lines of monitoring defence against problems in
production (host metrics, process metrics, service metrics, etc), and
where it's not feasible to reliably monitor at another level, this kind
of pragmatic netconsole monitoring is essential.

As one would expect, monitoring using printk is rather brittle for a
number of reasons -- most notably that the message might disappear
entirely in a new version of the kernel, or that the message may change
in some way that the regex or other classification methods start to
silently fail.

One factor that makes this even harder is that, under normal operation,
many of these messages are never expected to be hit. For example, there
may be a rare hardware bug which one wants to detect if it was to ever
happen again, but its recurrence is not likely or anticipated. This
precludes using something like checking whether the printk in question
was printed somewhere fleetwide recently to determine whether the
message in question is still present or not, since we don't anticipate
that it should be printed anywhere, but still need to monitor for its
future presence in the long-term.

This class of issue has happened on a number of occasions, causing
unhealthy machines with hardware issues to remain in production for
longer than ideal. As a recent example, some monitoring around
blk_update_request fell out of date and caused semi-broken machines to
remain in production for longer than would be desirable.

Searching through the codebase to find the message is also extremely
fragile, because many of the messages are further constructed beyond
their callsite (eg. btrfs_printk and other module-specific wrappers,
each with their own functionality). Even if they aren't, guessing the
format and formulation of the underlying message based on the aesthetics
of the message emitted is not a recipe for success at scale, and our
previous issues with fleetwide machine health checking demonstrate as
much.

This provides a solution to the issue of silently changed or deleted
printks: we record pointers to all printk format strings known at
compile time into a new .printk_index section, both in vmlinux and
modules. At runtime, this can then be iterated by looking at
<debugfs>/printk/index/<module>, which emits the following format, both
readable by humans and able to be parsed by machines:

    $ head -1 vmlinux; shuf -n 5 vmlinux
    # <level[,flags]> filename:line function "format"
    <5> block/blk-settings.c:661 disk_stack_limits "%s: Warning: Device %s is misaligned\n"
    <4> kernel/trace/trace.c:8296 trace_create_file "Could not create tracefs '%s' entry\n"
    <6> arch/x86/kernel/hpet.c:144 _hpet_print_config "hpet: %s(%d):\n"
    <6> init/do_mounts.c:605 prepare_namespace "Waiting for root device %s...\n"
    <6> drivers/acpi/osl.c:1410 acpi_no_auto_serialize_setup "ACPI: auto-serialization disabled\n"

This mitigates the majority of cases where we have a highly-specific
printk which we want to match on, as we can now enumerate and check
whether the format changed or the printk callsite disappeared entirely
in userspace. This allows us to catch changes to printks we monitor
earlier and decide what to do about it before it becomes problematic.

There is no additional runtime cost for printk callers or printk itself,
and the assembly generated is exactly the same.

Signed-off-by: Chris Down <chris@chrisdown.name>
Cc: Petr Mladek <pmladek@suse.com>
Cc: Jessica Yu <jeyu@kernel.org>
Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Cc: John Ogness <john.ogness@linutronix.de>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Kees Cook <keescook@chromium.org>
---
 MAINTAINERS                          |   5 +
 arch/arm/kernel/entry-v7m.S          |   2 +-
 arch/arm/lib/backtrace-clang.S       |   2 +-
 arch/arm/lib/backtrace.S             |   2 +-
 arch/arm/mach-rpc/io-acorn.S         |   2 +-
 arch/arm/vfp/vfphw.S                 |   6 +-
 arch/ia64/include/uapi/asm/cmpxchg.h |   4 +-
 arch/openrisc/kernel/entry.S         |   6 +-
 arch/powerpc/kernel/head_fsl_booke.S |   2 +-
 arch/um/include/shared/user.h        |   3 +-
 arch/x86/kernel/head_32.S            |   2 +-
 include/asm-generic/vmlinux.lds.h    |  13 ++
 include/linux/module.h               |   5 +
 include/linux/printk.h               |  95 ++++++++++++-
 init/Kconfig                         |  14 ++
 kernel/module.c                      |   5 +
 kernel/printk/Makefile               |   1 +
 kernel/printk/index.c                | 195 +++++++++++++++++++++++++++
 kernel/printk/printk.c               |  13 +-
 19 files changed, 353 insertions(+), 24 deletions(-)
 create mode 100644 kernel/printk/index.c

diff --git a/MAINTAINERS b/MAINTAINERS
index 0bcb7f4c9d74..557bf2588f5d 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -14878,6 +14878,11 @@ S:	Maintained
 F:	include/linux/printk.h
 F:	kernel/printk/
 
+PRINTK INDEXING
+R:	Chris Down <chris@chrisdown.name>
+S:	Maintained
+F:	kernel/printk/index.c
+
 PRISM54 WIRELESS DRIVER
 M:	Luis Chamberlain <mcgrof@kernel.org>
 L:	linux-wireless@vger.kernel.org
diff --git a/arch/arm/kernel/entry-v7m.S b/arch/arm/kernel/entry-v7m.S
index d0e898608d30..7bde93c10962 100644
--- a/arch/arm/kernel/entry-v7m.S
+++ b/arch/arm/kernel/entry-v7m.S
@@ -23,7 +23,7 @@ __invalid_entry:
 	adr	r0, strerr
 	mrs	r1, ipsr
 	mov	r2, lr
-	bl	printk
+	bl	_printk
 #endif
 	mov	r0, sp
 	bl	show_regs
diff --git a/arch/arm/lib/backtrace-clang.S b/arch/arm/lib/backtrace-clang.S
index 6174c45f53a5..5b2cdb1003e3 100644
--- a/arch/arm/lib/backtrace-clang.S
+++ b/arch/arm/lib/backtrace-clang.S
@@ -202,7 +202,7 @@ finished_setup:
 1006:		adr	r0, .Lbad
 		mov	r1, loglvl
 		mov	r2, frame
-		bl	printk
+		bl	_printk
 no_frame:	ldmfd	sp!, {r4 - r9, fp, pc}
 ENDPROC(c_backtrace)
 		.pushsection __ex_table,"a"
diff --git a/arch/arm/lib/backtrace.S b/arch/arm/lib/backtrace.S
index 872f658638d9..e8408f22d4dc 100644
--- a/arch/arm/lib/backtrace.S
+++ b/arch/arm/lib/backtrace.S
@@ -103,7 +103,7 @@ for_each_frame:	tst	frame, mask		@ Check for address exceptions
 1006:		adr	r0, .Lbad
 		mov	r1, loglvl
 		mov	r2, frame
-		bl	printk
+		bl	_printk
 no_frame:	ldmfd	sp!, {r4 - r9, pc}
 ENDPROC(c_backtrace)
 		
diff --git a/arch/arm/mach-rpc/io-acorn.S b/arch/arm/mach-rpc/io-acorn.S
index b9082a2a2a01..aa9bf0d771c0 100644
--- a/arch/arm/mach-rpc/io-acorn.S
+++ b/arch/arm/mach-rpc/io-acorn.S
@@ -25,4 +25,4 @@ ENTRY(insl)
 ENTRY(outsl)
 		adr	r0, .Liosl_warning
 		mov	r1, lr
-		b	printk
+		b	_printk
diff --git a/arch/arm/vfp/vfphw.S b/arch/arm/vfp/vfphw.S
index d5837bf05a9a..6f7926c9c179 100644
--- a/arch/arm/vfp/vfphw.S
+++ b/arch/arm/vfp/vfphw.S
@@ -23,7 +23,7 @@
 #ifdef DEBUG
 	stmfd	sp!, {r0-r3, ip, lr}
 	ldr	r0, =1f
-	bl	printk
+	bl	_printk
 	ldmfd	sp!, {r0-r3, ip, lr}
 
 	.pushsection .rodata, "a"
@@ -38,7 +38,7 @@
 	stmfd	sp!, {r0-r3, ip, lr}
 	mov	r1, \arg
 	ldr	r0, =1f
-	bl	printk
+	bl	_printk
 	ldmfd	sp!, {r0-r3, ip, lr}
 
 	.pushsection .rodata, "a"
@@ -55,7 +55,7 @@
 	mov	r2, \arg2
 	mov	r1, \arg1
 	ldr	r0, =1f
-	bl	printk
+	bl	_printk
 	ldmfd	sp!, {r0-r3, ip, lr}
 
 	.pushsection .rodata, "a"
diff --git a/arch/ia64/include/uapi/asm/cmpxchg.h b/arch/ia64/include/uapi/asm/cmpxchg.h
index 926c6cb1e029..2c2f3cfeaa77 100644
--- a/arch/ia64/include/uapi/asm/cmpxchg.h
+++ b/arch/ia64/include/uapi/asm/cmpxchg.h
@@ -143,9 +143,9 @@ extern long ia64_cmpxchg_called_with_bad_pointer(void);
 do {									\
 	if (_cmpxchg_bugcheck_count-- <= 0) {				\
 		void *ip;						\
-		extern int printk(const char *fmt, ...);		\
+		extern int _printk(const char *fmt, ...);		\
 		ip = (void *) ia64_getreg(_IA64_REG_IP);		\
-		printk("CMPXCHG_BUGCHECK: stuck at %p on word %p\n", ip, (v));\
+		_printk("CMPXCHG_BUGCHECK: stuck at %p on word %p\n", ip, (v));\
 		break;							\
 	}								\
 } while (0)
diff --git a/arch/openrisc/kernel/entry.S b/arch/openrisc/kernel/entry.S
index bc657e55c15f..947613f61d4a 100644
--- a/arch/openrisc/kernel/entry.S
+++ b/arch/openrisc/kernel/entry.S
@@ -551,7 +551,7 @@ EXCEPTION_ENTRY(_external_irq_handler)
 	l.movhi r3,hi(42f)
 	l.ori	r3,r3,lo(42f)
 	l.sw    0x0(r1),r3
-	l.jal   printk
+	l.jal   _printk
 	l.sw    0x4(r1),r4
 	l.addi  r1,r1,0x8
 
@@ -681,8 +681,8 @@ _syscall_debug:
 	l.sw    -4(r1),r27
 	l.sw    -8(r1),r11
 	l.addi  r1,r1,-8
-	l.movhi r27,hi(printk)
-	l.ori   r27,r27,lo(printk)
+	l.movhi r27,hi(_printk)
+	l.ori   r27,r27,lo(_printk)
 	l.jalr  r27
 	 l.nop
 	l.addi  r1,r1,8
diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S
index a1a5c3f10dc4..08d7153ed04b 100644
--- a/arch/powerpc/kernel/head_fsl_booke.S
+++ b/arch/powerpc/kernel/head_fsl_booke.S
@@ -858,7 +858,7 @@ KernelSPE:
 	ori	r3,r3,87f@l
 	mr	r4,r2		/* current */
 	lwz	r5,_NIP(r1)
-	bl	printk
+	bl	_printk
 #endif
 	b	interrupt_return
 #ifdef CONFIG_PRINTK
diff --git a/arch/um/include/shared/user.h b/arch/um/include/shared/user.h
index e793e4212f0a..dd4badffdeb3 100644
--- a/arch/um/include/shared/user.h
+++ b/arch/um/include/shared/user.h
@@ -38,7 +38,8 @@ extern void panic(const char *fmt, ...)
 #define UM_KERN_CONT	KERN_CONT
 
 #ifdef UML_CONFIG_PRINTK
-extern int printk(const char *fmt, ...)
+#define printk(...) _printk(__VA_ARGS__)
+extern int _printk(const char *fmt, ...)
 	__attribute__ ((format (printf, 1, 2)));
 #else
 static inline int printk(const char *fmt, ...)
diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S
index 67f590425d90..d8c64dab0efe 100644
--- a/arch/x86/kernel/head_32.S
+++ b/arch/x86/kernel/head_32.S
@@ -432,7 +432,7 @@ SYM_FUNC_START(early_ignore_irq)
 	pushl 32(%esp)
 	pushl 40(%esp)
 	pushl $int_msg
-	call printk
+	call _printk
 
 	call dump_stack
 
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index 17325416e2de..ddb2ff158321 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -483,6 +483,8 @@
 									\
 	TRACEDATA							\
 									\
+	PRINTK_INDEX							\
+									\
 	/* Kernel symbol table: Normal symbols */			\
 	__ksymtab         : AT(ADDR(__ksymtab) - LOAD_OFFSET) {		\
 		__start___ksymtab = .;					\
@@ -893,6 +895,17 @@
 #define TRACEDATA
 #endif
 
+#ifdef CONFIG_PRINTK_INDEX
+#define PRINTK_INDEX							\
+	.printk_index : AT(ADDR(.printk_index) - LOAD_OFFSET) {		\
+		__start_printk_index = .;				\
+		*(.printk_index)					\
+		__stop_printk_index = .;				\
+	}
+#else
+#define PRINTK_INDEX
+#endif
+
 #define NOTES								\
 	.notes : AT(ADDR(.notes) - LOAD_OFFSET) {			\
 		__start_notes = .;					\
diff --git a/include/linux/module.h b/include/linux/module.h
index 8a298d820dbc..c9f1200b2312 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -511,6 +511,11 @@ struct module {
 	struct klp_modinfo *klp_info;
 #endif
 
+#ifdef CONFIG_PRINTK_INDEX
+	unsigned int printk_index_size;
+	struct pi_entry **printk_index_start;
+#endif
+
 #ifdef CONFIG_MODULE_UNLOAD
 	/* What modules depend on me? */
 	struct list_head source_list;
diff --git a/include/linux/printk.h b/include/linux/printk.h
index f589b8b60806..f116b6f6f994 100644
--- a/include/linux/printk.h
+++ b/include/linux/printk.h
@@ -173,12 +173,12 @@ asmlinkage __printf(1, 0)
 int vprintk(const char *fmt, va_list args);
 
 asmlinkage __printf(1, 2) __cold
-int printk(const char *fmt, ...);
+int _printk(const char *fmt, ...);
 
 /*
  * Special printk facility for scheduler/timekeeping use only, _DO_NOT_USE_ !
  */
-__printf(1, 2) __cold int printk_deferred(const char *fmt, ...);
+__printf(1, 2) __cold int _printk_deferred(const char *fmt, ...);
 
 /*
  * Please don't use printk_ratelimit(), because it shares ratelimiting state
@@ -217,12 +217,12 @@ int vprintk(const char *s, va_list args)
 	return 0;
 }
 static inline __printf(1, 2) __cold
-int printk(const char *s, ...)
+int _printk(const char *s, ...)
 {
 	return 0;
 }
 static inline __printf(1, 2) __cold
-int printk_deferred(const char *s, ...)
+int _printk_deferred(const char *s, ...)
 {
 	return 0;
 }
@@ -306,6 +306,93 @@ extern int kptr_restrict;
 #define pr_fmt(fmt) fmt
 #endif
 
+struct module;
+
+#ifdef CONFIG_PRINTK_INDEX
+struct pi_entry {
+	const char *fmt;
+	const char *func;
+	const char *file;
+	unsigned int line;
+
+	/*
+	 * While printk and pr_* have the level stored in the string at compile
+	 * time, some subsystems dynamically add it at runtime through the
+	 * format string. For these dynamic cases, we allow the subsystem to
+	 * tell us the level at compile time.
+	 *
+	 * NULL indicates that the level, if any, is stored in fmt.
+	 */
+	const char *level;
+
+	/*
+	 * The format string used by various subsystem specific printk()
+	 * wrappers to prefix the message.
+	 *
+	 * Note that the static prefix defined by the pr_fmt() macro is stored
+	 * directly in the message format (@fmt), not here.
+	 */
+	const char *subsys_fmt_prefix;
+} __packed;
+
+#define __printk_index_emit(_fmt, _level, _subsys_fmt_prefix)		\
+	do {								\
+		if (__builtin_constant_p(_fmt) && __builtin_constant_p(_level)) { \
+			/*
+			 * We check __builtin_constant_p multiple times here
+			 * for the same input because GCC will produce an error
+			 * if we try to assign a static variable to fmt if it
+			 * is not a constant, even with the outer if statement.
+			 */						\
+			static const struct pi_entry _entry		\
+			__used = {					\
+				.fmt = __builtin_constant_p(_fmt) ? (_fmt) : NULL, \
+				.func = __func__,			\
+				.file = __FILE__,			\
+				.line = __LINE__,			\
+				.level = __builtin_constant_p(_level) ? (_level) : NULL, \
+				.subsys_fmt_prefix = _subsys_fmt_prefix,\
+			};						\
+			static const struct pi_entry *_entry_ptr	\
+			__used __section(".printk_index") = &_entry;	\
+		}							\
+	} while (0)
+
+#else /* !CONFIG_PRINTK_INDEX */
+#define __printk_index_emit(...) do {} while (0)
+#endif /* CONFIG_PRINTK_INDEX */
+
+/*
+ * Some subsystems have their own custom printk that applies a va_format to a
+ * generic format, for example, to include a device number or other metadata
+ * alongside the format supplied by the caller.
+ *
+ * In order to store these in the way they would be emitted by the printk
+ * infrastructure, the subsystem provides us with the start, fixed string, and
+ * any subsequent text in the format string.
+ *
+ * We take a variable argument list as pr_fmt/dev_fmt/etc are sometimes passed
+ * as multiple arguments (eg: `"%s: ", "blah"`), and we must only take the
+ * first one.
+ *
+ * subsys_fmt_prefix must be known at compile time, or compilation will fail
+ * (since this is a mistake). If fmt or level is not known at compile time, no
+ * index entry will be made (since this can legitimately happen).
+ */
+#define printk_index_subsys_emit(subsys_fmt_prefix, level, fmt, ...) \
+	__printk_index_emit(fmt, level, subsys_fmt_prefix)
+
+#define printk_index_wrap(_p_func, _fmt, ...)				\
+	({								\
+		__printk_index_emit(_fmt, NULL, NULL);			\
+		_p_func(_fmt, ##__VA_ARGS__);				\
+	})
+
+
+#define printk(fmt, ...) printk_index_wrap(_printk, fmt, ##__VA_ARGS__)
+#define printk_deferred(fmt, ...)					\
+	printk_index_wrap(_printk_deferred, fmt, ##__VA_ARGS__)
+
 /**
  * pr_emerg - Print an emergency-level message
  * @fmt: format string
diff --git a/init/Kconfig b/init/Kconfig
index 173a474012d7..f98283a851e4 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -781,6 +781,20 @@ config PRINTK_SAFE_LOG_BUF_SHIFT
 		     13 =>   8 KB for each CPU
 		     12 =>   4 KB for each CPU
 
+config PRINTK_INDEX
+	bool "Printk indexing debugfs interface"
+	depends on PRINTK && DEBUG_FS
+	help
+	  Add support for indexing of all printk formats known at compile time
+	  at <debugfs>/printk/index/<module>.
+
+	  This can be used as part of maintaining daemons which monitor
+	  /dev/kmsg, as it permits auditing the printk formats present in a
+	  kernel, allowing detection of cases where monitored printks are
+	  changed or no longer present.
+
+	  There is no additional runtime cost to printk with this enabled.
+
 #
 # Architectures with an unreliable sched_clock() should select this:
 #
diff --git a/kernel/module.c b/kernel/module.c
index 25dbdaf1f337..3ad43711941a 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -3351,6 +3351,11 @@ static int find_module_sections(struct module *mod, struct load_info *info)
 						sizeof(unsigned long),
 						&mod->num_kprobe_blacklist);
 #endif
+#ifdef CONFIG_PRINTK_INDEX
+	mod->printk_index_start = section_objs(info, ".printk_index",
+					       sizeof(*mod->printk_index_start),
+					       &mod->printk_index_size);
+#endif
 #ifdef CONFIG_HAVE_STATIC_CALL_INLINE
 	mod->static_call_sites = section_objs(info, ".static_call_sites",
 					      sizeof(*mod->static_call_sites),
diff --git a/kernel/printk/Makefile b/kernel/printk/Makefile
index eee3dc9b60a9..d118739874c0 100644
--- a/kernel/printk/Makefile
+++ b/kernel/printk/Makefile
@@ -3,3 +3,4 @@ obj-y	= printk.o
 obj-$(CONFIG_PRINTK)	+= printk_safe.o
 obj-$(CONFIG_A11Y_BRAILLE_CONSOLE)	+= braille.o
 obj-$(CONFIG_PRINTK)	+= printk_ringbuffer.o
+obj-$(CONFIG_PRINTK_INDEX)	+= index.o
diff --git a/kernel/printk/index.c b/kernel/printk/index.c
new file mode 100644
index 000000000000..ca062f5e1779
--- /dev/null
+++ b/kernel/printk/index.c
@@ -0,0 +1,195 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Userspace indexing of printk formats
+ */
+
+#include <linux/debugfs.h>
+#include <linux/module.h>
+#include <linux/printk.h>
+#include <linux/slab.h>
+#include <linux/string_helpers.h>
+
+#include "internal.h"
+
+extern struct pi_entry *__start_printk_index[];
+extern struct pi_entry *__stop_printk_index[];
+
+/* The base dir for module formats, typically debugfs/printk/index/ */
+static struct dentry *dfs_index;
+
+static struct pi_entry *pi_get_entry(const struct module *mod, loff_t pos)
+{
+	struct pi_entry **entries;
+	unsigned int nr_entries;
+
+#ifdef CONFIG_MODULES
+	if (mod) {
+		entries = mod->printk_index_start;
+		nr_entries = mod->printk_index_size;
+	}
+#endif
+
+	if (!mod) {
+		/* vmlinux, comes from linker symbols */
+		entries = __start_printk_index;
+		nr_entries = __stop_printk_index - __start_printk_index;
+	}
+
+	if (pos >= nr_entries)
+		return NULL;
+
+	return entries[pos];
+}
+
+static void *pi_next(struct seq_file *s, void *v, loff_t *pos)
+{
+	const struct module *mod = s->file->f_inode->i_private;
+	struct pi_entry *entry = pi_get_entry(mod, *pos);
+
+	(*pos)++;
+
+	return entry;
+}
+
+static void *pi_start(struct seq_file *s, loff_t *pos)
+{
+	/*
+	 * Make show() print the header line. Do not update *pos because
+	 * pi_next() still has to return the entry at index 0 later.
+	 */
+	if (*pos == 0)
+		return SEQ_START_TOKEN;
+
+	return pi_next(s, NULL, pos);
+}
+
+/*
+ * We need both ESCAPE_ANY and explicit characters from ESCAPE_SPECIAL in @only
+ * because otherwise ESCAPE_NAP will cause double quotes and backslashes to be
+ * ignored for quoting.
+ */
+#define seq_escape_printf_format(s, src) \
+	seq_escape_str(s, src, ESCAPE_ANY | ESCAPE_NAP | ESCAPE_APPEND, "\"\\")
+
+static int pi_show(struct seq_file *s, void *v)
+{
+	const struct pi_entry *entry = v;
+	int level = LOGLEVEL_DEFAULT;
+	enum printk_info_flags flags = 0;
+	u16 prefix_len = 0;
+
+	if (v == SEQ_START_TOKEN) {
+		seq_puts(s, "# <level/flags> filename:line function \"format\"\n");
+		return 0;
+	}
+
+	if (!entry->fmt)
+		return 0;
+
+	if (entry->level)
+		printk_parse_prefix(entry->level, &level, &flags);
+	else
+		prefix_len = printk_parse_prefix(entry->fmt, &level, &flags);
+
+
+	if (flags & LOG_CONT) {
+		/*
+		 * LOGLEVEL_DEFAULT here means "use the same level as the
+		 * message we're continuing from", not the default message
+		 * loglevel, so don't display it as such.
+		 */
+		if (level == LOGLEVEL_DEFAULT)
+			seq_puts(s, "<c>");
+		else
+			seq_printf(s, "<%d,c>", level);
+	} else
+		seq_printf(s, "<%d>", level);
+
+	seq_printf(s, " %s:%d %s \"", entry->file, entry->line, entry->func);
+	if (entry->subsys_fmt_prefix)
+		seq_escape_printf_format(s, entry->subsys_fmt_prefix);
+	seq_escape_printf_format(s, entry->fmt + prefix_len);
+	seq_puts(s, "\"\n");
+
+	return 0;
+}
+
+static void pi_stop(struct seq_file *p, void *v) { }
+
+static const struct seq_operations dfs_index_sops = {
+	.start = pi_start,
+	.next  = pi_next,
+	.show  = pi_show,
+	.stop  = pi_stop,
+};
+
+DEFINE_SEQ_ATTRIBUTE(dfs_index);
+
+#ifdef CONFIG_MODULES
+static const char *pi_get_module_name(struct module *mod)
+{
+	return mod ? mod->name : "vmlinux";
+}
+#else
+static const char *pi_get_module_name(struct module *mod)
+{
+	return "vmlinux";
+}
+#endif
+
+void pi_create_file(struct module *mod)
+{
+	debugfs_create_file(pi_get_module_name(mod), 0444, dfs_index,
+				       mod, &dfs_index_fops);
+}
+
+void pi_remove_file(struct module *mod)
+{
+	debugfs_remove(debugfs_lookup(pi_get_module_name(mod), dfs_index));
+}
+
+#ifdef CONFIG_MODULES
+static int pi_module_notify(struct notifier_block *nb, unsigned long op,
+			    void *data)
+{
+	struct module *mod = data;
+
+	switch (op) {
+	case MODULE_STATE_COMING:
+		pi_create_file(mod);
+		break;
+	case MODULE_STATE_GOING:
+		pi_remove_file(mod);
+		break;
+	default: /* we don't care about other module states */
+		break;
+	}
+
+	return NOTIFY_OK;
+}
+
+static struct notifier_block module_printk_fmts_nb = {
+	.notifier_call = pi_module_notify,
+};
+
+static void __init pi_setup_module_notifier(void)
+{
+	register_module_notifier(&module_printk_fmts_nb);
+}
+#else
+static inline void __init pi_setup_module_notifier(void) { }
+#endif
+
+static int __init pi_init(void)
+{
+	struct dentry *dfs_root = debugfs_create_dir("printk", NULL);
+
+	dfs_index = debugfs_create_dir("index", dfs_root);
+	pi_setup_module_notifier();
+	pi_create_file(NULL);
+
+	return 0;
+}
+
+/* debugfs comes up on core and must be initialised first */
+postcore_initcall(pi_init);
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index 26d52aea9969..085fb05c957a 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -2185,10 +2185,13 @@ int vprintk_default(const char *fmt, va_list args)
 EXPORT_SYMBOL_GPL(vprintk_default);
 
 /**
- * printk - print a kernel message
+ * _printk - print a kernel message
  * @fmt: format string
  *
- * This is printk(). It can be called from any context. We want it to work.
+ * This is _printk(). It can be called from any context. We want it to work.
+ *
+ * If printk indexing is enabled, _printk() is called from printk_index_wrap.
+ * Otherwise, printk is simply #defined to _printk.
  *
  * We try to grab the console_lock. If we succeed, it's easy - we log the
  * output and call the console drivers.  If we fail to get the semaphore, we
@@ -2205,7 +2208,7 @@ EXPORT_SYMBOL_GPL(vprintk_default);
  *
  * See the vsnprintf() documentation for format string extensions over C99.
  */
-asmlinkage __visible int printk(const char *fmt, ...)
+asmlinkage __visible int _printk(const char *fmt, ...)
 {
 	va_list args;
 	int r;
@@ -2216,7 +2219,7 @@ asmlinkage __visible int printk(const char *fmt, ...)
 
 	return r;
 }
-EXPORT_SYMBOL(printk);
+EXPORT_SYMBOL(_printk);
 
 #else /* CONFIG_PRINTK */
 
@@ -3201,7 +3204,7 @@ int vprintk_deferred(const char *fmt, va_list args)
 	return r;
 }
 
-int printk_deferred(const char *fmt, ...)
+int _printk_deferred(const char *fmt, ...)
 {
 	va_list args;
 	int r;
-- 
2.31.1


^ permalink raw reply	[flat|nested] 31+ messages in thread

* [PATCH v7 5/5] printk: index: Add indexing support to dev_printk
  2021-06-15 16:52 [PATCH v7 0/5] printk: Userspace format indexing support Chris Down
                   ` (3 preceding siblings ...)
  2021-06-15 16:52 ` [PATCH v7 4/5] printk: Userspace format indexing support Chris Down
@ 2021-06-15 16:52 ` Chris Down
  2021-06-17 10:02   ` Petr Mladek
  2021-06-17 10:10 ` [PATCH v7 0/5] printk: Userspace format indexing support Petr Mladek
  5 siblings, 1 reply; 31+ messages in thread
From: Chris Down @ 2021-06-15 16:52 UTC (permalink / raw)
  To: linux-kernel
  Cc: Petr Mladek, Jessica Yu, Sergey Senozhatsky, John Ogness,
	Steven Rostedt, Greg Kroah-Hartman, Johannes Weiner, Kees Cook,
	Andy Shevchenko, Rasmus Villemoes, kernel-team

While for most kinds of issues we have counters, tracepoints, or metrics
with a stable interface which can reliably be used to indicate issues,
in order to react to production issues quickly we sometimes need to work
with the interface which most kernel developers naturally use when
developing: printk, and printk-esques like dev_printk.

dev_printk is by far the most likely custom subsystem printk to benefit
from the printk indexing infrastructure, since niche device issues
brought about by production changes, firmware upgrades, and the like are
one of the most common things that we need printk infrastructure's
assistance to monitor.

Often these errors were never expected to practically manifest in
reality, and exhibit in code without extensive (or any) metrics present.
As such, there are typically very few options for issue detection
available to those with large fleets at the time the incident happens,
and we thus benefit strongly from monitoring netconsole in these
instances.

As such, add the infrastructure for dev_printk to be indexed in the
printk index. Even on a minimal kernel config, the coverage of the base
kernel's printk index is significantly improved:

Before:

    [root@ktst ~]# wc -l /sys/kernel/debug/printk/index/vmlinux
    4497 /sys/kernel/debug/printk/index/vmlinux

After:

    [root@ktst ~]# wc -l /sys/kernel/debug/printk/index/vmlinux
    5573 /sys/kernel/debug/printk/index/vmlinux

In terms of implementation, in order to trivially disambiguate them,
dev_printk is now a macro which wraps _dev_printk.

Signed-off-by: Chris Down <chris@chrisdown.name>
Cc: Petr Mladek <pmladek@suse.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>
---
 drivers/base/core.c        |  6 ++--
 include/linux/dev_printk.h | 66 ++++++++++++++++++++++++++++----------
 2 files changed, 52 insertions(+), 20 deletions(-)

diff --git a/drivers/base/core.c b/drivers/base/core.c
index b8a8c96dca58..31a24b4e27cd 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -4579,8 +4579,8 @@ static void __dev_printk(const char *level, const struct device *dev,
 		printk("%s(NULL device *): %pV", level, vaf);
 }
 
-void dev_printk(const char *level, const struct device *dev,
-		const char *fmt, ...)
+void _dev_printk(const char *level, const struct device *dev,
+		 const char *fmt, ...)
 {
 	struct va_format vaf;
 	va_list args;
@@ -4594,7 +4594,7 @@ void dev_printk(const char *level, const struct device *dev,
 
 	va_end(args);
 }
-EXPORT_SYMBOL(dev_printk);
+EXPORT_SYMBOL(_dev_printk);
 
 #define define_dev_printk_level(func, kern_level)		\
 void func(const struct device *dev, const char *fmt, ...)	\
diff --git a/include/linux/dev_printk.h b/include/linux/dev_printk.h
index 6f009559ee54..8da7452cae3f 100644
--- a/include/linux/dev_printk.h
+++ b/include/linux/dev_printk.h
@@ -38,8 +38,8 @@ __printf(3, 4) __cold
 int dev_printk_emit(int level, const struct device *dev, const char *fmt, ...);
 
 __printf(3, 4) __cold
-void dev_printk(const char *level, const struct device *dev,
-		const char *fmt, ...);
+void _dev_printk(const char *level, const struct device *dev,
+		 const char *fmt, ...);
 __printf(2, 3) __cold
 void _dev_emerg(const struct device *dev, const char *fmt, ...);
 __printf(2, 3) __cold
@@ -69,7 +69,7 @@ static inline void __dev_printk(const char *level, const struct device *dev,
 				struct va_format *vaf)
 {}
 static inline __printf(3, 4)
-void dev_printk(const char *level, const struct device *dev,
+void _dev_printk(const char *level, const struct device *dev,
 		 const char *fmt, ...)
 {}
 
@@ -97,25 +97,57 @@ void _dev_info(const struct device *dev, const char *fmt, ...)
 
 #endif
 
+/*
+ * Need to take variadic arguments even though we don't use them, as dev_fmt()
+ * may only just have been expanded and may result in multiple arguments.
+ */
+#define dev_printk_index_emit(level, fmt, ...) \
+	printk_index_subsys_emit("%s %s: ", level, fmt)
+
+#define dev_printk_index_wrap(_p_func, level, dev, fmt, ...)		\
+	({								\
+		dev_printk_index_emit(level, fmt);			\
+		_p_func(dev, fmt, ##__VA_ARGS__);			\
+	})
+
+/*
+ * Some callsites directly call dev_printk rather than going through the
+ * dev_<level> infrastructure, so we need to emit here as well as inside those
+ * level-specific macros. Only one index entry will be produced, either way,
+ * since dev_printk's `fmt` isn't known at compile time if going through the
+ * dev_<level> macros.
+ *
+ * dev_fmt() isn't called for dev_printk when used directly, as it's used by
+ * the dev_<level> macros internally which already have dev_fmt() processed.
+ *
+ * We also can't use dev_printk_index_wrap directly, because we have a separate
+ * level to process.
+ */
+#define dev_printk(level, dev, fmt, ...)				\
+	({								\
+		dev_printk_index_emit(level, fmt);			\
+		_dev_printk(level, dev, fmt, ##__VA_ARGS__);		\
+	})
+
 /*
  * #defines for all the dev_<level> macros to prefix with whatever
  * possible use of #define dev_fmt(fmt) ...
  */
 
-#define dev_emerg(dev, fmt, ...)					\
-	_dev_emerg(dev, dev_fmt(fmt), ##__VA_ARGS__)
-#define dev_crit(dev, fmt, ...)						\
-	_dev_crit(dev, dev_fmt(fmt), ##__VA_ARGS__)
-#define dev_alert(dev, fmt, ...)					\
-	_dev_alert(dev, dev_fmt(fmt), ##__VA_ARGS__)
-#define dev_err(dev, fmt, ...)						\
-	_dev_err(dev, dev_fmt(fmt), ##__VA_ARGS__)
-#define dev_warn(dev, fmt, ...)						\
-	_dev_warn(dev, dev_fmt(fmt), ##__VA_ARGS__)
-#define dev_notice(dev, fmt, ...)					\
-	_dev_notice(dev, dev_fmt(fmt), ##__VA_ARGS__)
-#define dev_info(dev, fmt, ...)						\
-	_dev_info(dev, dev_fmt(fmt), ##__VA_ARGS__)
+#define dev_emerg(dev, fmt, ...) \
+	dev_printk_index_wrap(_dev_emerg, KERN_EMERG, dev, dev_fmt(fmt), ##__VA_ARGS__)
+#define dev_crit(dev, fmt, ...) \
+	dev_printk_index_wrap(_dev_crit, KERN_CRIT, dev, dev_fmt(fmt), ##__VA_ARGS__)
+#define dev_alert(dev, fmt, ...) \
+	dev_printk_index_wrap(_dev_alert, KERN_ALERT, dev, dev_fmt(fmt), ##__VA_ARGS__)
+#define dev_err(dev, fmt, ...) \
+	dev_printk_index_wrap(_dev_err, KERN_ERR, dev, dev_fmt(fmt), ##__VA_ARGS__)
+#define dev_warn(dev, fmt, ...) \
+	dev_printk_index_wrap(_dev_warn, KERN_WARNING, dev, dev_fmt(fmt), ##__VA_ARGS__)
+#define dev_notice(dev, fmt, ...) \
+	dev_printk_index_wrap(_dev_notice, KERN_NOTICE, dev, dev_fmt(fmt), ##__VA_ARGS__)
+#define dev_info(dev, fmt, ...) \
+	dev_printk_index_wrap(_dev_info, KERN_INFO, dev, dev_fmt(fmt), ##__VA_ARGS__)
 
 #if defined(CONFIG_DYNAMIC_DEBUG) || \
 	(defined(CONFIG_DYNAMIC_DEBUG_CORE) && defined(DYNAMIC_DEBUG_MODULE))
-- 
2.31.1


^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 1/5] string_helpers: Escape double quotes in escape_special
  2021-06-15 16:52 ` [PATCH v7 1/5] string_helpers: Escape double quotes in escape_special Chris Down
@ 2021-06-15 21:42   ` Andy Shevchenko
  2021-06-16  0:00     ` Chris Down
  0 siblings, 1 reply; 31+ messages in thread
From: Andy Shevchenko @ 2021-06-15 21:42 UTC (permalink / raw)
  To: Chris Down
  Cc: Linux Kernel Mailing List, Petr Mladek, Jessica Yu,
	Sergey Senozhatsky, John Ogness, Steven Rostedt,
	Greg Kroah-Hartman, Johannes Weiner, Kees Cook, Andy Shevchenko,
	Rasmus Villemoes, kernel-team

On Tue, Jun 15, 2021 at 7:53 PM Chris Down <chris@chrisdown.name> wrote:

In case you will need to send a new version some nit picks below WRT
commit message. Or somebody might fix them in place when applying.

> From an abstract point of view, escape_special's counterpart,
> unescape_special, already handles the unescaping of blackslashed double
> quote sequences.
>
> As a more practical example, printk indexing is an example case where

(example example)

"As a more practical example, printk indexing is the case where..."

?

> this is already practically useful. Compare an example with
> `ESCAPE_SPECIAL | ESCAPE_SPACE`, with quotes not escaped:
>
>     [root@ktst ~]# grep drivers/pci/pci-stub.c:69 /sys/kernel/debug/printk/index/vmlinux
>     <4> drivers/pci/pci-stub.c:69 pci_stub_init "pci-stub: invalid ID string "%s"\n"
>
> ...and the same after this patch:
>
>     [root@ktst ~]# grep drivers/pci/pci-stub.c:69 /sys/kernel/debug/printk/index/vmlinux
>     <4> drivers/pci/pci-stub.c:69 pci_stub_init "pci-stub: invalid ID string \"%s\"\n"

In both examples: '[root@ktst ~]#' => '#'

> One can of course, alternatively, use ESCAPE_APPEND with a quote in
> @only, but without this patch quotes are coerced into hex or octal which
> can hurt readability quite significantly.
>
> I've checked uses of ESCAPE_SPECIAL and %pE across the codebase, and I'm

checked the uses

> pretty confident that this shouldn't affect any stable interfaces.
>
> Signed-off-by: Chris Down <chris@chrisdown.name>
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Reviewed-by: Petr Mladek <pmladek@suse.com>
> Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>
> ---
>  lib/string_helpers.c      |  4 ++++
>  lib/test-string_helpers.c | 14 +++++++-------
>  2 files changed, 11 insertions(+), 7 deletions(-)
>
> diff --git a/lib/string_helpers.c b/lib/string_helpers.c
> index 5a35c7e16e96..3806a52ce697 100644
> --- a/lib/string_helpers.c
> +++ b/lib/string_helpers.c
> @@ -361,6 +361,9 @@ static bool escape_special(unsigned char c, char **dst, char *end)
>         case '\e':
>                 to = 'e';
>                 break;
> +       case '"':
> +               to = '"';
> +               break;
>         default:
>                 return false;
>         }
> @@ -474,6 +477,7 @@ static bool escape_hex(unsigned char c, char **dst, char *end)
>   *             '\t' - horizontal tab
>   *             '\v' - vertical tab
>   *     %ESCAPE_SPECIAL:
> + *             '\"' - double quote
>   *             '\\' - backslash
>   *             '\a' - alert (BEL)
>   *             '\e' - escape
> diff --git a/lib/test-string_helpers.c b/lib/test-string_helpers.c
> index 2185d71704f0..437d8e6b7cb1 100644
> --- a/lib/test-string_helpers.c
> +++ b/lib/test-string_helpers.c
> @@ -140,13 +140,13 @@ static const struct test_string_2 escape0[] __initconst = {{
>  },{
>         .in = "\\h\\\"\a\e\\",
>         .s1 = {{
> -               .out = "\\\\h\\\\\"\\a\\e\\\\",
> +               .out = "\\\\h\\\\\\\"\\a\\e\\\\",
>                 .flags = ESCAPE_SPECIAL,
>         },{
> -               .out = "\\\\\\150\\\\\\042\\a\\e\\\\",
> +               .out = "\\\\\\150\\\\\\\"\\a\\e\\\\",
>                 .flags = ESCAPE_SPECIAL | ESCAPE_OCTAL,
>         },{
> -               .out = "\\\\\\x68\\\\\\x22\\a\\e\\\\",
> +               .out = "\\\\\\x68\\\\\\\"\\a\\e\\\\",
>                 .flags = ESCAPE_SPECIAL | ESCAPE_HEX,
>         },{
>                 /* terminator */
> @@ -157,10 +157,10 @@ static const struct test_string_2 escape0[] __initconst = {{
>                 .out = "\eb \\C\007\"\x90\\r]",
>                 .flags = ESCAPE_SPACE,
>         },{
> -               .out = "\\eb \\\\C\\a\"\x90\r]",
> +               .out = "\\eb \\\\C\\a\\\"\x90\r]",
>                 .flags = ESCAPE_SPECIAL,
>         },{
> -               .out = "\\eb \\\\C\\a\"\x90\\r]",
> +               .out = "\\eb \\\\C\\a\\\"\x90\\r]",
>                 .flags = ESCAPE_SPACE | ESCAPE_SPECIAL,
>         },{
>                 .out = "\\033\\142\\040\\134\\103\\007\\042\\220\\015\\135",
> @@ -169,10 +169,10 @@ static const struct test_string_2 escape0[] __initconst = {{
>                 .out = "\\033\\142\\040\\134\\103\\007\\042\\220\\r\\135",
>                 .flags = ESCAPE_SPACE | ESCAPE_OCTAL,
>         },{
> -               .out = "\\e\\142\\040\\\\\\103\\a\\042\\220\\015\\135",
> +               .out = "\\e\\142\\040\\\\\\103\\a\\\"\\220\\015\\135",
>                 .flags = ESCAPE_SPECIAL | ESCAPE_OCTAL,
>         },{
> -               .out = "\\e\\142\\040\\\\\\103\\a\\042\\220\\r\\135",
> +               .out = "\\e\\142\\040\\\\\\103\\a\\\"\\220\\r\\135",
>                 .flags = ESCAPE_SPACE | ESCAPE_SPECIAL | ESCAPE_OCTAL,
>         },{
>                 .out = "\eb \\C\007\"\x90\r]",
> --
> 2.31.1
>


-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 1/5] string_helpers: Escape double quotes in escape_special
  2021-06-15 21:42   ` Andy Shevchenko
@ 2021-06-16  0:00     ` Chris Down
  2021-06-16  2:05       ` Randy Dunlap
  0 siblings, 1 reply; 31+ messages in thread
From: Chris Down @ 2021-06-16  0:00 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Linux Kernel Mailing List, Petr Mladek, Jessica Yu,
	Sergey Senozhatsky, John Ogness, Steven Rostedt,
	Greg Kroah-Hartman, Johannes Weiner, Kees Cook, Andy Shevchenko,
	Rasmus Villemoes, kernel-team

Andy Shevchenko writes:
>> I've checked uses of ESCAPE_SPECIAL and %pE across the codebase, and I'm
>
>checked the uses

Hmm, what's wrong with using the zero article for "checked uses"? I mean, I 
don't have any strong resistance, but I don't see anything wrong with it 
either, and it matches how I'd naturally speak.

Agreed on the others, though, hopefully they can be massaged in :-)

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 1/5] string_helpers: Escape double quotes in escape_special
  2021-06-16  0:00     ` Chris Down
@ 2021-06-16  2:05       ` Randy Dunlap
  2021-06-16  8:08         ` Andy Shevchenko
  0 siblings, 1 reply; 31+ messages in thread
From: Randy Dunlap @ 2021-06-16  2:05 UTC (permalink / raw)
  To: Chris Down, Andy Shevchenko
  Cc: Linux Kernel Mailing List, Petr Mladek, Jessica Yu,
	Sergey Senozhatsky, John Ogness, Steven Rostedt,
	Greg Kroah-Hartman, Johannes Weiner, Kees Cook, Andy Shevchenko,
	Rasmus Villemoes, kernel-team

On 6/15/21 5:00 PM, Chris Down wrote:
> Andy Shevchenko writes:
>>> I've checked uses of ESCAPE_SPECIAL and %pE across the codebase, and I'm
>>
>> checked the uses
> 
> Hmm, what's wrong with using the zero article for "checked uses"? I mean, I don't have any strong resistance, but I don't see anything wrong with it either, and it matches how I'd naturally speak.
> 
> Agreed on the others, though, hopefully they can be massaged in :-)

Ack, I don't see anything wrong with it either.

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 1/5] string_helpers: Escape double quotes in escape_special
  2021-06-16  2:05       ` Randy Dunlap
@ 2021-06-16  8:08         ` Andy Shevchenko
  2021-06-16 13:30           ` Steven Rostedt
  0 siblings, 1 reply; 31+ messages in thread
From: Andy Shevchenko @ 2021-06-16  8:08 UTC (permalink / raw)
  To: Randy Dunlap
  Cc: Chris Down, Linux Kernel Mailing List, Petr Mladek, Jessica Yu,
	Sergey Senozhatsky, John Ogness, Steven Rostedt,
	Greg Kroah-Hartman, Johannes Weiner, Kees Cook, Rasmus Villemoes,
	kernel-team

On Tue, Jun 15, 2021 at 07:05:25PM -0700, Randy Dunlap wrote:
> On 6/15/21 5:00 PM, Chris Down wrote:
> > Andy Shevchenko writes:
> >>> I've checked uses of ESCAPE_SPECIAL and %pE across the codebase, and I'm
> >>
> >> checked the uses
> > 
> > Hmm, what's wrong with using the zero article for "checked uses"? I mean, I don't have any strong resistance, but I don't see anything wrong with it either, and it matches how I'd naturally speak.
> > 
> > Agreed on the others, though, hopefully they can be massaged in :-)
> 
> Ack, I don't see anything wrong with it either.

I guess you know better than me :-)

I'm just a mere non-native speaker here to whom it's stylistically harder to
parse without the article.


-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 1/5] string_helpers: Escape double quotes in escape_special
  2021-06-16  8:08         ` Andy Shevchenko
@ 2021-06-16 13:30           ` Steven Rostedt
  0 siblings, 0 replies; 31+ messages in thread
From: Steven Rostedt @ 2021-06-16 13:30 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Randy Dunlap, Chris Down, Linux Kernel Mailing List, Petr Mladek,
	Jessica Yu, Sergey Senozhatsky, John Ogness, Greg Kroah-Hartman,
	Johannes Weiner, Kees Cook, Rasmus Villemoes, kernel-team

On Wed, 16 Jun 2021 11:08:18 +0300
Andy Shevchenko <andy.shevchenko@gmail.com> wrote:

> On Tue, Jun 15, 2021 at 07:05:25PM -0700, Randy Dunlap wrote:
> > On 6/15/21 5:00 PM, Chris Down wrote:  
> > > Andy Shevchenko writes:  
> > >>> I've checked uses of ESCAPE_SPECIAL and %pE across the codebase, and I'm  
> > >>
> > >> checked the uses  
> > > 
> > > Hmm, what's wrong with using the zero article for "checked uses"? I mean, I don't have any strong resistance, but I don't see anything wrong with it either, and it matches how I'd naturally speak.
> > > 
> > > Agreed on the others, though, hopefully they can be massaged in :-)  
> > 
> > Ack, I don't see anything wrong with it either.  
> 
> I guess you know better than me :-)
> 
> I'm just a mere non-native speaker here to whom it's stylistically harder to
> parse without the article.

English is weird. It sounds fine to me with and without the "the" article,
but I'll say having "the" does make it a little smoother, and probably
better for the non-native speaking folks.

Technically, I'm a native speaker, but I prefer to say my mother tongue is C. ;-)

-- Steve

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 4/5] printk: Userspace format indexing support
  2021-06-15 16:52 ` [PATCH v7 4/5] printk: Userspace format indexing support Chris Down
@ 2021-06-17  7:36   ` kernel test robot
  2021-06-17  8:38     ` Andy Shevchenko
  2021-06-17  9:43   ` Petr Mladek
  2021-06-18 11:48   ` kernel test robot
  2 siblings, 1 reply; 31+ messages in thread
From: kernel test robot @ 2021-06-17  7:36 UTC (permalink / raw)
  To: Chris Down, linux-kernel
  Cc: kbuild-all, Petr Mladek, Jessica Yu, Sergey Senozhatsky,
	John Ogness, Steven Rostedt, Greg Kroah-Hartman, Johannes Weiner,
	Kees Cook, Andy Shevchenko

[-- Attachment #1: Type: text/plain, Size: 4819 bytes --]

Hi Chris,

I love your patch! Perhaps something to improve:

[auto build test WARNING on jeyu/modules-next]
[also build test WARNING on linux/master soc/for-next openrisc/for-next powerpc/next asm-generic/master driver-core/driver-core-testing linus/master v5.13-rc6 next-20210616]
[cannot apply to uml/linux-next tip/x86/core]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Chris-Down/printk-Userspace-format-indexing-support/20210617-101450
base:   https://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux.git modules-next
config: sh-allmodconfig (attached as .config)
compiler: sh4-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/819166a91ddffdbf04d0b4e6905a5ab3b568194f
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Chris-Down/printk-Userspace-format-indexing-support/20210617-101450
        git checkout 819166a91ddffdbf04d0b4e6905a5ab3b568194f
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=sh 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   kernel/printk/index.c: In function 'pi_show':
   kernel/printk/index.c:72:2: error: implicit declaration of function 'seq_escape_str'; did you mean 'seq_escape'? [-Werror=implicit-function-declaration]
      72 |  seq_escape_str(s, src, ESCAPE_ANY | ESCAPE_NAP | ESCAPE_APPEND, "\"\\")
         |  ^~~~~~~~~~~~~~
   kernel/printk/index.c:110:3: note: in expansion of macro 'seq_escape_printf_format'
     110 |   seq_escape_printf_format(s, entry->subsys_fmt_prefix);
         |   ^~~~~~~~~~~~~~~~~~~~~~~~
   kernel/printk/index.c:72:38: error: 'ESCAPE_NAP' undeclared (first use in this function); did you mean 'ESCAPE_NP'?
      72 |  seq_escape_str(s, src, ESCAPE_ANY | ESCAPE_NAP | ESCAPE_APPEND, "\"\\")
         |                                      ^~~~~~~~~~
   kernel/printk/index.c:110:3: note: in expansion of macro 'seq_escape_printf_format'
     110 |   seq_escape_printf_format(s, entry->subsys_fmt_prefix);
         |   ^~~~~~~~~~~~~~~~~~~~~~~~
   kernel/printk/index.c:72:38: note: each undeclared identifier is reported only once for each function it appears in
      72 |  seq_escape_str(s, src, ESCAPE_ANY | ESCAPE_NAP | ESCAPE_APPEND, "\"\\")
         |                                      ^~~~~~~~~~
   kernel/printk/index.c:110:3: note: in expansion of macro 'seq_escape_printf_format'
     110 |   seq_escape_printf_format(s, entry->subsys_fmt_prefix);
         |   ^~~~~~~~~~~~~~~~~~~~~~~~
   kernel/printk/index.c:72:51: error: 'ESCAPE_APPEND' undeclared (first use in this function); did you mean 'ESCAPE_ANY'?
      72 |  seq_escape_str(s, src, ESCAPE_ANY | ESCAPE_NAP | ESCAPE_APPEND, "\"\\")
         |                                                   ^~~~~~~~~~~~~
   kernel/printk/index.c:110:3: note: in expansion of macro 'seq_escape_printf_format'
     110 |   seq_escape_printf_format(s, entry->subsys_fmt_prefix);
         |   ^~~~~~~~~~~~~~~~~~~~~~~~
   kernel/printk/index.c: At top level:
>> kernel/printk/index.c:140:6: warning: no previous prototype for 'pi_create_file' [-Wmissing-prototypes]
     140 | void pi_create_file(struct module *mod)
         |      ^~~~~~~~~~~~~~
>> kernel/printk/index.c:146:6: warning: no previous prototype for 'pi_remove_file' [-Wmissing-prototypes]
     146 | void pi_remove_file(struct module *mod)
         |      ^~~~~~~~~~~~~~
   cc1: some warnings being treated as errors

Kconfig warnings: (for reference only)
   WARNING: unmet direct dependencies detected for SND_ATMEL_SOC_PDC
   Depends on SOUND && !UML && SND && SND_SOC && SND_ATMEL_SOC && HAS_DMA
   Selected by
   - SND_ATMEL_SOC_SSC && SOUND && !UML && SND && SND_SOC && SND_ATMEL_SOC
   - SND_ATMEL_SOC_SSC_PDC && SOUND && !UML && SND && SND_SOC && SND_ATMEL_SOC && ATMEL_SSC


vim +/pi_create_file +140 kernel/printk/index.c

   139	
 > 140	void pi_create_file(struct module *mod)
   141	{
   142		debugfs_create_file(pi_get_module_name(mod), 0444, dfs_index,
   143					       mod, &dfs_index_fops);
   144	}
   145	
 > 146	void pi_remove_file(struct module *mod)
   147	{
   148		debugfs_remove(debugfs_lookup(pi_get_module_name(mod), dfs_index));
   149	}
   150	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 54784 bytes --]

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 3/5] printk: Rework parse_prefix into printk_parse_prefix
  2021-06-15 16:52 ` [PATCH v7 3/5] printk: Rework parse_prefix into printk_parse_prefix Chris Down
@ 2021-06-17  8:02   ` Petr Mladek
  0 siblings, 0 replies; 31+ messages in thread
From: Petr Mladek @ 2021-06-17  8:02 UTC (permalink / raw)
  To: Chris Down
  Cc: linux-kernel, Jessica Yu, Sergey Senozhatsky, John Ogness,
	Steven Rostedt, Greg Kroah-Hartman, Johannes Weiner, Kees Cook,
	Andy Shevchenko, Rasmus Villemoes, kernel-team

On Tue 2021-06-15 17:52:51, Chris Down wrote:
> parse_prefix is needed externally by later patches, so move it into a
> context where it can be used as such. Also give it the printk_ prefix to
> reduce the chance of collisions.
> 
> Signed-off-by: Chris Down <chris@chrisdown.name>

Reviewed-by: Petr Mladek <pmladek@suse.com>

Best Regards,
Petr

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 4/5] printk: Userspace format indexing support
  2021-06-17  7:36   ` kernel test robot
@ 2021-06-17  8:38     ` Andy Shevchenko
  2021-06-17  9:39       ` Petr Mladek
  2021-06-17 11:57       ` Chris Down
  0 siblings, 2 replies; 31+ messages in thread
From: Andy Shevchenko @ 2021-06-17  8:38 UTC (permalink / raw)
  To: kernel test robot
  Cc: Chris Down, linux-kernel, kbuild-all, Petr Mladek, Jessica Yu,
	Sergey Senozhatsky, John Ogness, Steven Rostedt,
	Greg Kroah-Hartman, Johannes Weiner, Kees Cook

On Thu, Jun 17, 2021 at 03:36:08PM +0800, kernel test robot wrote:
> Hi Chris,
> 
> I love your patch! Perhaps something to improve:
> 
> [auto build test WARNING on jeyu/modules-next]
> [also build test WARNING on linux/master soc/for-next openrisc/for-next powerpc/next asm-generic/master driver-core/driver-core-testing linus/master v5.13-rc6 next-20210616]
> [cannot apply to uml/linux-next tip/x86/core]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch]
> 
> url:    https://github.com/0day-ci/linux/commits/Chris-Down/printk-Userspace-format-indexing-support/20210617-101450
> base:   https://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux.git modules-next

Not sure that has what Andrew keeps in his quilt.

Chris, to avoid such issues, use `git format-patch --base ...` when sending a
series / patches.


-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 4/5] printk: Userspace format indexing support
  2021-06-17  8:38     ` Andy Shevchenko
@ 2021-06-17  9:39       ` Petr Mladek
  2021-06-17 11:57       ` Chris Down
  1 sibling, 0 replies; 31+ messages in thread
From: Petr Mladek @ 2021-06-17  9:39 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: kernel test robot, Chris Down, linux-kernel, kbuild-all,
	Jessica Yu, Sergey Senozhatsky, John Ogness, Steven Rostedt,
	Greg Kroah-Hartman, Johannes Weiner, Kees Cook

On Thu 2021-06-17 11:38:00, Andy Shevchenko wrote:
> On Thu, Jun 17, 2021 at 03:36:08PM +0800, kernel test robot wrote:
> > Hi Chris,
> > 
> > I love your patch! Perhaps something to improve:
> > 
> > [auto build test WARNING on jeyu/modules-next]
> > [also build test WARNING on linux/master soc/for-next openrisc/for-next powerpc/next asm-generic/master driver-core/driver-core-testing linus/master v5.13-rc6 next-20210616]
> > [cannot apply to uml/linux-next tip/x86/core]
> > [If your patch is applied to the wrong git tree, kindly drop us a note.
> > And when submitting patch, we suggest to use '--base' as documented in
> > https://git-scm.com/docs/git-format-patch]
> > 
> > url:    https://github.com/0day-ci/linux/commits/Chris-Down/printk-Userspace-format-indexing-support/20210617-101450
> > base:   https://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux.git modules-next
> 
> Not sure that has what Andrew keeps in his quilt.

Yup, it compiles fine on linux-next where the funtion is declared via
a patch from Andrew's tree.

Best Regards,
Petr

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 4/5] printk: Userspace format indexing support
  2021-06-15 16:52 ` [PATCH v7 4/5] printk: Userspace format indexing support Chris Down
  2021-06-17  7:36   ` kernel test robot
@ 2021-06-17  9:43   ` Petr Mladek
  2021-06-18 11:48   ` kernel test robot
  2 siblings, 0 replies; 31+ messages in thread
From: Petr Mladek @ 2021-06-17  9:43 UTC (permalink / raw)
  To: Chris Down
  Cc: linux-kernel, Jessica Yu, Sergey Senozhatsky, John Ogness,
	Steven Rostedt, Greg Kroah-Hartman, Johannes Weiner, Kees Cook,
	Andy Shevchenko, Rasmus Villemoes, kernel-team

On Tue 2021-06-15 17:52:53, Chris Down wrote:
> We have a number of systems industry-wide that have a subset of their
> functionality that works as follows:
> 
> 1. Receive a message from local kmsg, serial console, or netconsole;
> 2. Apply a set of rules to classify the message;
> 3. Do something based on this classification (like scheduling a
>    remediation for the machine), rinse, and repeat.
> 
> This provides a solution to the issue of silently changed or deleted
> printks: we record pointers to all printk format strings known at
> compile time into a new .printk_index section, both in vmlinux and
> modules. At runtime, this can then be iterated by looking at
> <debugfs>/printk/index/<module>, which emits the following format, both
> readable by humans and able to be parsed by machines:
> 
>     $ head -1 vmlinux; shuf -n 5 vmlinux
>     # <level[,flags]> filename:line function "format"
>     <5> block/blk-settings.c:661 disk_stack_limits "%s: Warning: Device %s is misaligned\n"
>     <4> kernel/trace/trace.c:8296 trace_create_file "Could not create tracefs '%s' entry\n"
>     <6> arch/x86/kernel/hpet.c:144 _hpet_print_config "hpet: %s(%d):\n"
>     <6> init/do_mounts.c:605 prepare_namespace "Waiting for root device %s...\n"
>     <6> drivers/acpi/osl.c:1410 acpi_no_auto_serialize_setup "ACPI: auto-serialization disabled\n"
> 
> 
> Signed-off-by: Chris Down <chris@chrisdown.name>

This version looks fine to me:

Reviewed-by: Petr Mladek <pmladek@suse.com>
Tested-by: Petr Mladek <pmladek@suse.com>

Best Regards,
Petr

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 5/5] printk: index: Add indexing support to dev_printk
  2021-06-15 16:52 ` [PATCH v7 5/5] printk: index: Add indexing support to dev_printk Chris Down
@ 2021-06-17 10:02   ` Petr Mladek
  0 siblings, 0 replies; 31+ messages in thread
From: Petr Mladek @ 2021-06-17 10:02 UTC (permalink / raw)
  To: Chris Down
  Cc: linux-kernel, Jessica Yu, Sergey Senozhatsky, John Ogness,
	Steven Rostedt, Greg Kroah-Hartman, Johannes Weiner, Kees Cook,
	Andy Shevchenko, Rasmus Villemoes, kernel-team

On Tue 2021-06-15 17:52:56, Chris Down wrote:
> While for most kinds of issues we have counters, tracepoints, or metrics
> with a stable interface which can reliably be used to indicate issues,
> in order to react to production issues quickly we sometimes need to work
> with the interface which most kernel developers naturally use when
> developing: printk, and printk-esques like dev_printk.
> 
> dev_printk is by far the most likely custom subsystem printk to benefit
> from the printk indexing infrastructure, since niche device issues
> brought about by production changes, firmware upgrades, and the like are
> one of the most common things that we need printk infrastructure's
> assistance to monitor.
> 
> Often these errors were never expected to practically manifest in
> reality, and exhibit in code without extensive (or any) metrics present.
> As such, there are typically very few options for issue detection
> available to those with large fleets at the time the incident happens,
> and we thus benefit strongly from monitoring netconsole in these
> instances.
> 
> As such, add the infrastructure for dev_printk to be indexed in the
> printk index. Even on a minimal kernel config, the coverage of the base
> kernel's printk index is significantly improved:
> 
> Before:
> 
>     [root@ktst ~]# wc -l /sys/kernel/debug/printk/index/vmlinux
>     4497 /sys/kernel/debug/printk/index/vmlinux
> 
> After:
> 
>     [root@ktst ~]# wc -l /sys/kernel/debug/printk/index/vmlinux
>     5573 /sys/kernel/debug/printk/index/vmlinux
> 
> In terms of implementation, in order to trivially disambiguate them,
> dev_printk is now a macro which wraps _dev_printk.
> 
> Signed-off-by: Chris Down <chris@chrisdown.name>

Reviewed-by: Petr Mladek <pmladek@suse.com>
Tested-by: Petr Mladek <pmladek@suse.com>

Best Regards,
Petr

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 0/5] printk: Userspace format indexing support
  2021-06-15 16:52 [PATCH v7 0/5] printk: Userspace format indexing support Chris Down
                   ` (4 preceding siblings ...)
  2021-06-15 16:52 ` [PATCH v7 5/5] printk: index: Add indexing support to dev_printk Chris Down
@ 2021-06-17 10:10 ` Petr Mladek
  2021-06-17 12:33   ` Andy Shevchenko
                     ` (2 more replies)
  5 siblings, 3 replies; 31+ messages in thread
From: Petr Mladek @ 2021-06-17 10:10 UTC (permalink / raw)
  To: Chris Down
  Cc: linux-kernel, Jessica Yu, Sergey Senozhatsky, John Ogness,
	Steven Rostedt, Greg Kroah-Hartman, Johannes Weiner, Kees Cook,
	Andy Shevchenko, Rasmus Villemoes, kernel-team

On Tue 2021-06-15 17:52:20, Chris Down wrote:
> We have a number of systems industry-wide that have a subset of their
> functionality that works as follows:
> 
> 1. Receive a message from local kmsg, serial console, or netconsole;
> 2. Apply a set of rules to classify the message;
> 3. Do something based on this classification (like scheduling a
>    remediation for the machine), rinse, and repeat.
> 
> This provides a solution to the issue of silently changed or deleted
> printks: we record pointers to all printk format strings known at
> compile time into a new .printk_index section, both in vmlinux and
> modules. At runtime, this can then be iterated by looking at
> <debugfs>/printk/index/<module>, which emits the following format, both
> readable by humans and able to be parsed by machines:
> 
>     $ head -1 vmlinux; shuf -n 5 vmlinux
>     # <level[,flags]> filename:line function "format"
>     <5> block/blk-settings.c:661 disk_stack_limits "%s: Warning: Device %s is misaligned\n"
>     <4> kernel/trace/trace.c:8296 trace_create_file "Could not create tracefs '%s' entry\n"
>     <6> arch/x86/kernel/hpet.c:144 _hpet_print_config "hpet: %s(%d):\n"
>     <6> init/do_mounts.c:605 prepare_namespace "Waiting for root device %s...\n"
>     <6> drivers/acpi/osl.c:1410 acpi_no_auto_serialize_setup "ACPI: auto-serialization disabled\n"
> 
> This mitigates the majority of cases where we have a highly-specific
> printk which we want to match on, as we can now enumerate and check
> whether the format changed or the printk callsite disappeared entirely
> in userspace. This allows us to catch changes to printks we monitor
> earlier and decide what to do about it before it becomes problematic.
> 
> There is no additional runtime cost for printk callers or printk itself,
> and the assembly generated is exactly the same.
> 
> Chris Down (5):
>   string_helpers: Escape double quotes in escape_special
>   printk: Straighten out log_flags into printk_info_flags
>   printk: Rework parse_prefix into printk_parse_prefix
>   printk: Userspace format indexing support
>   printk: index: Add indexing support to dev_printk

The patchset looks ready for linux-next from my POV. I could fixup the
messages as suggested by Andy when pushing.

Well, I would still like to get acks from:

   + Andy for the 1st patch
   + Jessica for the changes in the module loader code in 4th patch.

Best Regards,
Petr

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 4/5] printk: Userspace format indexing support
  2021-06-17  8:38     ` Andy Shevchenko
  2021-06-17  9:39       ` Petr Mladek
@ 2021-06-17 11:57       ` Chris Down
  1 sibling, 0 replies; 31+ messages in thread
From: Chris Down @ 2021-06-17 11:57 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: kernel test robot, linux-kernel, kbuild-all, Petr Mladek,
	Jessica Yu, Sergey Senozhatsky, John Ogness, Steven Rostedt,
	Greg Kroah-Hartman, Johannes Weiner, Kees Cook

Andy Shevchenko writes:
>Chris, to avoid such issues, use `git format-patch --base ...` when sending a
>series / patches.

Ah, I forgot about that. Will do, thanks.

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 0/5] printk: Userspace format indexing support
  2021-06-17 10:10 ` [PATCH v7 0/5] printk: Userspace format indexing support Petr Mladek
@ 2021-06-17 12:33   ` Andy Shevchenko
  2021-06-17 14:50     ` Chris Down
  2021-06-17 12:36   ` Jessica Yu
  2021-06-21  8:54   ` Petr Mladek
  2 siblings, 1 reply; 31+ messages in thread
From: Andy Shevchenko @ 2021-06-17 12:33 UTC (permalink / raw)
  To: Petr Mladek
  Cc: Chris Down, Linux Kernel Mailing List, Jessica Yu,
	Sergey Senozhatsky, John Ogness, Steven Rostedt,
	Greg Kroah-Hartman, Johannes Weiner, Kees Cook, Andy Shevchenko,
	Rasmus Villemoes, kernel-team

On Thu, Jun 17, 2021 at 2:10 PM Petr Mladek <pmladek@suse.com> wrote:
> On Tue 2021-06-15 17:52:20, Chris Down wrote:

> > Chris Down (5):
> >   string_helpers: Escape double quotes in escape_special
> >   printk: Straighten out log_flags into printk_info_flags
> >   printk: Rework parse_prefix into printk_parse_prefix
> >   printk: Userspace format indexing support
> >   printk: index: Add indexing support to dev_printk
>
> The patchset looks ready for linux-next from my POV. I could fixup the
> messages as suggested by Andy when pushing.
>
> Well, I would still like to get acks from:
>
>    + Andy for the 1st patch
>    + Jessica for the changes in the module loader code in 4th patch.

Assuming that Chris indeed spent time on checking string_esape_mem()
users along with %*pE (and all its variations with hardcoded length)
and haven't found any problems,
Acked-by: Andy Shevchenko <andy.shevchenko@gmail.com>


-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 0/5] printk: Userspace format indexing support
  2021-06-17 10:10 ` [PATCH v7 0/5] printk: Userspace format indexing support Petr Mladek
  2021-06-17 12:33   ` Andy Shevchenko
@ 2021-06-17 12:36   ` Jessica Yu
  2021-06-21  8:54   ` Petr Mladek
  2 siblings, 0 replies; 31+ messages in thread
From: Jessica Yu @ 2021-06-17 12:36 UTC (permalink / raw)
  To: Petr Mladek
  Cc: Chris Down, linux-kernel, Sergey Senozhatsky, John Ogness,
	Steven Rostedt, Greg Kroah-Hartman, Johannes Weiner, Kees Cook,
	Andy Shevchenko, Rasmus Villemoes, kernel-team

+++ Petr Mladek [17/06/21 12:10 +0200]:
>On Tue 2021-06-15 17:52:20, Chris Down wrote:
>> We have a number of systems industry-wide that have a subset of their
>> functionality that works as follows:
>>
>> 1. Receive a message from local kmsg, serial console, or netconsole;
>> 2. Apply a set of rules to classify the message;
>> 3. Do something based on this classification (like scheduling a
>>    remediation for the machine), rinse, and repeat.
>>
>> This provides a solution to the issue of silently changed or deleted
>> printks: we record pointers to all printk format strings known at
>> compile time into a new .printk_index section, both in vmlinux and
>> modules. At runtime, this can then be iterated by looking at
>> <debugfs>/printk/index/<module>, which emits the following format, both
>> readable by humans and able to be parsed by machines:
>>
>>     $ head -1 vmlinux; shuf -n 5 vmlinux
>>     # <level[,flags]> filename:line function "format"
>>     <5> block/blk-settings.c:661 disk_stack_limits "%s: Warning: Device %s is misaligned\n"
>>     <4> kernel/trace/trace.c:8296 trace_create_file "Could not create tracefs '%s' entry\n"
>>     <6> arch/x86/kernel/hpet.c:144 _hpet_print_config "hpet: %s(%d):\n"
>>     <6> init/do_mounts.c:605 prepare_namespace "Waiting for root device %s...\n"
>>     <6> drivers/acpi/osl.c:1410 acpi_no_auto_serialize_setup "ACPI: auto-serialization disabled\n"
>>
>> This mitigates the majority of cases where we have a highly-specific
>> printk which we want to match on, as we can now enumerate and check
>> whether the format changed or the printk callsite disappeared entirely
>> in userspace. This allows us to catch changes to printks we monitor
>> earlier and decide what to do about it before it becomes problematic.
>>
>> There is no additional runtime cost for printk callers or printk itself,
>> and the assembly generated is exactly the same.
>>
>> Chris Down (5):
>>   string_helpers: Escape double quotes in escape_special
>>   printk: Straighten out log_flags into printk_info_flags
>>   printk: Rework parse_prefix into printk_parse_prefix
>>   printk: Userspace format indexing support
>>   printk: index: Add indexing support to dev_printk
>
>The patchset looks ready for linux-next from my POV. I could fixup the
>messages as suggested by Andy when pushing.
>
>Well, I would still like to get acks from:
>
>   + Andy for the 1st patch
>   + Jessica for the changes in the module loader code in 4th patch.

Hi Petr, the module.{c,h} changes are fine by me:

     Acked-by: Jessica Yu <jeyu@kernel.org>

Thank you,

Jessica

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 0/5] printk: Userspace format indexing support
  2021-06-17 12:33   ` Andy Shevchenko
@ 2021-06-17 14:50     ` Chris Down
  2021-06-17 14:52       ` Chris Down
  0 siblings, 1 reply; 31+ messages in thread
From: Chris Down @ 2021-06-17 14:50 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Petr Mladek, Linux Kernel Mailing List, Jessica Yu,
	Sergey Senozhatsky, John Ogness, Steven Rostedt,
	Greg Kroah-Hartman, Johannes Weiner, Kees Cook, Andy Shevchenko,
	Rasmus Villemoes, kernel-team

Andy Shevchenko writes:
>Assuming that Chris indeed spent time on checking string_esape_mem()
>users along with %*pE (and all its variations with hardcoded length)
>and haven't found any problems,
>Acked-by: Andy Shevchenko <andy.shevchenko@gmail.com>

Thanks! Probably worth documenting my methodology :-)

Forgive the lack of wrapping -- I suspect it will probably make this easier to 
read.

   % git grep '"[^"]*%[*0-9]*pE[^"]*"'
   drivers/gpu/drm/drm_dp_cec.c:   seq_printf(file, "ID: %*pE\n",
   drivers/gpu/drm/drm_dp_dual_mode_helper.c:      drm_dbg_kms(dev, "DP dual mode HDMI ID: %*pE (err %zd)\n",
   drivers/gpu/drm/drm_dp_helper.c:                    "%s: DP %s: OUI %*phD dev-ID %*pE HW-rev %d.%d SW-rev %d.%d quirks 0x%04x\n",
   drivers/net/wireless/intel/ipw2x00/ipw2100.c:   IPW_DEBUG_INFO("%s: Associated with '%*pE' at %s, channel %d (BSSID=%pM)\n",
   drivers/net/wireless/intel/ipw2x00/ipw2100.c:   IPW_DEBUG_HC("SSID: '%*pE'\n", ssid_len, essid);
   drivers/net/wireless/intel/ipw2x00/ipw2100.c:             "disassociated: '%*pE' %pM\n", priv->essid_len, priv->essid,
   drivers/net/wireless/intel/ipw2x00/ipw2100.c:   IPW_DEBUG_WX("Setting ESSID: '%*pE' (%d)\n", length, essid, length);
   drivers/net/wireless/intel/ipw2x00/ipw2100.c:           IPW_DEBUG_WX("Getting essid: '%*pE'\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:                                             "associated: '%*pE' %pM\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:                                                     "deauthenticated: '%*pE' %pM: (0x%04X) - %s\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:                                             "authenticated: '%*pE' %pM\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:                                             "disassociated: '%*pE' %pM\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:                                     "authenticated: '%*pE' %pM\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:                                     "deauthenticated: '%*pE' %pM\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_MERGE("Network '%*pE (%pM)' excluded due to capability mismatch.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:                   IPW_DEBUG_MERGE("Network '%*pE (%pM)' excluded because of non-network ESSID.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:                   IPW_DEBUG_MERGE("Network '%*pE (%pM)' excluded because of ESSID mismatch: '%*pE'.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_MERGE("Network '%*pE excluded because newer than current network.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_MERGE("Network '%*pE excluded because newer than current network.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_MERGE("Network '%*pE (%pM)' excluded because of age: %ums.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_MERGE("Network '%*pE (%pM)' excluded because of channel mismatch: %d != %d.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_MERGE("Network '%*pE (%pM)' excluded because of privacy mismatch: %s != %s.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_MERGE("Network '%*pE (%pM)' excluded because of the same BSSID match: %pM.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_MERGE("Network '%*pE (%pM)' excluded because of invalid frequency/mode combination.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_MERGE("Network '%*pE (%pM)' excluded because configured rate mask excludes AP mandatory rate.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_MERGE("Network '%*pE (%pM)' excluded because of no compatible rates.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:   IPW_DEBUG_MERGE("Network '%*pE (%pM)' is a viable match.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:                   IPW_DEBUG_MERGE("remove network %*pE\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded due to capability mismatch.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:                   IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because of non-network ESSID.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:                   IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because of ESSID mismatch: '%*pE'.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because '%*pE (%pM)' has a stronger signal.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because of storming (%ums since last assoc attempt).\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because of age: %ums.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because of channel mismatch: %d != %d.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because of privacy mismatch: %s != %s.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because of BSSID mismatch: %pM.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because of invalid frequency/mode combination.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because of invalid channel in current GEO\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because configured rate mask excludes AP mandatory rate.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_ASSOC("Network '%*pE (%pM)' excluded because of no compatible rates.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:   IPW_DEBUG_ASSOC("Network '%*pE (%pM)' is a viable match.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_INFO("ESSID locked to '%*pE'\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:   IPW_DEBUG_ASSOC("%ssociation attempt: '%*pE', channel %d, 802.11%c [%d], %s[:%s], enc=%s%s%s%c%c\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:   IPW_DEBUG(IPW_DL_STATE, "associating: '%*pE' %pM\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:                   IPW_DEBUG_ASSOC("Expired '%*pE' (%pM) from network list.\n",
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:   IPW_DEBUG_WX("Setting ESSID: '%*pE' (%d)\n", length, extra, length);
   drivers/net/wireless/intel/ipw2x00/ipw2200.c:           IPW_DEBUG_WX("Getting essid: '%*pE'\n",
   drivers/net/wireless/intel/ipw2x00/libipw_rx.c:                 LIBIPW_DEBUG_MGMT("WLAN_EID_SSID: '%*pE' len=%d.\n",
   drivers/net/wireless/intel/ipw2x00/libipw_rx.c:         LIBIPW_DEBUG_SCAN("Filtered out '%*pE (%pM)' network.\n",
   drivers/net/wireless/intel/ipw2x00/libipw_rx.c: LIBIPW_DEBUG_SCAN("'%*pE' (%pM): %c%c%c%c %c%c%c%c-%c%c%c%c %c%c%c%c\n",
   drivers/net/wireless/intel/ipw2x00/libipw_rx.c:         LIBIPW_DEBUG_SCAN("Dropped '%*pE' (%pM) via %s.\n",
   drivers/net/wireless/intel/ipw2x00/libipw_rx.c:                 LIBIPW_DEBUG_SCAN("Expired '%*pE' (%pM) from network list.\n",
   drivers/net/wireless/intel/ipw2x00/libipw_rx.c:         LIBIPW_DEBUG_SCAN("Adding '%*pE' (%pM) via %s.\n",
   drivers/net/wireless/intel/ipw2x00/libipw_rx.c:         LIBIPW_DEBUG_SCAN("Updating '%*pE' (%pM) via %s.\n",
   drivers/net/wireless/intel/ipw2x00/libipw_wx.c:                 LIBIPW_DEBUG_SCAN("Not showing network '%*pE (%pM)' due to age (%ums).\n",
   drivers/net/wireless/intel/ipw2x00/libipw_wx.c:         LIBIPW_DEBUG_WX("Setting key %d to '%*pE' (%d:%d bytes)\n",
   drivers/net/wireless/intersil/hostap/hostap_proc.c:     seq_printf(m, "%*pE", (int)bss->ssid_len, bss->ssid);
   drivers/net/wireless/marvell/libertas/cfg.c:                    lbs_deb_scan("scan: %pM, capa %04x, chan %2d, %*pE, %d dBm\n",
   drivers/net/wireless/marvell/libertas/mesh.c:   lbs_deb_cmd("mesh config action %d type %x channel %d SSID %*pE\n",
   drivers/platform/olpc/olpc-xo175-ec.c:  dev_dbg(&priv->spi->dev, "got debug string [%*pE]\n",
   drivers/platform/surface/surface3_power.c:      snprintf(bix->serial, ARRAY_SIZE(bix->serial), "%3pE%6pE", buf + 7, buf);
   drivers/platform/surface/surface3_power.c:      snprintf(bix->OEM, ARRAY_SIZE(bix->OEM), "%3pE", buf);
   drivers/platform/x86/wmi.c:             pr_info("\tobject_id: %2pE\n", g->object_id);
   drivers/scsi/scsi_lib.c:                        id_size = snprintf(id, id_len, "t10.%*pE",
   drivers/soc/qcom/cmd-db.c:                      seq_printf(seq, "0x%05x: %*pEp", le32_to_cpu(ent->addr),
   drivers/staging/rtl8192e/rtllib.h:      snprintf(escaped, sizeof(escaped), "%*pE", essid_len, essid);
   drivers/staging/rtl8192u/ieee80211/ieee80211.h: snprintf(escaped, sizeof(escaped), "%*pE", essid_len, essid);
   drivers/staging/wlan-ng/prism2sta.c:            netdev_info(wlandev->netdev, "Prism2 card SN: %*pE\n",
   drivers/thunderbolt/xdomain.c:  return sprintf(buf, "%*pE\n", (int)strlen(svc->key), svc->key);
   drivers/tty/mips_ejtag_fdc.c:           dev_dbg(priv->dev, "%s%u: out %08x: \"%*pE%*pE\"\n",
   drivers/tty/mips_ejtag_fdc.c:           dev_dbg(priv->dev, "%s%u: in  %08x: \"%*pE\"\n",
   drivers/tty/serial/serial_core.c:       pr_info("SysRq is enabled by magic sequence '%*pE' on serial\n",
   fs/overlayfs/overlayfs.h:       pr_debug("getxattr(%pd2, \"%s\", \"%*pE\", %zu, 0) = %i\n",
   fs/overlayfs/overlayfs.h:       pr_debug("setxattr(%pd2, \"%s\", \"%*pE\", %zu, 0) = %i\n",
   lib/test_printf.c:      test("(null)", "%pE", NULL);
   lib/test_printf.c:      test("(efault)", "%pE", ERR_PTR(-11));
   lib/test_printf.c:      test("(efault)", "%pE", PTR_INVALID);
   net/ceph/debugfs.c:             seq_printf(s, "%*pE/%*pE\t0x%x",
   net/ceph/debugfs.c:             seq_printf(s, "%*pE\t0x%x", t->target_oid.name_len,

For all ESSID cases, there's no clear standard, but according to Cisco, double 
quote is illegal in SSID (although there's no formalised standard). At the very 
least it's extremely unusual, and even if it happens, I don't see how it could 
cause problems for the cases here.

- drivers/gpu/drm/drm_dp_cec.c: Device ID, chance of quotes is approaching zero.
- drivers/gpu/drm/drm_dp_dual_mode_helper.c: Debugging message only.
- drivers/gpu/drm/drm_dp_helper.c: Debugging message only.
- drivers/net/wireless/intel/ipw2x00/ipw2100.c: ESSID case, debugging message only.
- drivers/net/wireless/intel/ipw2x00/ipw2200.c: ESSID case, debugging message only.
- drivers/net/wireless/intersil/hostap/hostap_proc.c: ESSID case, /proc.
- drivers/net/wireless/marvell/libertas/cfg.c: ESSID case, debugging message only.
- drivers/net/wireless/marvell/libertas/mesh.c: ESSID case, debugging message only.
- drivers/platform/olpc/olpc-xo175-ec.c: Debugging message only.
- drivers/platform/surface/surface3_power.c: It wouldn't make sense for either the OEM or serial to contain quotes, especially considering how low level this is.
- drivers/platform/x86/wmi.c: Debug dump only, there's not gonna be quotes in 2 character escaping anyway.
- drivers/scsi/scsi_lib.c: Reading vendor ID. Passed back as length anyway, so that's fine -- it just needs to be unique.
- drivers/soc/qcom/cmd-db.c: Debug dump, and judging by the code no way it's gonna contain quotes.
- drivers/staging/rtl8192e/rtllib.h: ESSID case, only used for netdev_dbg messages anyway.
- drivers/staging/rtl8192u/ieee80211/ieee80211.h: Ditto rtllib.h.
- drivers/staging/wlan-ng/prism2sta.c: Serial number, it's not gonna contain quotes. For debugging only anyway.
- drivers/thunderbolt/xdomain.c: Used in key_show, which is used as a rare device_attribute. Only used for device debug.
- drivers/tty/mips_ejtag_fdc.c: Debugging messages only.
- drivers/tty/serial/serial_core.c: Debugging message only, and benefits from quoting (but seems highly unlikely it would be there anyway).
- fs/overlayfs/overlayfs.h: Debugging messages only, and would actually even benefit from the new quoting.
- lib/test_printf.c: None of these have quotes.
- net/ceph/debugfs.c: Debugging only, and looks unlikely to be affected regardless.

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 0/5] printk: Userspace format indexing support
  2021-06-17 14:50     ` Chris Down
@ 2021-06-17 14:52       ` Chris Down
  0 siblings, 0 replies; 31+ messages in thread
From: Chris Down @ 2021-06-17 14:52 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Petr Mladek, Linux Kernel Mailing List, Jessica Yu,
	Sergey Senozhatsky, John Ogness, Steven Rostedt,
	Greg Kroah-Hartman, Johannes Weiner, Kees Cook, Andy Shevchenko,
	Rasmus Villemoes, kernel-team

(And forgot to mention I did the same for ESCAPE_SPECIAL explicit users and 
those using masks including it, feel free to let me know if you want those as 
well.)

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 4/5] printk: Userspace format indexing support
  2021-06-15 16:52 ` [PATCH v7 4/5] printk: Userspace format indexing support Chris Down
  2021-06-17  7:36   ` kernel test robot
  2021-06-17  9:43   ` Petr Mladek
@ 2021-06-18 11:48   ` kernel test robot
  2021-06-18 12:19     ` Chris Down
  2 siblings, 1 reply; 31+ messages in thread
From: kernel test robot @ 2021-06-18 11:48 UTC (permalink / raw)
  To: Chris Down, linux-kernel
  Cc: kbuild-all, Petr Mladek, Jessica Yu, Sergey Senozhatsky,
	John Ogness, Steven Rostedt, Greg Kroah-Hartman, Johannes Weiner,
	Kees Cook, Andy Shevchenko

[-- Attachment #1: Type: text/plain, Size: 6113 bytes --]

Hi Chris,

I love your patch! Yet something to improve:

[auto build test ERROR on jeyu/modules-next]
[also build test ERROR on linux/master soc/for-next openrisc/for-next powerpc/next uml/linux-next asm-generic/master driver-core/driver-core-testing linus/master v5.13-rc6 next-20210617]
[cannot apply to tip/x86/core]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Chris-Down/printk-Userspace-format-indexing-support/20210617-101450
base:   https://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux.git modules-next
config: ia64-randconfig-s031-20210618 (attached as .config)
compiler: ia64-linux-gcc (GCC) 9.3.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # apt-get install sparse
        # sparse version: v0.6.3-341-g8af24329-dirty
        # https://github.com/0day-ci/linux/commit/819166a91ddffdbf04d0b4e6905a5ab3b568194f
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Chris-Down/printk-Userspace-format-indexing-support/20210617-101450
        git checkout 819166a91ddffdbf04d0b4e6905a5ab3b568194f
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' W=1 ARCH=ia64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   In file included from include/linux/kernel.h:17,
                    from include/asm-generic/bug.h:20,
                    from arch/ia64/include/asm/bug.h:17,
                    from include/linux/bug.h:5,
                    from include/linux/page-flags.h:10,
                    from kernel/bounds.c:10:
>> include/linux/printk.h:219:5: error: static declaration of '_printk' follows non-static declaration
     219 | int _printk(const char *s, ...)
         |     ^~~~~~~
   In file included from arch/ia64/include/uapi/asm/intrinsics.h:22,
                    from arch/ia64/include/asm/intrinsics.h:11,
                    from arch/ia64/include/asm/bitops.h:19,
                    from include/linux/bitops.h:32,
                    from include/linux/kernel.h:12,
                    from include/asm-generic/bug.h:20,
                    from arch/ia64/include/asm/bug.h:17,
                    from include/linux/bug.h:5,
                    from include/linux/page-flags.h:10,
                    from kernel/bounds.c:10:
   arch/ia64/include/uapi/asm/cmpxchg.h:142:14: note: previous declaration of '_printk' was here
     142 |   extern int _printk(const char *fmt, ...);  \
         |              ^~~~~~~
   arch/ia64/include/asm/bitops.h:309:3: note: in expansion of macro 'CMPXCHG_BUGCHECK'
     309 |   CMPXCHG_BUGCHECK(m);
         |   ^~~~~~~~~~~~~~~~
--
   In file included from include/linux/kernel.h:17,
                    from include/asm-generic/bug.h:20,
                    from arch/ia64/include/asm/bug.h:17,
                    from include/linux/bug.h:5,
                    from include/linux/page-flags.h:10,
                    from kernel/bounds.c:10:
>> include/linux/printk.h:219:5: error: static declaration of '_printk' follows non-static declaration
     219 | int _printk(const char *s, ...)
         |     ^~~~~~~
   In file included from arch/ia64/include/uapi/asm/intrinsics.h:22,
                    from arch/ia64/include/asm/intrinsics.h:11,
                    from arch/ia64/include/asm/bitops.h:19,
                    from include/linux/bitops.h:32,
                    from include/linux/kernel.h:12,
                    from include/asm-generic/bug.h:20,
                    from arch/ia64/include/asm/bug.h:17,
                    from include/linux/bug.h:5,
                    from include/linux/page-flags.h:10,
                    from kernel/bounds.c:10:
   arch/ia64/include/uapi/asm/cmpxchg.h:142:14: note: previous declaration of '_printk' was here
     142 |   extern int _printk(const char *fmt, ...);  \
         |              ^~~~~~~
   arch/ia64/include/asm/bitops.h:309:3: note: in expansion of macro 'CMPXCHG_BUGCHECK'
     309 |   CMPXCHG_BUGCHECK(m);
         |   ^~~~~~~~~~~~~~~~
   make[2]: *** [scripts/Makefile.build:117: kernel/bounds.s] Error 1
   make[2]: Target '__build' not remade because of errors.
   make[1]: *** [Makefile:1227: prepare0] Error 2
   make[1]: Target 'prepare' not remade because of errors.
   make: *** [Makefile:215: __sub-make] Error 2
   make: Target 'prepare' not remade because of errors.


vim +/_printk +219 include/linux/printk.h

   201	
   202	char *log_buf_addr_get(void);
   203	u32 log_buf_len_get(void);
   204	void log_buf_vmcoreinfo_setup(void);
   205	void __init setup_log_buf(int early);
   206	__printf(1, 2) void dump_stack_set_arch_desc(const char *fmt, ...);
   207	void dump_stack_print_info(const char *log_lvl);
   208	void show_regs_print_info(const char *log_lvl);
   209	extern asmlinkage void dump_stack(void) __cold;
   210	extern void printk_safe_flush(void);
   211	extern void printk_safe_flush_on_panic(void);
   212	#else
   213	static inline __printf(1, 0)
   214	int vprintk(const char *s, va_list args)
   215	{
   216		return 0;
   217	}
   218	static inline __printf(1, 2) __cold
 > 219	int _printk(const char *s, ...)
   220	{
   221		return 0;
   222	}
   223	static inline __printf(1, 2) __cold
   224	int _printk_deferred(const char *s, ...)
   225	{
   226		return 0;
   227	}
   228	static inline int printk_ratelimit(void)
   229	{
   230		return 0;
   231	}
   232	static inline bool printk_timed_ratelimit(unsigned long *caller_jiffies,
   233						  unsigned int interval_msec)
   234	{
   235		return false;
   236	}
   237	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 27503 bytes --]

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 4/5] printk: Userspace format indexing support
  2021-06-18 11:48   ` kernel test robot
@ 2021-06-18 12:19     ` Chris Down
  2021-06-18 15:00       ` Petr Mladek
  0 siblings, 1 reply; 31+ messages in thread
From: Chris Down @ 2021-06-18 12:19 UTC (permalink / raw)
  To: kernel test robot
  Cc: linux-kernel, kbuild-all, Petr Mladek, Jessica Yu,
	Sergey Senozhatsky, John Ogness, Steven Rostedt,
	Greg Kroah-Hartman, Johannes Weiner, Kees Cook, Andy Shevchenko

kernel test robot writes:
>>> include/linux/printk.h:219:5: error: static declaration of '_printk' follows non-static declaration

This issue already exists before this patch and has done for a very long time, 
just the error message changed. Let's fix it in a different series.

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 4/5] printk: Userspace format indexing support
  2021-06-18 12:19     ` Chris Down
@ 2021-06-18 15:00       ` Petr Mladek
  0 siblings, 0 replies; 31+ messages in thread
From: Petr Mladek @ 2021-06-18 15:00 UTC (permalink / raw)
  To: Chris Down
  Cc: kernel test robot, linux-kernel, kbuild-all, Jessica Yu,
	Sergey Senozhatsky, John Ogness, Steven Rostedt,
	Greg Kroah-Hartman, Johannes Weiner, Kees Cook, Andy Shevchenko

On Fri 2021-06-18 13:19:41, Chris Down wrote:
> kernel test robot writes:
> > > > include/linux/printk.h:219:5: error: static declaration of '_printk' follows non-static declaration
> 
> This issue already exists before this patch and has done for a very long
> time, just the error message changed. Let's fix it in a different series.

It is build when CONFIG_PRINTK is not set. Do I get it correctly?
Yes, I agree that it is an older problem and we could fix it later.

Best Regards,
Petr

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 0/5] printk: Userspace format indexing support
  2021-06-17 10:10 ` [PATCH v7 0/5] printk: Userspace format indexing support Petr Mladek
  2021-06-17 12:33   ` Andy Shevchenko
  2021-06-17 12:36   ` Jessica Yu
@ 2021-06-21  8:54   ` Petr Mladek
  2021-06-23 21:08     ` Andrew Morton
  2 siblings, 1 reply; 31+ messages in thread
From: Petr Mladek @ 2021-06-21  8:54 UTC (permalink / raw)
  To: Andrew Morton, Chris Down
  Cc: linux-kernel, Jessica Yu, Sergey Senozhatsky, John Ogness,
	Steven Rostedt, Greg Kroah-Hartman, Johannes Weiner, Kees Cook,
	Andy Shevchenko, Rasmus Villemoes, kernel-team

On Thu 2021-06-17 12:10:43, Petr Mladek wrote:
> On Tue 2021-06-15 17:52:20, Chris Down wrote:
> > We have a number of systems industry-wide that have a subset of their
> > functionality that works as follows:
> > 
> > 1. Receive a message from local kmsg, serial console, or netconsole;
> > 2. Apply a set of rules to classify the message;
> > 3. Do something based on this classification (like scheduling a
> >    remediation for the machine), rinse, and repeat.
> > 
> > This provides a solution to the issue of silently changed or deleted
> > printks: we record pointers to all printk format strings known at
> > compile time into a new .printk_index section, both in vmlinux and
> > modules. At runtime, this can then be iterated by looking at
> > <debugfs>/printk/index/<module>, which emits the following format, both
> > readable by humans and able to be parsed by machines:
> > 
> >     $ head -1 vmlinux; shuf -n 5 vmlinux
> >     # <level[,flags]> filename:line function "format"
> >     <5> block/blk-settings.c:661 disk_stack_limits "%s: Warning: Device %s is misaligned\n"
> >     <4> kernel/trace/trace.c:8296 trace_create_file "Could not create tracefs '%s' entry\n"
> >     <6> arch/x86/kernel/hpet.c:144 _hpet_print_config "hpet: %s(%d):\n"
> >     <6> init/do_mounts.c:605 prepare_namespace "Waiting for root device %s...\n"
> >     <6> drivers/acpi/osl.c:1410 acpi_no_auto_serialize_setup "ACPI: auto-serialization disabled\n"
> > 
> > This mitigates the majority of cases where we have a highly-specific
> > printk which we want to match on, as we can now enumerate and check
> > whether the format changed or the printk callsite disappeared entirely
> > in userspace. This allows us to catch changes to printks we monitor
> > earlier and decide what to do about it before it becomes problematic.
> > 
> > There is no additional runtime cost for printk callers or printk itself,
> > and the assembly generated is exactly the same.
> > 
> > Chris Down (5):
> >   string_helpers: Escape double quotes in escape_special
> >   printk: Straighten out log_flags into printk_info_flags
> >   printk: Rework parse_prefix into printk_parse_prefix
> >   printk: Userspace format indexing support
> >   printk: index: Add indexing support to dev_printk
> 
> The patchset looks ready for linux-next from my POV. I could fixup the
> messages as suggested by Andy when pushing.
> 
> Well, I would still like to get acks from:
> 
>    + Andy for the 1st patch
>    + Jessica for the changes in the module loader code in 4th patch.

They provided the Acks, so that we could push it.

Andrew, this patchset depends on seq_file and string_helpers changes
that are in -mm tree:

lib-string_helpers-switch-to-use-bit-macro.patch
lib-string_helpers-move-escape_np-check-inside-else-branch-in-a-loop.patch
lib-string_helpers-drop-indentation-level-in-string_escape_mem.patch
lib-string_helpers-introduce-escape_na-for-escaping-non-ascii.patch
lib-string_helpers-introduce-escape_nap-to-escape-non-ascii-and-non-printable.patch
lib-string_helpers-allow-to-append-additional-characters-to-be-escaped.patch
lib-test-string_helpers-print-flags-in-hexadecimal-format.patch
lib-test-string_helpers-get-rid-of-trailing-comma-in-terminators.patch
lib-test-string_helpers-add-test-cases-for-new-features.patch
maintainers-add-myself-as-designated-reviewer-for-generic-string-library.patch
seq_file-introduce-seq_escape_mem.patch
seq_file-add-seq_escape_str-as-replica-of-string_escape_str.patch
seq_file-convert-seq_escape-to-use-seq_escape_str.patch
nfsd-avoid-non-flexible-api-in-seq_quote_mem.patch
seq_file-drop-unused-_escape_mem_ascii.patch


Would you mind to take this patchset via -mm tree as well, please?

You were not in CC. Should Chris send v8 with all the Acks and
you in CC?

Best Regards,
Petr

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 0/5] printk: Userspace format indexing support
  2021-06-21  8:54   ` Petr Mladek
@ 2021-06-23 21:08     ` Andrew Morton
  2021-06-25  9:35       ` Petr Mladek
  0 siblings, 1 reply; 31+ messages in thread
From: Andrew Morton @ 2021-06-23 21:08 UTC (permalink / raw)
  To: Petr Mladek
  Cc: Chris Down, linux-kernel, Jessica Yu, Sergey Senozhatsky,
	John Ogness, Steven Rostedt, Greg Kroah-Hartman, Johannes Weiner,
	Kees Cook, Andy Shevchenko, Rasmus Villemoes, kernel-team

On Mon, 21 Jun 2021 10:54:06 +0200 Petr Mladek <pmladek@suse.com> wrote:

> > Well, I would still like to get acks from:
> > 
> >    + Andy for the 1st patch
> >    + Jessica for the changes in the module loader code in 4th patch.
> 
> They provided the Acks, so that we could push it.
> 
> Andrew, this patchset depends on seq_file and string_helpers changes
> that are in -mm tree:
> 
> lib-string_helpers-switch-to-use-bit-macro.patch
> lib-string_helpers-move-escape_np-check-inside-else-branch-in-a-loop.patch
> lib-string_helpers-drop-indentation-level-in-string_escape_mem.patch
> lib-string_helpers-introduce-escape_na-for-escaping-non-ascii.patch
> lib-string_helpers-introduce-escape_nap-to-escape-non-ascii-and-non-printable.patch
> lib-string_helpers-allow-to-append-additional-characters-to-be-escaped.patch
> lib-test-string_helpers-print-flags-in-hexadecimal-format.patch
> lib-test-string_helpers-get-rid-of-trailing-comma-in-terminators.patch
> lib-test-string_helpers-add-test-cases-for-new-features.patch
> maintainers-add-myself-as-designated-reviewer-for-generic-string-library.patch
> seq_file-introduce-seq_escape_mem.patch
> seq_file-add-seq_escape_str-as-replica-of-string_escape_str.patch
> seq_file-convert-seq_escape-to-use-seq_escape_str.patch
> nfsd-avoid-non-flexible-api-in-seq_quote_mem.patch
> seq_file-drop-unused-_escape_mem_ascii.patch
> 
> 
> Would you mind to take this patchset via -mm tree as well, please?
> 
> You were not in CC. Should Chris send v8 with all the Acks and
> you in CC?

We're at -rc7, so I wouldn't be inclined to merge significant feature
work at this time.  I suggest a resend after -rc1, at which time the
above changes will be in mainline.

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 0/5] printk: Userspace format indexing support
  2021-06-23 21:08     ` Andrew Morton
@ 2021-06-25  9:35       ` Petr Mladek
  2021-07-19 13:06         ` Petr Mladek
  0 siblings, 1 reply; 31+ messages in thread
From: Petr Mladek @ 2021-06-25  9:35 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Chris Down, linux-kernel, Jessica Yu, Sergey Senozhatsky,
	John Ogness, Steven Rostedt, Greg Kroah-Hartman, Johannes Weiner,
	Kees Cook, Andy Shevchenko, Rasmus Villemoes, kernel-team

On Wed 2021-06-23 14:08:47, Andrew Morton wrote:
> On Mon, 21 Jun 2021 10:54:06 +0200 Petr Mladek <pmladek@suse.com> wrote:
> 
> > > Well, I would still like to get acks from:
> > > 
> > >    + Andy for the 1st patch
> > >    + Jessica for the changes in the module loader code in 4th patch.
> > 
> > They provided the Acks, so that we could push it.
> > 
> > Andrew, this patchset depends on seq_file and string_helpers changes
> > that are in -mm tree:
> > 
> > lib-string_helpers-switch-to-use-bit-macro.patch
> > lib-string_helpers-move-escape_np-check-inside-else-branch-in-a-loop.patch
> > lib-string_helpers-drop-indentation-level-in-string_escape_mem.patch
> > lib-string_helpers-introduce-escape_na-for-escaping-non-ascii.patch
> > lib-string_helpers-introduce-escape_nap-to-escape-non-ascii-and-non-printable.patch
> > lib-string_helpers-allow-to-append-additional-characters-to-be-escaped.patch
> > lib-test-string_helpers-print-flags-in-hexadecimal-format.patch
> > lib-test-string_helpers-get-rid-of-trailing-comma-in-terminators.patch
> > lib-test-string_helpers-add-test-cases-for-new-features.patch
> > maintainers-add-myself-as-designated-reviewer-for-generic-string-library.patch
> > seq_file-introduce-seq_escape_mem.patch
> > seq_file-add-seq_escape_str-as-replica-of-string_escape_str.patch
> > seq_file-convert-seq_escape-to-use-seq_escape_str.patch
> > nfsd-avoid-non-flexible-api-in-seq_quote_mem.patch
> > seq_file-drop-unused-_escape_mem_ascii.patch
> > 
> > 
> > Would you mind to take this patchset via -mm tree as well, please?
> > 
> > You were not in CC. Should Chris send v8 with all the Acks and
> > you in CC?
> 
> We're at -rc7, so I wouldn't be inclined to merge significant feature
> work at this time.  I suggest a resend after -rc1, at which time the
> above changes will be in mainline.

Fair enough. Let's postpone this patchset for 5.15. I am going to
push it into the printk tree after the 5.14 merge window.

Best Regards,
Petr

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 0/5] printk: Userspace format indexing support
  2021-06-25  9:35       ` Petr Mladek
@ 2021-07-19 13:06         ` Petr Mladek
  2021-07-19 13:08           ` Petr Mladek
  0 siblings, 1 reply; 31+ messages in thread
From: Petr Mladek @ 2021-07-19 13:06 UTC (permalink / raw)
  To: Chris Down
  Cc: Andrew Morton, linux-kernel, Jessica Yu, Sergey Senozhatsky,
	John Ogness, Steven Rostedt, Greg Kroah-Hartman, Johannes Weiner,
	Kees Cook, Andy Shevchenko, Rasmus Villemoes, kernel-team

On Fri 2021-06-25 11:35:06, Petr Mladek wrote:
> On Wed 2021-06-23 14:08:47, Andrew Morton wrote:
> > On Mon, 21 Jun 2021 10:54:06 +0200 Petr Mladek <pmladek@suse.com> wrote:
> > 
> > > > Well, I would still like to get acks from:
> > > > 
> > > >    + Andy for the 1st patch
> > > >    + Jessica for the changes in the module loader code in 4th patch.
> > > 
> > > They provided the Acks, so that we could push it.
> > > 
> > > Andrew, this patchset depends on seq_file and string_helpers changes
> > > that are in -mm tree:
> > > 
> > > lib-string_helpers-switch-to-use-bit-macro.patch
> > > lib-string_helpers-move-escape_np-check-inside-else-branch-in-a-loop.patch
> > > lib-string_helpers-drop-indentation-level-in-string_escape_mem.patch
> > > lib-string_helpers-introduce-escape_na-for-escaping-non-ascii.patch
> > > lib-string_helpers-introduce-escape_nap-to-escape-non-ascii-and-non-printable.patch
> > > lib-string_helpers-allow-to-append-additional-characters-to-be-escaped.patch
> > > lib-test-string_helpers-print-flags-in-hexadecimal-format.patch
> > > lib-test-string_helpers-get-rid-of-trailing-comma-in-terminators.patch
> > > lib-test-string_helpers-add-test-cases-for-new-features.patch
> > > maintainers-add-myself-as-designated-reviewer-for-generic-string-library.patch
> > > seq_file-introduce-seq_escape_mem.patch
> > > seq_file-add-seq_escape_str-as-replica-of-string_escape_str.patch
> > > seq_file-convert-seq_escape-to-use-seq_escape_str.patch
> > > nfsd-avoid-non-flexible-api-in-seq_quote_mem.patch
> > > seq_file-drop-unused-_escape_mem_ascii.patch
> > > 
> > > 
> > > Would you mind to take this patchset via -mm tree as well, please?
> > > 
> > > You were not in CC. Should Chris send v8 with all the Acks and
> > > you in CC?
> > 
> > We're at -rc7, so I wouldn't be inclined to merge significant feature
> > work at this time.  I suggest a resend after -rc1, at which time the
> > above changes will be in mainline.
> 
> Fair enough. Let's postpone this patchset for 5.15. I am going to
> push it into the printk tree after the 5.14 merge window.

The patchset has been committed into printk/linux.git, branch
for-4.14-printk-index.

I am sorry for the delay. I was partly off and partly busy.

Best Regards,
Petr

^ permalink raw reply	[flat|nested] 31+ messages in thread

* Re: [PATCH v7 0/5] printk: Userspace format indexing support
  2021-07-19 13:06         ` Petr Mladek
@ 2021-07-19 13:08           ` Petr Mladek
  0 siblings, 0 replies; 31+ messages in thread
From: Petr Mladek @ 2021-07-19 13:08 UTC (permalink / raw)
  To: Chris Down
  Cc: Andrew Morton, linux-kernel, Jessica Yu, Sergey Senozhatsky,
	John Ogness, Steven Rostedt, Greg Kroah-Hartman, Johannes Weiner,
	Kees Cook, Andy Shevchenko, Rasmus Villemoes, kernel-team

On Mon 2021-07-19 15:06:05, Petr Mladek wrote:
> On Fri 2021-06-25 11:35:06, Petr Mladek wrote:
> > On Wed 2021-06-23 14:08:47, Andrew Morton wrote:
> > > On Mon, 21 Jun 2021 10:54:06 +0200 Petr Mladek <pmladek@suse.com> wrote:
> > > 
> > > > > Well, I would still like to get acks from:
> > > > > 
> > > > >    + Andy for the 1st patch
> > > > >    + Jessica for the changes in the module loader code in 4th patch.
> > > > 
> > > > They provided the Acks, so that we could push it.
> > > > 
> > > > Andrew, this patchset depends on seq_file and string_helpers changes
> > > > that are in -mm tree:
> > > > 
> > > > lib-string_helpers-switch-to-use-bit-macro.patch
> > > > lib-string_helpers-move-escape_np-check-inside-else-branch-in-a-loop.patch
> > > > lib-string_helpers-drop-indentation-level-in-string_escape_mem.patch
> > > > lib-string_helpers-introduce-escape_na-for-escaping-non-ascii.patch
> > > > lib-string_helpers-introduce-escape_nap-to-escape-non-ascii-and-non-printable.patch
> > > > lib-string_helpers-allow-to-append-additional-characters-to-be-escaped.patch
> > > > lib-test-string_helpers-print-flags-in-hexadecimal-format.patch
> > > > lib-test-string_helpers-get-rid-of-trailing-comma-in-terminators.patch
> > > > lib-test-string_helpers-add-test-cases-for-new-features.patch
> > > > maintainers-add-myself-as-designated-reviewer-for-generic-string-library.patch
> > > > seq_file-introduce-seq_escape_mem.patch
> > > > seq_file-add-seq_escape_str-as-replica-of-string_escape_str.patch
> > > > seq_file-convert-seq_escape-to-use-seq_escape_str.patch
> > > > nfsd-avoid-non-flexible-api-in-seq_quote_mem.patch
> > > > seq_file-drop-unused-_escape_mem_ascii.patch
> > > > 
> > > > 
> > > > Would you mind to take this patchset via -mm tree as well, please?
> > > > 
> > > > You were not in CC. Should Chris send v8 with all the Acks and
> > > > you in CC?
> > > 
> > > We're at -rc7, so I wouldn't be inclined to merge significant feature
> > > work at this time.  I suggest a resend after -rc1, at which time the
> > > above changes will be in mainline.
> > 
> > Fair enough. Let's postpone this patchset for 5.15. I am going to
> > push it into the printk tree after the 5.14 merge window.
> 
> The patchset has been committed into printk/linux.git, branch
> for-4.14-printk-index.

It is actually for-5.15-printk-index

I am sorry for the confusion.

Best Regards,
Petr

^ permalink raw reply	[flat|nested] 31+ messages in thread

end of thread, other threads:[~2021-07-19 13:08 UTC | newest]

Thread overview: 31+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-15 16:52 [PATCH v7 0/5] printk: Userspace format indexing support Chris Down
2021-06-15 16:52 ` [PATCH v7 1/5] string_helpers: Escape double quotes in escape_special Chris Down
2021-06-15 21:42   ` Andy Shevchenko
2021-06-16  0:00     ` Chris Down
2021-06-16  2:05       ` Randy Dunlap
2021-06-16  8:08         ` Andy Shevchenko
2021-06-16 13:30           ` Steven Rostedt
2021-06-15 16:52 ` [PATCH v7 2/5] printk: Straighten out log_flags into printk_info_flags Chris Down
2021-06-15 16:52 ` [PATCH v7 3/5] printk: Rework parse_prefix into printk_parse_prefix Chris Down
2021-06-17  8:02   ` Petr Mladek
2021-06-15 16:52 ` [PATCH v7 4/5] printk: Userspace format indexing support Chris Down
2021-06-17  7:36   ` kernel test robot
2021-06-17  8:38     ` Andy Shevchenko
2021-06-17  9:39       ` Petr Mladek
2021-06-17 11:57       ` Chris Down
2021-06-17  9:43   ` Petr Mladek
2021-06-18 11:48   ` kernel test robot
2021-06-18 12:19     ` Chris Down
2021-06-18 15:00       ` Petr Mladek
2021-06-15 16:52 ` [PATCH v7 5/5] printk: index: Add indexing support to dev_printk Chris Down
2021-06-17 10:02   ` Petr Mladek
2021-06-17 10:10 ` [PATCH v7 0/5] printk: Userspace format indexing support Petr Mladek
2021-06-17 12:33   ` Andy Shevchenko
2021-06-17 14:50     ` Chris Down
2021-06-17 14:52       ` Chris Down
2021-06-17 12:36   ` Jessica Yu
2021-06-21  8:54   ` Petr Mladek
2021-06-23 21:08     ` Andrew Morton
2021-06-25  9:35       ` Petr Mladek
2021-07-19 13:06         ` Petr Mladek
2021-07-19 13:08           ` Petr Mladek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).