net: netconsole: Add continuation line prefix to userdata messages

Add a space (' ') prefix to every userdata line to match docs for
dev-kmsg. To account for this extra character in each userdata entry,
reduce userdata entry names (directory name) from 54 characters to 53.

According to the dev-kmsg docs, a space is used for subsequent lines to
mark them as continuation lines.

> A line starting with ' ', is a continuation line, adding
> key/value pairs to the log message, which provide the machine
> readable context of the message, for reliable processing in
> userspace.

Testing for this patch::

 cd /sys/kernel/config/netconsole && mkdir cmdline0
 cd cmdline0
 mkdir userdata/test && echo "hello" > userdata/test/value
 mkdir userdata/test2 && echo "hello2" > userdata/test2/value
 echo "message" > /dev/kmsg

Outputs::

 6.8.0-rc5-virtme,12,493,231373579,-;message
  test=hello
  test2=hello2

And I confirmed all testing works as expected from the original patchset

Fixes: df03f830d0 ("net: netconsole: cache userdata formatted string in netconsole_target")
Signed-off-by: Matthew Wood <thepacketgeek@gmail.com>
Reviewed-by: Breno Leitao <leitao@debian.org>
Link: https://lore.kernel.org/r/20240308002525.248672-1-thepacketgeek@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Matthew Wood 2024-03-07 16:25:24 -08:00 committed by Jakub Kicinski
parent 031a239c22
commit 2b39535859
2 changed files with 11 additions and 9 deletions

View File

@ -180,7 +180,7 @@ Custom user data can be appended to the end of messages with netconsole
dynamic configuration enabled. User data entries can be modified without dynamic configuration enabled. User data entries can be modified without
changing the "enabled" attribute of a target. changing the "enabled" attribute of a target.
Directories (keys) under `userdata` are limited to 54 character length, and Directories (keys) under `userdata` are limited to 53 character length, and
data in `userdata/<key>/value` are limited to 200 bytes:: data in `userdata/<key>/value` are limited to 200 bytes::
cd /sys/kernel/config/netconsole && mkdir cmdline0 cd /sys/kernel/config/netconsole && mkdir cmdline0
@ -197,8 +197,8 @@ Messages will now include this additional user data::
Sends:: Sends::
12,607,22085407756,-;This is a message 12,607,22085407756,-;This is a message
foo=bar foo=bar
qux=baz qux=baz
Preview the userdata that will be appended with:: Preview the userdata that will be appended with::
@ -218,7 +218,7 @@ The `qux` key is omitted since it has no value::
echo "This is a message" > /dev/kmsg echo "This is a message" > /dev/kmsg
12,607,22085407756,-;This is a message 12,607,22085407756,-;This is a message
foo=bar foo=bar
Delete `userdata` entries with `rmdir`:: Delete `userdata` entries with `rmdir`::

View File

@ -42,12 +42,14 @@ MODULE_AUTHOR("Maintainer: Matt Mackall <mpm@selenic.com>");
MODULE_DESCRIPTION("Console driver for network interfaces"); MODULE_DESCRIPTION("Console driver for network interfaces");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
#define MAX_PARAM_LENGTH 256 #define MAX_PARAM_LENGTH 256
#define MAX_USERDATA_NAME_LENGTH 54
#define MAX_USERDATA_VALUE_LENGTH 200
#define MAX_USERDATA_ENTRY_LENGTH 256 #define MAX_USERDATA_ENTRY_LENGTH 256
#define MAX_USERDATA_VALUE_LENGTH 200
/* The number 3 comes from userdata entry format characters (' ', '=', '\n') */
#define MAX_USERDATA_NAME_LENGTH (MAX_USERDATA_ENTRY_LENGTH - \
MAX_USERDATA_VALUE_LENGTH - 3)
#define MAX_USERDATA_ITEMS 16 #define MAX_USERDATA_ITEMS 16
#define MAX_PRINT_CHUNK 1000 #define MAX_PRINT_CHUNK 1000
static char config[MAX_PARAM_LENGTH]; static char config[MAX_PARAM_LENGTH];
module_param_string(netconsole, config, MAX_PARAM_LENGTH, 0); module_param_string(netconsole, config, MAX_PARAM_LENGTH, 0);
@ -671,7 +673,7 @@ static void update_userdata(struct netconsole_target *nt)
* checked to not exceed MAX items with child_count above * checked to not exceed MAX items with child_count above
*/ */
complete_idx += scnprintf(&nt->userdata_complete[complete_idx], complete_idx += scnprintf(&nt->userdata_complete[complete_idx],
MAX_USERDATA_ENTRY_LENGTH, "%s=%s\n", MAX_USERDATA_ENTRY_LENGTH, " %s=%s\n",
item->ci_name, udm_item->value); item->ci_name, udm_item->value);
} }
nt->userdata_length = strnlen(nt->userdata_complete, nt->userdata_length = strnlen(nt->userdata_complete,