[PATCH] printk: Export log_buf_len to userland

From: Marc Aurèle La France
Date: Wed Aug 10 2022 - 16:25:20 EST


Make the kernel log's buffer size available to userland so it can be used with
`dmesg -s`.

This change is not eligible for stable@.

Please Reply-To-All.

Thanks and have a great day.

Marc.

Signed-off-by: Marc Aurèle La France <tsi@xxxxxxxxxx>

diff -aNpRruz -X /etc/diff.excludes linux-5.17.1/include/linux/printk.h devel-5.17.1/include/linux/printk.h
--- linux-5.17.1/include/linux/printk.h 2022-03-28 02:03:22.000000000 -0600
+++ devel-5.17.1/include/linux/printk.h 2022-03-28 07:14:10.803008293 -0600
@@ -318,6 +337,7 @@ extern void __printk_cpu_unlock(void);
#endif /* CONFIG_SMP */

extern int kptr_restrict;
+extern u32 log_buf_len;

/**
* pr_fmt - used by the pr_*() macros to generate the printk format string
diff -aNpRruz -X /etc/diff.excludes linux-5.17.1/kernel/printk/printk.c devel-5.17.1/kernel/printk/printk.c
--- linux-5.17.1/kernel/printk/printk.c 2022-03-28 02:03:22.000000000 -0600
+++ devel-5.17.1/kernel/printk/printk.c 2022-03-28 07:14:10.803008293 -0600
@@ -404,7 +404,7 @@ static struct latched_seq clear_seq = {
#define LOG_BUF_LEN_MAX (u32)(1 << 31)
static char __log_buf[__LOG_BUF_LEN] __aligned(LOG_ALIGN);
static char *log_buf = __log_buf;
-static u32 log_buf_len = __LOG_BUF_LEN;
+u32 log_buf_len = __LOG_BUF_LEN;

/*
* Define the average message size. This only affects the number of
diff -aNpRruz -X /etc/diff.excludes linux-5.17.1/kernel/printk/sysctl.c devel-5.17.1/kernel/printk/sysctl.c
--- linux-5.17.1/kernel/printk/sysctl.c 2022-03-28 02:03:22.000000000 -0600
+++ devel-5.17.1/kernel/printk/sysctl.c 2022-03-28 07:14:10.803008293 -0600
@@ -22,6 +22,13 @@ static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write,

static struct ctl_table printk_sysctls[] = {
{
+ .procname = "log_buf_len",
+ .data = &log_buf_len,
+ .maxlen = sizeof(u32),
+ .mode = 0444,
+ .proc_handler = proc_dointvec,
+ },
+ {
.procname = "printk",
.data = &console_loglevel,
.maxlen = 4*sizeof(int),