* [PATCH v3 0/2] kho: history: track previous kernel version and kexec boot count
@ 2026-01-08 16:40 Breno Leitao
2026-01-08 16:40 ` [PATCH v3 1/2] kho: history: track previous kernel version Breno Leitao
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Breno Leitao @ 2026-01-08 16:40 UTC (permalink / raw)
To: Alexander Graf, Mike Rapoport, Pasha Tatashin, Pratyush Yadav
Cc: linux-kernel, kexec, linux-mm, usamaarif642, rmikey, clm, riel,
Breno Leitao, kernel-team
Use Kexec Handover (KHO) to pass the previous kernel's version string
and the number of kexec reboots since the last cold boot to the next
kernel, and print it at boot time.
Example
=======
[ 0.000000] Linux version 6.19.0-rc3-upstream-00047-ge5d992347849
...
[ 0.000000] KHO: exec from: 6.19.0-rc4-next-20260107upstream-00004-g3071b0dc4498 (count 1)
Motivation
==========
Bugs that only reproduce when kexecing from specific kernel versions
are difficult to diagnose. These issues occur when a buggy kernel
kexecs into a new kernel, with the bug manifesting only in the second
kernel.
Recent examples include:
* eb2266312507 ("x86/boot: Fix page table access in 5-level to 4-level paging transition")
* 77d48d39e991 ("efistub/tpm: Use ACPI reclaim memory for event log to avoid corruption")
* 64b45dd46e15 ("x86/efi: skip memattr table on kexec boot")
As kexec-based reboots become more common, these version-dependent bugs
are appearing more frequently. At scale, correlating crashes to the
previous kernel version is challenging, especially when issues only
occur in specific transition scenarios.
Some bugs manifest only after multiple consecutive kexec reboots.
Tracking the kexec count helps identify these cases (this metric is
already used by live update sub-system).
KHO provides a reliable mechanism to pass information between kernels.
By carrying the previous kernel's release string and kexec count
forward, we can print this context at boot time to aid debugging.
The goal of this feature is to have this information being printed in
early boot, so, users can trace back kernel releases in kexec. Systemd
is not helpful because we cannot assume that the previous kernel has
systemd or even write access to the disk (common when using Linux as
bootloaders)
Signed-off-by: Breno Leitao <leitao@debian.org>
---
Changes from v1 to RFC
- Track the number of kexecs since cold boot (Pasha)
- Change the printk() order compared to KHO
- Rewording of the commit summary
- Link to RFC: https://patch.msgid.link/20251230-kho-v1-1-4d795a24da9e@debian.org
---
Changes in v3:
- Remove the extra CONFIG for this feature.
- Reworded some identifiers, properties and printks.
- Better documented the questions raised during v2.
- Link to v2: https://patch.msgid.link/20260102-kho-v2-0-1747b1a3a1d6@debian.org
---
Breno Leitao (2):
kho: history: track previous kernel version
kho: history: track kexec boot counter
include/linux/kho/abi/kexec_handover.h | 6 ++++++
kernel/liveupdate/kexec_handover.c | 39 +++++++++++++++++++++++++++++++++-
2 files changed, 44 insertions(+), 1 deletion(-)
---
base-commit: 5eec2b2e1f37acff8b926d2494eadaeef59be279
change-id: 20251230-kho-7707e8a2ef1e
Best regards,
--
Breno Leitao <leitao@debian.org>
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v3 1/2] kho: history: track previous kernel version
2026-01-08 16:40 [PATCH v3 0/2] kho: history: track previous kernel version and kexec boot count Breno Leitao
@ 2026-01-08 16:40 ` Breno Leitao
2026-01-08 16:40 ` [PATCH v3 2/2] kho: history: track kexec boot counter Breno Leitao
2026-01-09 1:45 ` [PATCH v3 0/2] kho: history: track previous kernel version and kexec boot count SeongJae Park
2 siblings, 0 replies; 5+ messages in thread
From: Breno Leitao @ 2026-01-08 16:40 UTC (permalink / raw)
To: Alexander Graf, Mike Rapoport, Pasha Tatashin, Pratyush Yadav
Cc: linux-kernel, kexec, linux-mm, usamaarif642, rmikey, clm, riel,
Breno Leitao, kernel-team
Store and display the kernel version from the previous kexec boot.
The current kernel's release string is saved to the "previous-release"
property in the KHO FDT before kexec. On the next boot, if this property
exists, the previous kernel version is retrieved and printed during
early boot.
This helps diagnose bugs that only manifest when kexecing from specific
kernel versions, making it easier to correlate crashes with the kernel
that initiated the kexec.
Signed-off-by: Breno Leitao <leitao@debian.org>
---
include/linux/kho/abi/kexec_handover.h | 3 +++
kernel/liveupdate/kexec_handover.c | 25 ++++++++++++++++++++++++-
2 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/include/linux/kho/abi/kexec_handover.h b/include/linux/kho/abi/kexec_handover.h
index 285eda8a36e4..f4f31e8f575b 100644
--- a/include/linux/kho/abi/kexec_handover.h
+++ b/include/linux/kho/abi/kexec_handover.h
@@ -84,6 +84,9 @@
/* The FDT property for sub-FDTs. */
#define KHO_FDT_SUB_TREE_PROP_NAME "fdt"
+/* The FDT property to track previous kernel (kexec caller) */
+#define KHO_PROP_PREVIOUS_RELEASE "previous-release"
+
/**
* DOC: Kexec Handover ABI for vmalloc Preservation
*
diff --git a/kernel/liveupdate/kexec_handover.c b/kernel/liveupdate/kexec_handover.c
index 3cf2dc6840c9..b2d57868d22f 100644
--- a/kernel/liveupdate/kexec_handover.c
+++ b/kernel/liveupdate/kexec_handover.c
@@ -22,6 +22,7 @@
#include <linux/page-isolation.h>
#include <linux/unaligned.h>
#include <linux/vmalloc.h>
+#include <linux/utsname.h>
#include <asm/early_ioremap.h>
@@ -1246,6 +1247,7 @@ struct kho_in {
phys_addr_t fdt_phys;
phys_addr_t scratch_phys;
phys_addr_t mem_map_phys;
+ char previous_release[__NEW_UTS_LEN + 1];
struct kho_debugfs dbg;
};
@@ -1325,6 +1327,8 @@ static __init int kho_out_fdt_setup(void)
err |= fdt_property_string(root, "compatible", KHO_FDT_COMPATIBLE);
err |= fdt_property(root, KHO_FDT_MEMORY_MAP_PROP_NAME, &empty_mem_map,
sizeof(empty_mem_map));
+ err |= fdt_property_string(root, KHO_PROP_PREVIOUS_RELEASE,
+ init_uts_ns.name.release);
err |= fdt_end_node(root);
err |= fdt_finish(root);
@@ -1436,6 +1440,22 @@ void __init kho_memory_init(void)
}
}
+static int __init kho_print_previous_kernel(const void *fdt)
+{
+ const char *prev_release;
+ int len;
+
+ prev_release = fdt_getprop(fdt, 0, KHO_PROP_PREVIOUS_RELEASE, &len);
+ if (!prev_release || len <= 0)
+ return -ENOENT;
+
+ strscpy(kho_in.previous_release, prev_release,
+ sizeof(kho_in.previous_release));
+ pr_info("exec from: %s\n", kho_in.previous_release);
+
+ return 0;
+}
+
void __init kho_populate(phys_addr_t fdt_phys, u64 fdt_len,
phys_addr_t scratch_phys, u64 scratch_len)
{
@@ -1513,7 +1533,10 @@ void __init kho_populate(phys_addr_t fdt_phys, u64 fdt_len,
kho_in.scratch_phys = scratch_phys;
kho_in.mem_map_phys = mem_map_phys;
kho_scratch_cnt = scratch_cnt;
- pr_info("found kexec handover data.\n");
+
+ if (kho_print_previous_kernel(fdt))
+ /* Fallback message when previous kernel info unavailable */
+ pr_info("found kexec handover data.\n");
out:
if (fdt)
--
2.47.3
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v3 2/2] kho: history: track kexec boot counter
2026-01-08 16:40 [PATCH v3 0/2] kho: history: track previous kernel version and kexec boot count Breno Leitao
2026-01-08 16:40 ` [PATCH v3 1/2] kho: history: track previous kernel version Breno Leitao
@ 2026-01-08 16:40 ` Breno Leitao
2026-01-09 1:45 ` [PATCH v3 0/2] kho: history: track previous kernel version and kexec boot count SeongJae Park
2 siblings, 0 replies; 5+ messages in thread
From: Breno Leitao @ 2026-01-08 16:40 UTC (permalink / raw)
To: Alexander Graf, Mike Rapoport, Pasha Tatashin, Pratyush Yadav
Cc: linux-kernel, kexec, linux-mm, usamaarif642, rmikey, clm, riel,
Breno Leitao, kernel-team
Track and display the number of kexec boots since the last cold reboot.
This extends the previous kernel release tracking by adding a counter
that increments with each kexec boot. The counter provides visibility
into the kexec chain depth, which is useful for understanding boot
history in production environments.
Add a new property "kexec-count" in KHO FDT alongside the existing
"previous-release" property. The counter is:
- Initialized to 0 on cold boot (when kho_in is first instantiated)
- Incremented by 1 on each subsequent kexec
- Printed alongside the previous kernel release version
The counter is stored as a 32-bit unsigned integer in FDT format.
This is different than counter for LUO, given KHO can be used
independently from LUO.
Also WARN() if KHO_PROP_PREVIOUS_RELEASE doesn't exist, because it
must exist if KHO_PROP_PREVIOUS_RELEASE exists.
Signed-off-by: Breno Leitao <leitao@debian.org>
Suggested-by: Pasha Tatashin <pasha.tatashin@soleen.com>
---
include/linux/kho/abi/kexec_handover.h | 3 +++
kernel/liveupdate/kexec_handover.c | 16 +++++++++++++++-
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/include/linux/kho/abi/kexec_handover.h b/include/linux/kho/abi/kexec_handover.h
index f4f31e8f575b..9c4fc4c6a212 100644
--- a/include/linux/kho/abi/kexec_handover.h
+++ b/include/linux/kho/abi/kexec_handover.h
@@ -87,6 +87,9 @@
/* The FDT property to track previous kernel (kexec caller) */
#define KHO_PROP_PREVIOUS_RELEASE "previous-release"
+/* The FDT property to track number of kexec counts so far */
+#define KHO_PROP_KEXEC_COUNT "kexec-count"
+
/**
* DOC: Kexec Handover ABI for vmalloc Preservation
*
diff --git a/kernel/liveupdate/kexec_handover.c b/kernel/liveupdate/kexec_handover.c
index b2d57868d22f..34cfc98076b8 100644
--- a/kernel/liveupdate/kexec_handover.c
+++ b/kernel/liveupdate/kexec_handover.c
@@ -1248,6 +1248,7 @@ struct kho_in {
phys_addr_t scratch_phys;
phys_addr_t mem_map_phys;
char previous_release[__NEW_UTS_LEN + 1];
+ u32 kexec_count;
struct kho_debugfs dbg;
};
@@ -1319,6 +1320,7 @@ static __init int kho_out_fdt_setup(void)
{
void *root = kho_out.fdt;
u64 empty_mem_map = 0;
+ u32 kexec_count;
int err;
err = fdt_create(root, PAGE_SIZE);
@@ -1329,6 +1331,10 @@ static __init int kho_out_fdt_setup(void)
sizeof(empty_mem_map));
err |= fdt_property_string(root, KHO_PROP_PREVIOUS_RELEASE,
init_uts_ns.name.release);
+ /* kho_in.kexec_count is set to 0 on cold boot */
+ kexec_count = kho_in.kexec_count + 1;
+ err |= fdt_property(root, KHO_PROP_KEXEC_COUNT, &kexec_count,
+ sizeof(kexec_count));
err |= fdt_end_node(root);
err |= fdt_finish(root);
@@ -1443,15 +1449,23 @@ void __init kho_memory_init(void)
static int __init kho_print_previous_kernel(const void *fdt)
{
const char *prev_release;
+ const u32 *count_ptr;
int len;
prev_release = fdt_getprop(fdt, 0, KHO_PROP_PREVIOUS_RELEASE, &len);
if (!prev_release || len <= 0)
return -ENOENT;
+ /* Read the kexec count from the previous kernel */
+ count_ptr = fdt_getprop(fdt, 0, KHO_PROP_KEXEC_COUNT, &len);
+ if (WARN_ON(!count_ptr || len != sizeof(u32)))
+ return -ENOENT;
+ kho_in.kexec_count = *count_ptr;
+
strscpy(kho_in.previous_release, prev_release,
sizeof(kho_in.previous_release));
- pr_info("exec from: %s\n", kho_in.previous_release);
+ pr_info("exec from: %s (count %u)\n", kho_in.previous_release,
+ kho_in.kexec_count);
return 0;
}
--
2.47.3
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v3 0/2] kho: history: track previous kernel version and kexec boot count
2026-01-08 16:40 [PATCH v3 0/2] kho: history: track previous kernel version and kexec boot count Breno Leitao
2026-01-08 16:40 ` [PATCH v3 1/2] kho: history: track previous kernel version Breno Leitao
2026-01-08 16:40 ` [PATCH v3 2/2] kho: history: track kexec boot counter Breno Leitao
@ 2026-01-09 1:45 ` SeongJae Park
2026-01-09 11:00 ` Breno Leitao
2 siblings, 1 reply; 5+ messages in thread
From: SeongJae Park @ 2026-01-09 1:45 UTC (permalink / raw)
To: Breno Leitao
Cc: SeongJae Park, Alexander Graf, Mike Rapoport, Pasha Tatashin,
Pratyush Yadav, linux-kernel, kexec, linux-mm, usamaarif642,
rmikey, clm, riel, kernel-team
On Thu, 08 Jan 2026 08:40:57 -0800 Breno Leitao <leitao@debian.org> wrote:
> Use Kexec Handover (KHO) to pass the previous kernel's version string
> and the number of kexec reboots since the last cold boot to the next
> kernel, and print it at boot time.
>
> Example
> =======
> [ 0.000000] Linux version 6.19.0-rc3-upstream-00047-ge5d992347849
> ...
> [ 0.000000] KHO: exec from: 6.19.0-rc4-next-20260107upstream-00004-g3071b0dc4498 (count 1)
Nit. The above snippet uses tabs for first two lines, while the third line
uses spaces. I don't really mind this of course, please feel free to ignore.
I just wanted to prove I did read your cover letter ;)
>
> Motivation
> ==========
>
> Bugs that only reproduce when kexecing from specific kernel versions
> are difficult to diagnose. These issues occur when a buggy kernel
> kexecs into a new kernel, with the bug manifesting only in the second
> kernel.
>
> Recent examples include:
>
> * eb2266312507 ("x86/boot: Fix page table access in 5-level to 4-level paging transition")
> * 77d48d39e991 ("efistub/tpm: Use ACPI reclaim memory for event log to avoid corruption")
> * 64b45dd46e15 ("x86/efi: skip memattr table on kexec boot")
>
> As kexec-based reboots become more common, these version-dependent bugs
> are appearing more frequently. At scale, correlating crashes to the
> previous kernel version is challenging, especially when issues only
> occur in specific transition scenarios.
>
> Some bugs manifest only after multiple consecutive kexec reboots.
> Tracking the kexec count helps identify these cases (this metric is
> already used by live update sub-system).
>
> KHO provides a reliable mechanism to pass information between kernels.
> By carrying the previous kernel's release string and kexec count
> forward, we can print this context at boot time to aid debugging.
>
> The goal of this feature is to have this information being printed in
> early boot, so, users can trace back kernel releases in kexec. Systemd
> is not helpful because we cannot assume that the previous kernel has
> systemd or even write access to the disk (common when using Linux as
> bootloaders)
Sounds this feature will be useful! Thank you for detailed cover letter.
>
> Signed-off-by: Breno Leitao <leitao@debian.org>
The patches also look good to me. For the series,
Acked-by: SeongJae Park <sj@kernel.org>
> ---
> Changes from v1 to RFC
Nit. You mean "from RFC (v1) to v2"? Again, I don't really mind this trivial
thing, so please feel free to ignore.
> - Track the number of kexecs since cold boot (Pasha)
> - Change the printk() order compared to KHO
> - Rewording of the commit summary
> - Link to RFC: https://patch.msgid.link/20251230-kho-v1-1-4d795a24da9e@debian.org
>
> ---
> Changes in v3:
> - Remove the extra CONFIG for this feature.
> - Reworded some identifiers, properties and printks.
> - Better documented the questions raised during v2.
> - Link to v2: https://patch.msgid.link/20260102-kho-v2-0-1747b1a3a1d6@debian.org
Thanks,
SJ
[...]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v3 0/2] kho: history: track previous kernel version and kexec boot count
2026-01-09 1:45 ` [PATCH v3 0/2] kho: history: track previous kernel version and kexec boot count SeongJae Park
@ 2026-01-09 11:00 ` Breno Leitao
0 siblings, 0 replies; 5+ messages in thread
From: Breno Leitao @ 2026-01-09 11:00 UTC (permalink / raw)
To: SeongJae Park
Cc: Alexander Graf, Mike Rapoport, Pasha Tatashin, Pratyush Yadav,
linux-kernel, kexec, linux-mm, usamaarif642, rmikey, clm, riel,
kernel-team
Hello SJ,
On Thu, Jan 08, 2026 at 05:45:58PM -0800, SeongJae Park wrote:
> On Thu, 08 Jan 2026 08:40:57 -0800 Breno Leitao <leitao@debian.org> wrote:
>
> > Use Kexec Handover (KHO) to pass the previous kernel's version string
> > and the number of kexec reboots since the last cold boot to the next
> > kernel, and print it at boot time.
> >
> > Example
> > =======
> > [ 0.000000] Linux version 6.19.0-rc3-upstream-00047-ge5d992347849
> > ...
> > [ 0.000000] KHO: exec from: 6.19.0-rc4-next-20260107upstream-00004-g3071b0dc4498 (count 1)
>
> Nit. The above snippet uses tabs for first two lines, while the third line
> uses spaces. I don't really mind this of course, please feel free to ignore.
> I just wanted to prove I did read your cover letter ;)
Thanks for reading it very carefully.
[...]
> Sounds this feature will be useful! Thank you for detailed cover letter.
>
> > Signed-off-by: Breno Leitao <leitao@debian.org>
>
> The patches also look good to me. For the series,
>
> Acked-by: SeongJae Park <sj@kernel.org>
>
> > ---
> > Changes from v1 to RFC
>
> Nit. You mean "from RFC (v1) to v2"? Again, I don't really mind this trivial
> thing, so please feel free to ignore.
Ack, my fault here. I am using b4, and I need to learn how to deal with
RFC -> V1 ambiguity better.
If there is a need to update this patchset, I will get them fixed in the
next version.
Thanks for the review,
--breno
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-01-09 11:00 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-01-08 16:40 [PATCH v3 0/2] kho: history: track previous kernel version and kexec boot count Breno Leitao
2026-01-08 16:40 ` [PATCH v3 1/2] kho: history: track previous kernel version Breno Leitao
2026-01-08 16:40 ` [PATCH v3 2/2] kho: history: track kexec boot counter Breno Leitao
2026-01-09 1:45 ` [PATCH v3 0/2] kho: history: track previous kernel version and kexec boot count SeongJae Park
2026-01-09 11:00 ` Breno Leitao
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox