I am submitting a series of patches that introduce a new feature for the netconsole subsystem, specifically the addition of the 'release' field to the sysdata structure. This feature allows the kernel release/version to be appended to the userdata dictionary in every message sent, enhancing the information available for debugging and monitoring purposes.
This complements the already supported release prepend feature, which was added some time ago. The release prepend appends the release information at the message header, which is not ideal for two reasons:
1) It is difficult to determine if a message includes this information, making it hard and resource-intensive to parse.
2) When a message is fragmented, the release information is appended to every message fragment, consuming valuable space in the packet.
The "release prepend" feature was created before the concept of userdata and sysdata. Now that this format has proven successful, we are implementing the release feature as part of this enhanced structure.
This patch series aims to improve the netconsole subsystem by providing a more efficient and user-friendly way to include kernel release information in messages. I believe these changes will significantly aid in system analysis and troubleshooting.
Suggested-by: Manu Bretelle chantr4@gmail.com Signed-off-by: Breno Leitao leitao@debian.org
--- Breno Leitao (6): netconsole: introduce 'release' as a new sysdata field netconsole: implement configfs for release_enabled netconsole: add 'sysdata' suffix to related functions netconsole: append release to sysdata selftests: netconsole: Add tests for 'release' feature in sysdata docs: netconsole: document release feature
Documentation/networking/netconsole.rst | 25 ++++++++ drivers/net/netconsole.c | 71 ++++++++++++++++++++-- .../selftests/drivers/net/netcons_sysdata.sh | 44 +++++++++++++- 3 files changed, 133 insertions(+), 7 deletions(-) --- base-commit: 941defcea7e11ad7ff8f0d4856716dd637d757dd change-id: 20250314-netcons_release-dc1f1f5ca0f7
Best regards,
This commit adds a new feature to the sysdata structure, allowing the kernel release/version to be appended as part of sysdata. Additionally, it updates the logic to count this new field as a used entry when enabled.
Signed-off-by: Breno Leitao leitao@debian.org --- drivers/net/netconsole.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index 098ea9eb02373..b7f7ec39e8318 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -106,6 +106,8 @@ enum sysdata_feature { SYSDATA_CPU_NR = BIT(0), /* Populate the task name (as in current->comm) in sysdata */ SYSDATA_TASKNAME = BIT(1), + /* Kernel release/version as part of sysdata */ + SYSDATA_RELEASE = BIT(2), };
/** @@ -719,6 +721,8 @@ static size_t count_extradata_entries(struct netconsole_target *nt) entries += 1; if (nt->sysdata_fields & SYSDATA_TASKNAME) entries += 1; + if (nt->sysdata_fields & SYSDATA_RELEASE) + entries += 1;
return entries; }
On Fri, Mar 14, 2025 at 10:58:45AM -0700, Breno Leitao wrote:
This commit adds a new feature to the sysdata structure, allowing the kernel release/version to be appended as part of sysdata. Additionally, it updates the logic to count this new field as a used entry when enabled.
Signed-off-by: Breno Leitao leitao@debian.org
Reviewed-by: Simon Horman horms@kernel.org
Implement the configfs helpers to show and set release_enabled configfs directories under userdata.
When enabled, set the feature bit in netconsole_target->sysdata_fields.
Signed-off-by: Breno Leitao leitao@debian.org --- drivers/net/netconsole.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+)
diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index b7f7ec39e8318..0914d29b48d8e 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -442,6 +442,19 @@ static ssize_t sysdata_taskname_enabled_show(struct config_item *item, return sysfs_emit(buf, "%d\n", taskname_enabled); }
+static ssize_t sysdata_release_enabled_show(struct config_item *item, + char *buf) +{ + struct netconsole_target *nt = to_target(item->ci_parent); + bool release_enabled; + + mutex_lock(&dynamic_netconsole_mutex); + release_enabled = !!(nt->sysdata_fields & SYSDATA_TASKNAME); + mutex_unlock(&dynamic_netconsole_mutex); + + return sysfs_emit(buf, "%d\n", release_enabled); +} + /* * This one is special -- targets created through the configfs interface * are not enabled (and the corresponding netpoll activated) by default. @@ -859,6 +872,40 @@ static void disable_sysdata_feature(struct netconsole_target *nt, nt->extradata_complete[nt->userdata_length] = 0; }
+static ssize_t sysdata_release_enabled_store(struct config_item *item, + const char *buf, size_t count) +{ + struct netconsole_target *nt = to_target(item->ci_parent); + bool release_enabled, curr; + ssize_t ret; + + ret = kstrtobool(buf, &release_enabled); + if (ret) + return ret; + + mutex_lock(&dynamic_netconsole_mutex); + curr = !!(nt->sysdata_fields & SYSDATA_RELEASE); + if (release_enabled == curr) + goto unlock_ok; + + if (release_enabled && + count_extradata_entries(nt) >= MAX_EXTRADATA_ITEMS) { + ret = -ENOSPC; + goto unlock; + } + + if (release_enabled) + nt->sysdata_fields |= SYSDATA_RELEASE; + else + disable_sysdata_feature(nt, SYSDATA_RELEASE); + +unlock_ok: + ret = strnlen(buf, count); +unlock: + mutex_unlock(&dynamic_netconsole_mutex); + return ret; +} + static ssize_t sysdata_taskname_enabled_store(struct config_item *item, const char *buf, size_t count) { @@ -939,6 +986,7 @@ static ssize_t sysdata_cpu_nr_enabled_store(struct config_item *item, CONFIGFS_ATTR(userdatum_, value); CONFIGFS_ATTR(sysdata_, cpu_nr_enabled); CONFIGFS_ATTR(sysdata_, taskname_enabled); +CONFIGFS_ATTR(sysdata_, release_enabled);
static struct configfs_attribute *userdatum_attrs[] = { &userdatum_attr_value, @@ -1000,6 +1048,7 @@ static void userdatum_drop(struct config_group *group, struct config_item *item) static struct configfs_attribute *userdata_attrs[] = { &sysdata_attr_cpu_nr_enabled, &sysdata_attr_taskname_enabled, + &sysdata_attr_release_enabled, NULL, };
On Fri, Mar 14, 2025 at 10:58:46AM -0700, Breno Leitao wrote:
Implement the configfs helpers to show and set release_enabled configfs directories under userdata.
When enabled, set the feature bit in netconsole_target->sysdata_fields.
Signed-off-by: Breno Leitao leitao@debian.org
Reviewed-by: Simon Horman horms@kernel.org
This commit appends a common "sysdata" suffix to functions responsible for appending data to sysdata.
This change enhances code clarity and prevents naming conflicts with other "append" functions, particularly in anticipation of the upcoming inclusion of the `release` field in the next patch.
Signed-off-by: Breno Leitao leitao@debian.org --- drivers/net/netconsole.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index 0914d29b48d8e..970dfc3ac9d41 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -1224,7 +1224,7 @@ static void populate_configfs_item(struct netconsole_target *nt, init_target_config_group(nt, target_name); }
-static int append_cpu_nr(struct netconsole_target *nt, int offset) +static int sysdata_append_cpu_nr(struct netconsole_target *nt, int offset) { /* Append cpu=%d at extradata_complete after userdata str */ return scnprintf(&nt->extradata_complete[offset], @@ -1232,7 +1232,7 @@ static int append_cpu_nr(struct netconsole_target *nt, int offset) raw_smp_processor_id()); }
-static int append_taskname(struct netconsole_target *nt, int offset) +static int sysdata_append_taskname(struct netconsole_target *nt, int offset) { return scnprintf(&nt->extradata_complete[offset], MAX_EXTRADATA_ENTRY_LEN, " taskname=%s\n", @@ -1256,9 +1256,9 @@ static int prepare_extradata(struct netconsole_target *nt) goto out;
if (nt->sysdata_fields & SYSDATA_CPU_NR) - extradata_len += append_cpu_nr(nt, extradata_len); + extradata_len += sysdata_append_cpu_nr(nt, extradata_len); if (nt->sysdata_fields & SYSDATA_TASKNAME) - extradata_len += append_taskname(nt, extradata_len); + extradata_len += sysdata_append_taskname(nt, extradata_len);
WARN_ON_ONCE(extradata_len > MAX_EXTRADATA_ENTRY_LEN * MAX_EXTRADATA_ITEMS);
On Fri, Mar 14, 2025 at 10:58:47AM -0700, Breno Leitao wrote:
This commit appends a common "sysdata" suffix to functions responsible for appending data to sysdata.
This change enhances code clarity and prevents naming conflicts with other "append" functions, particularly in anticipation of the upcoming inclusion of the `release` field in the next patch.
Signed-off-by: Breno Leitao leitao@debian.org
Reviewed-by: Simon Horman horms@kernel.org
Append the init_utsname()->release to sysdata buffer before sending the message in case the feature is set.
Signed-off-by: Breno Leitao leitao@debian.org --- drivers/net/netconsole.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index 970dfc3ac9d41..0a7981ef752c7 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -1238,6 +1238,14 @@ static int sysdata_append_taskname(struct netconsole_target *nt, int offset) MAX_EXTRADATA_ENTRY_LEN, " taskname=%s\n", current->comm); } + +static int sysdata_append_release(struct netconsole_target *nt, int offset) +{ + return scnprintf(&nt->extradata_complete[offset], + MAX_EXTRADATA_ENTRY_LEN, " release=%s\n", + init_utsname()->release); +} + /* * prepare_extradata - append sysdata at extradata_complete in runtime * @nt: target to send message to @@ -1259,6 +1267,8 @@ static int prepare_extradata(struct netconsole_target *nt) extradata_len += sysdata_append_cpu_nr(nt, extradata_len); if (nt->sysdata_fields & SYSDATA_TASKNAME) extradata_len += sysdata_append_taskname(nt, extradata_len); + if (nt->sysdata_fields & SYSDATA_RELEASE) + extradata_len += sysdata_append_release(nt, extradata_len);
WARN_ON_ONCE(extradata_len > MAX_EXTRADATA_ENTRY_LEN * MAX_EXTRADATA_ITEMS);
On Fri, Mar 14, 2025 at 10:58:48AM -0700, Breno Leitao wrote:
Append the init_utsname()->release to sysdata buffer before sending the message in case the feature is set.
Signed-off-by: Breno Leitao leitao@debian.org
Reviewed-by: Simon Horman horms@kernel.org
Expands the self-tests to include the 'release' feature in sysdata.
Verifies that enabling the 'release' feature appends the correct data and ensures that disabling it functions as expected.
When enabled, the message should have an item similar to in the userdata: `release=$(uname -r)`
Signed-off-by: Breno Leitao leitao@debian.org --- .../selftests/drivers/net/netcons_sysdata.sh | 44 ++++++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-)
diff --git a/tools/testing/selftests/drivers/net/netcons_sysdata.sh b/tools/testing/selftests/drivers/net/netcons_sysdata.sh index f351206ed1bda..a737e377bf085 100755 --- a/tools/testing/selftests/drivers/net/netcons_sysdata.sh +++ b/tools/testing/selftests/drivers/net/netcons_sysdata.sh @@ -42,6 +42,17 @@ function set_taskname() { echo 1 > "${NETCONS_PATH}/userdata/taskname_enabled" }
+# Enable the release to be appended to sysdata +function set_release() { + if [[ ! -f "${NETCONS_PATH}/userdata/release_enabled" ]] + then + echo "Not able to enable release sysdata append. Configfs not available in ${NETCONS_PATH}/userdata/release_enabled" >&2 + exit "${ksft_skip}" + fi + + echo 1 > "${NETCONS_PATH}/userdata/release_enabled" +} + # Disable the sysdata cpu_nr feature function unset_cpu_nr() { echo 0 > "${NETCONS_PATH}/userdata/cpu_nr_enabled" @@ -52,6 +63,10 @@ function unset_taskname() { echo 0 > "${NETCONS_PATH}/userdata/taskname_enabled" }
+function unset_release() { + echo 0 > "${NETCONS_PATH}/userdata/release_enabled" +} + # Test if MSG contains sysdata function validate_sysdata() { # OUTPUT_FILE will contain something like: @@ -93,6 +108,21 @@ function validate_sysdata() { pkill_socat }
+function validate_release() { + RELEASE=$(uname -r) + + if [ ! -f "$OUTPUT_FILE" ]; then + echo "FAIL: File was not generated." >&2 + exit "${ksft_fail}" + fi + + if ! grep -q "release=${RELEASE}" "${OUTPUT_FILE}"; then + echo "FAIL: 'release=${RELEASE}' not found in ${OUTPUT_FILE}" >&2 + cat "${OUTPUT_FILE}" >&2 + exit "${ksft_fail}" + fi +} + # Test if MSG content exists in OUTPUT_FILE but no `cpu=` and `taskname=` # strings function validate_no_sysdata() { @@ -119,6 +149,12 @@ function validate_no_sysdata() { exit "${ksft_fail}" fi
+ if grep -q "release=" "${OUTPUT_FILE}"; then + echo "FAIL: 'release= found in ${OUTPUT_FILE}" >&2 + cat "${OUTPUT_FILE}" >&2 + exit "${ksft_fail}" + fi + rm "${OUTPUT_FILE}" }
@@ -169,9 +205,11 @@ MSG="Test #1 from CPU${CPU}" set_cpu_nr # Enable taskname to be appended to sysdata set_taskname +set_release runtest # Make sure the message was received in the dst part # and exit +validate_release validate_sysdata
#==================================================== @@ -184,19 +222,19 @@ OUTPUT_FILE="/tmp/${TARGET}_2" MSG="Test #2 from CPU${CPU}" set_user_data runtest +validate_release validate_sysdata
# =================================================== # TEST #3 -# Unset cpu_nr, so, no CPU should be appended. -# userdata is still set +# Unset all sysdata, fail if any userdata is set # =================================================== CPU=$((RANDOM % $(nproc))) OUTPUT_FILE="/tmp/${TARGET}_3" MSG="Test #3 from CPU${CPU}" -# Enable the auto population of cpu_nr unset_cpu_nr unset_taskname +unset_release runtest # At this time, cpu= shouldn't be present in the msg validate_no_sysdata
On Fri, Mar 14, 2025 at 10:58:49AM -0700, Breno Leitao wrote:
Expands the self-tests to include the 'release' feature in sysdata.
Verifies that enabling the 'release' feature appends the correct data and ensures that disabling it functions as expected.
When enabled, the message should have an item similar to in the userdata: `release=$(uname -r)`
Signed-off-by: Breno Leitao leitao@debian.org
Reviewed-by: Simon Horman horms@kernel.org
Add documentation explaining the kernel release auto-population feature in netconsole.
This feature appends kernel version information to the userdata dictionary in every message sent when enabled via the `release_enabled` file in the configfs hierarchy.
Signed-off-by: Breno Leitao leitao@debian.org --- Documentation/networking/netconsole.rst | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+)
diff --git a/Documentation/networking/netconsole.rst b/Documentation/networking/netconsole.rst index ae82a6337a8d8..44f5a441cf813 100644 --- a/Documentation/networking/netconsole.rst +++ b/Documentation/networking/netconsole.rst @@ -268,6 +268,31 @@ Example:: In this example, the message was generated while "echo" was the current scheduled process.
+Kernel release auto population in userdata +------------------------------------------ + +Within the netconsole configfs hierarchy, there is a file named `release_enabled` +located in the `userdata` directory. This file controls the kernel release +(version) auto-population feature, which appends the kernel release information +to userdata dictionary in every message sent. + +To enable the release auto-population:: + + echo 1 > /sys/kernel/config/netconsole/target1/userdata/release_enabled + +Example:: + + echo "This is a message" > /dev/kmsg + 12,607,22085407756,-;This is a message + release=6.14.0-rc6-01219-g3c027fbd941d + +.. note:: + + This feature provides the same data as the "release prepend" feature. + However, in this case, the release information is appended to the userdata + dictionary rather than being included in the message header. + + CPU number auto population in userdata --------------------------------------
On Fri, Mar 14, 2025 at 10:58:50AM -0700, Breno Leitao wrote:
Add documentation explaining the kernel release auto-population feature in netconsole.
This feature appends kernel version information to the userdata dictionary in every message sent when enabled via the `release_enabled` file in the configfs hierarchy.
Signed-off-by: Breno Leitao leitao@debian.org
Reviewed-by: Simon Horman horms@kernel.org
Hello:
This series was applied to netdev/net-next.git (main) by Paolo Abeni pabeni@redhat.com:
On Fri, 14 Mar 2025 10:58:44 -0700 you wrote:
I am submitting a series of patches that introduce a new feature for the netconsole subsystem, specifically the addition of the 'release' field to the sysdata structure. This feature allows the kernel release/version to be appended to the userdata dictionary in every message sent, enhancing the information available for debugging and monitoring purposes.
[...]
Here is the summary with links: - [net-next,1/6] netconsole: introduce 'release' as a new sysdata field https://git.kernel.org/netdev/net-next/c/42211e310781 - [net-next,2/6] netconsole: implement configfs for release_enabled https://git.kernel.org/netdev/net-next/c/343f90227070 - [net-next,3/6] netconsole: add 'sysdata' suffix to related functions https://git.kernel.org/netdev/net-next/c/b92c6fc43f4e - [net-next,4/6] netconsole: append release to sysdata https://git.kernel.org/netdev/net-next/c/cfcc9239e78a - [net-next,5/6] selftests: netconsole: Add tests for 'release' feature in sysdata https://git.kernel.org/netdev/net-next/c/4b73dc83ed96 - [net-next,6/6] docs: netconsole: document release feature https://git.kernel.org/netdev/net-next/c/56ad890de2cd
You are awesome, thank you!
linux-kselftest-mirror@lists.linaro.org