Decouple the block compatibility string from the global KHO version. Introduce a compatibility helper header (compat.h) defining utility macros for constructing subsystem compatibility strings, specifically: - KHO_SUB_COMPAT() to append sub-component compatibility strings using a semicolon separator. - KHO_COMPAT_ALIGN() to align compatibility string sizes to 8-byte boundaries.
Define the individual block compatibility string "block-v1" in block.h, and integrate it into the composite LUO compatibility string (LUO_ABI_COMPATIBLE) via the new compatibility helpers. Signed-off-by: Pasha Tatashin <[email protected]> --- include/linux/kho/abi/block.h | 4 +++- include/linux/kho/abi/compat.h | 33 +++++++++++++++++++++++++++++++++ include/linux/kho/abi/luo.h | 8 ++++++-- 3 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 include/linux/kho/abi/compat.h diff --git a/include/linux/kho/abi/block.h b/include/linux/kho/abi/block.h index d06d64b963be..95d13cf677cf 100644 --- a/include/linux/kho/abi/block.h +++ b/include/linux/kho/abi/block.h @@ -14,7 +14,7 @@ * This interface is a contract. Any modification to the structure fields, * compatible strings, or the layout of the `__packed` serialization * structures defined here constitutes a breaking change. Such changes require - * incrementing the version number in the `KHO_FDT_COMPATIBLE` string to + * incrementing the version number in the `KHO_BLOCK_COMPATIBLE` string to * prevent a new kernel from misinterpreting data from an old kernel. * * Changes are allowed provided the compatibility version is incremented; @@ -28,6 +28,8 @@ #include <asm/page.h> #include <linux/types.h> +#define KHO_BLOCK_COMPATIBLE "block-v1" + /** * KHO_BLOCK_SIZE - The size of each serialization block. * diff --git a/include/linux/kho/abi/compat.h b/include/linux/kho/abi/compat.h new file mode 100644 index 000000000000..25edd964c390 --- /dev/null +++ b/include/linux/kho/abi/compat.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2026 Google LLC. + * Pasha Tatashin <[email protected]> + */ + +#ifndef _LINUX_KHO_ABI_COMPAT_H +#define _LINUX_KHO_ABI_COMPAT_H + +#include <linux/align.h> + +/** + * KHO_SUB_COMPAT - Helper to append a sub-component compatibility string. + * @str: The compatibility string of the sub-component. + * + * Appends a KHO safe data structure compatibility string to a sub-system + * compatibility string using a semicolon ';' as a separator. + * + * NOTE: Sub-components MUST be added in strict alphabetical order to maintain + * a consistent and predictable compatibility string value. + */ +#define KHO_SUB_COMPAT(str) ";" str + +/** + * KHO_COMPAT_ALIGN - Align a compatibility string size to 8 bytes. + * @str: The compatibility string. + * + * Aligns the size of a compatibility string to an 8-byte boundary for use + * in ABI structures. + */ +#define KHO_COMPAT_ALIGN(str) ALIGN(sizeof(str), 8) + +#endif /* _LINUX_KHO_ABI_COMPAT_H */ diff --git a/include/linux/kho/abi/luo.h b/include/linux/kho/abi/luo.h index 288076de6d4a..b502670cd2a6 100644 --- a/include/linux/kho/abi/luo.h +++ b/include/linux/kho/abi/luo.h @@ -58,6 +58,7 @@ #define _LINUX_KHO_ABI_LUO_H #include <linux/align.h> +#include <linux/kho/abi/compat.h> #include <linux/kho/abi/block.h> #include <uapi/linux/liveupdate.h> @@ -65,8 +66,11 @@ * The LUO state is registered under this KHO entry name. */ #define LUO_KHO_ENTRY_NAME "LUO" -#define LUO_ABI_COMPATIBLE "luo-v5" -#define LUO_ABI_COMPAT_LEN ALIGN(sizeof(LUO_ABI_COMPATIBLE), 8) +#define LUO_ABI_COMPAT_BASE "luo-v5" +#define LUO_ABI_COMPATIBLE \ + LUO_ABI_COMPAT_BASE \ + KHO_SUB_COMPAT(KHO_BLOCK_COMPATIBLE) +#define LUO_ABI_COMPAT_LEN KHO_COMPAT_ALIGN(LUO_ABI_COMPATIBLE) /** * struct luo_ser - Centralized LUO ABI header. -- 2.53.0
