Skip to content

Commit 79ba362

Browse files
leitaokuba-moo
authored andcommitted
netconsole: Use printk context for CPU and task information
Use the CPU and task name captured at printk() time from nbcon_write_context instead of querying the current execution context. This provides accurate information about where the message originated, rather than where netconsole happens to be running. For CPU, use wctxt->cpu instead of raw_smp_processor_id(). For taskname, use wctxt->comm directly which contains the task name captured at printk time. This change ensures netconsole outputs reflect the actual context that generated the log message, which is especially important when the console driver runs asynchronously in a dedicated thread. Reviewed-by: John Ogness <john.ogness@linutronix.de> Reviewed-by: Petr Mladek <pmladek@suse.com> Signed-off-by: Breno Leitao <leitao@debian.org> Link: https://patch.msgid.link/20260206-nbcon-v7-4-62bda69b1b41@debian.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 7eab73b commit 79ba362

1 file changed

Lines changed: 23 additions & 17 deletions

File tree

drivers/net/netconsole.c

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1490,18 +1490,20 @@ static void populate_configfs_item(struct netconsole_target *nt,
14901490
init_target_config_group(nt, target_name);
14911491
}
14921492

1493-
static int sysdata_append_cpu_nr(struct netconsole_target *nt, int offset)
1493+
static int sysdata_append_cpu_nr(struct netconsole_target *nt, int offset,
1494+
struct nbcon_write_context *wctxt)
14941495
{
14951496
return scnprintf(&nt->sysdata[offset],
14961497
MAX_EXTRADATA_ENTRY_LEN, " cpu=%u\n",
1497-
raw_smp_processor_id());
1498+
wctxt->cpu);
14981499
}
14991500

1500-
static int sysdata_append_taskname(struct netconsole_target *nt, int offset)
1501+
static int sysdata_append_taskname(struct netconsole_target *nt, int offset,
1502+
struct nbcon_write_context *wctxt)
15011503
{
15021504
return scnprintf(&nt->sysdata[offset],
15031505
MAX_EXTRADATA_ENTRY_LEN, " taskname=%s\n",
1504-
current->comm);
1506+
wctxt->comm);
15051507
}
15061508

15071509
static int sysdata_append_release(struct netconsole_target *nt, int offset)
@@ -1522,18 +1524,20 @@ static int sysdata_append_msgid(struct netconsole_target *nt, int offset)
15221524
/*
15231525
* prepare_sysdata - append sysdata in runtime
15241526
* @nt: target to send message to
1527+
* @wctxt: nbcon write context containing message metadata
15251528
*/
1526-
static int prepare_sysdata(struct netconsole_target *nt)
1529+
static int prepare_sysdata(struct netconsole_target *nt,
1530+
struct nbcon_write_context *wctxt)
15271531
{
15281532
int sysdata_len = 0;
15291533

15301534
if (!nt->sysdata_fields)
15311535
goto out;
15321536

15331537
if (nt->sysdata_fields & SYSDATA_CPU_NR)
1534-
sysdata_len += sysdata_append_cpu_nr(nt, sysdata_len);
1538+
sysdata_len += sysdata_append_cpu_nr(nt, sysdata_len, wctxt);
15351539
if (nt->sysdata_fields & SYSDATA_TASKNAME)
1536-
sysdata_len += sysdata_append_taskname(nt, sysdata_len);
1540+
sysdata_len += sysdata_append_taskname(nt, sysdata_len, wctxt);
15371541
if (nt->sysdata_fields & SYSDATA_RELEASE)
15381542
sysdata_len += sysdata_append_release(nt, sysdata_len);
15391543
if (nt->sysdata_fields & SYSDATA_MSGID)
@@ -1831,31 +1835,33 @@ static void send_msg_fragmented(struct netconsole_target *nt,
18311835
/**
18321836
* send_ext_msg_udp - send extended log message to target
18331837
* @nt: target to send message to
1834-
* @msg: extended log message to send
1835-
* @msg_len: length of message
1838+
* @wctxt: nbcon write context containing message and metadata
18361839
*
1837-
* Transfer extended log @msg to @nt. If @msg is longer than
1840+
* Transfer extended log message to @nt. If message is longer than
18381841
* MAX_PRINT_CHUNK, it'll be split and transmitted in multiple chunks with
18391842
* ncfrag header field added to identify them.
18401843
*/
1841-
static void send_ext_msg_udp(struct netconsole_target *nt, const char *msg,
1842-
int msg_len)
1844+
static void send_ext_msg_udp(struct netconsole_target *nt,
1845+
struct nbcon_write_context *wctxt)
18431846
{
18441847
int userdata_len = 0;
18451848
int release_len = 0;
18461849
int sysdata_len = 0;
1850+
int len;
18471851

18481852
#ifdef CONFIG_NETCONSOLE_DYNAMIC
1849-
sysdata_len = prepare_sysdata(nt);
1853+
sysdata_len = prepare_sysdata(nt, wctxt);
18501854
userdata_len = nt->userdata_length;
18511855
#endif
18521856
if (nt->release)
18531857
release_len = strlen(init_utsname()->release) + 1;
18541858

1855-
if (msg_len + release_len + sysdata_len + userdata_len <= MAX_PRINT_CHUNK)
1856-
return send_msg_no_fragmentation(nt, msg, msg_len, release_len);
1859+
len = wctxt->len + release_len + sysdata_len + userdata_len;
1860+
if (len <= MAX_PRINT_CHUNK)
1861+
return send_msg_no_fragmentation(nt, wctxt->outbuf,
1862+
wctxt->len, release_len);
18571863

1858-
return send_msg_fragmented(nt, msg, msg_len, release_len,
1864+
return send_msg_fragmented(nt, wctxt->outbuf, wctxt->len, release_len,
18591865
sysdata_len);
18601866
}
18611867

@@ -1900,7 +1906,7 @@ static void netconsole_write(struct nbcon_write_context *wctxt, bool extended)
19001906
return;
19011907

19021908
if (extended)
1903-
send_ext_msg_udp(nt, wctxt->outbuf, wctxt->len);
1909+
send_ext_msg_udp(nt, wctxt);
19041910
else
19051911
send_msg_udp(nt, wctxt->outbuf, wctxt->len);
19061912

0 commit comments

Comments
 (0)