* [PATCH v3 01/10] crash_dump: release keyring reference at the correct time
2026-07-29 3:36 [PATCH v3 00/10] Bug fixes and enhancements for kdump LUKS support Coiby Xu
@ 2026-07-29 3:36 ` Coiby Xu
2026-07-29 3:36 ` [PATCH v3 02/10] crash_dump: Fix potential double free and UAF of keys_header Coiby Xu
` (8 subsequent siblings)
9 siblings, 0 replies; 24+ messages in thread
From: Coiby Xu @ 2026-07-29 3:36 UTC (permalink / raw)
To: kexec
Cc: Andrew Morton, Sourabh Jain, Baoquan He, Dave Young,
Pratyush Yadav, Guangshuo Li, Coiby Xu, Bradley Morgan,
Mike Rapoport (Microsoft), Pasha Tatashin, Coiby Xu, open list
From: Guangshuo Li <lgs201920130244@gmail.com>
restore_dm_crypt_keys_to_thread_keyring() gets a reference to the user
keyring before restoring the saved dm-crypt keys.
The same keyring reference is then passed to add_key_to_keyring() for each
saved key, but add_key_to_keyring() drops that reference on every call.
This is only balanced when exactly one key is restored. With multiple
keys, the keyring reference is dropped too many times and may trigger a
refcount underflow or use-after-free.
When more than five keys are restored, a refcount underflow/use-after-free
warning can be triggered.
The early error paths after lookup_user_key() also return without dropping
the keyring reference.
Keep ownership of the keyring reference in
restore_dm_crypt_keys_to_thread_keyring(), drop it once on all exit paths,
and make add_key_to_keyring() only use the reference without consuming it.
Fixes: 62f17d9df692 ("crash_dump: retrieve dm crypt keys in kdump kernel")
Signed-off-by: Guangshuo Li <lgs201920130244@gmail.com>
Reviewed-and-tested-by: Coiby Xu <Coiby.Xu@gmail.com>
Acked-by: Baoquan He <baoquan.he@linux.dev>
Reviewed-by: Bradley Morgan <include@grrlz.net>
Link: https://patch.msgid.link/20260704112509.3717884-1-lgs201920130244@gmail.com
Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
---
kernel/crash_dump_dm_crypt.c | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
index cb875ddb6ba6..c685497cd470 100644
--- a/kernel/crash_dump_dm_crypt.c
+++ b/kernel/crash_dump_dm_crypt.c
@@ -81,7 +81,6 @@ static int add_key_to_keyring(struct dm_crypt_key *dm_key,
kexec_dprintk("Error when adding key");
}
- key_ref_put(keyring_ref);
return r;
}
@@ -104,6 +103,7 @@ static int restore_dm_crypt_keys_to_thread_keyring(void)
struct dm_crypt_key *key;
size_t keys_header_size;
key_ref_t keyring_ref;
+ int ret = 0;
u64 addr;
/* find the target keyring (which must be writable) */
@@ -118,7 +118,8 @@ static int restore_dm_crypt_keys_to_thread_keyring(void)
dm_crypt_keys_read((char *)&key_count, sizeof(key_count), &addr);
if (key_count > KEY_NUM_MAX) {
kexec_dprintk("Failed to read the number of dm-crypt keys\n");
- return -1;
+ ret = -1;
+ goto out;
}
kexec_dprintk("There are %u keys\n", key_count);
@@ -126,8 +127,10 @@ static int restore_dm_crypt_keys_to_thread_keyring(void)
keys_header_size = get_keys_header_size(key_count);
keys_header = kzalloc(keys_header_size, GFP_KERNEL);
- if (!keys_header)
- return -ENOMEM;
+ if (!keys_header) {
+ ret = -ENOMEM;
+ goto out;
+ }
dm_crypt_keys_read((char *)keys_header, keys_header_size, &addr);
@@ -137,7 +140,9 @@ static int restore_dm_crypt_keys_to_thread_keyring(void)
add_key_to_keyring(key, keyring_ref);
}
- return 0;
+out:
+ key_ref_put(keyring_ref);
+ return ret;
}
static int read_key_from_user_keyring(struct dm_crypt_key *dm_key)
--
2.55.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* [PATCH v3 02/10] crash_dump: Fix potential double free and UAF of keys_header
2026-07-29 3:36 [PATCH v3 00/10] Bug fixes and enhancements for kdump LUKS support Coiby Xu
2026-07-29 3:36 ` [PATCH v3 01/10] crash_dump: release keyring reference at the correct time Coiby Xu
@ 2026-07-29 3:36 ` Coiby Xu
2026-07-29 3:36 ` [PATCH v3 03/10] crash_dump: Disallow writing to dm-crypt configfs during kexec_file_load syscall Coiby Xu
` (7 subsequent siblings)
9 siblings, 0 replies; 24+ messages in thread
From: Coiby Xu @ 2026-07-29 3:36 UTC (permalink / raw)
To: kexec
Cc: Andrew Morton, Sourabh Jain, Baoquan He, Dave Young,
Pratyush Yadav, Mike Rapoport, Pasha Tatashin, Coiby Xu,
open list
If kexec_add_buffer somehow fails, keys_header will be freed. Depending
on /sys/kernel/config/crash_dm_crypt_key/reuse, it will lead to the
following two problems if the kexec_file_load syscall is called again,
1. Double free of keys_header if reuse=false
2. UAF of keys_header if reuse=true
To address these problems and also make it easier to reason about the
code, keep two invariants,
1. keys_header will always be freed at the end of kexec_file_load
syscall except during kdump image unloading for CPU/memory
hot-plugging support
2. There will always be valid keys_header if reuse=true
Fixes: 479e58549b0f ("crash_dump: store dm crypt keys in kdump reserved memory")
Fixes: 9ebfa8dcaea7 ("crash_dump: reuse saved dm crypt keys for CPU/memory hot-plugging")
Reported-by: Sourabh Jain <sourabhjain@linux.ibm.com>
Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
---
include/linux/kexec.h | 6 ++++
kernel/crash_dump_dm_crypt.c | 66 ++++++++++++++++++++++++++----------
kernel/kexec_file.c | 2 ++
3 files changed, 56 insertions(+), 18 deletions(-)
diff --git a/include/linux/kexec.h b/include/linux/kexec.h
index 8a22bc9b8c6c..91256d7ff434 100644
--- a/include/linux/kexec.h
+++ b/include/linux/kexec.h
@@ -552,6 +552,12 @@ void set_kexec_sig_enforced(void);
static inline void set_kexec_sig_enforced(void) {}
#endif
+#ifdef CONFIG_CRASH_DM_CRYPT
+void kexec_file_post_load_cleanup_dm_crypt(struct kimage *image);
+#else
+static inline void kexec_file_post_load_cleanup_dm_crypt(struct kimage *image) {}
+#endif
+
#endif /* !defined(__ASSEBMLY__) */
#endif /* LINUX_KEXEC_H */
diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
index c685497cd470..4335b6cb1fc4 100644
--- a/kernel/crash_dump_dm_crypt.c
+++ b/kernel/crash_dump_dm_crypt.c
@@ -84,18 +84,25 @@ static int add_key_to_keyring(struct dm_crypt_key *dm_key,
return r;
}
-static void get_keys_from_kdump_reserved_memory(void)
+static int get_keys_from_kdump_reserved_memory(void)
{
struct keys_header *keys_header_loaded;
+ size_t keys_header_size;
- arch_kexec_unprotect_crashkres();
+ keys_header_size = get_keys_header_size(key_count);
+ keys_header = kzalloc(keys_header_size, GFP_KERNEL);
+ if (!keys_header)
+ return -ENOMEM;
+ arch_kexec_unprotect_crashkres();
keys_header_loaded = kmap_local_page(pfn_to_page(
kexec_crash_image->dm_crypt_keys_addr >> PAGE_SHIFT));
- memcpy(keys_header, keys_header_loaded, get_keys_header_size(key_count));
+ memcpy(keys_header, keys_header_loaded, keys_header_size);
kunmap_local(keys_header_loaded);
arch_kexec_protect_crashkres();
+
+ return 0;
}
static int restore_dm_crypt_keys_to_thread_keyring(void)
@@ -286,17 +293,28 @@ static ssize_t config_keys_reuse_show(struct config_item *item, char *page)
static ssize_t config_keys_reuse_store(struct config_item *item,
const char *page, size_t count)
{
+ bool val;
+ int r;
+
if (!kexec_crash_image || !kexec_crash_image->dm_crypt_keys_addr) {
kexec_dprintk(
"dm-crypt keys haven't be saved to crash-reserved memory\n");
return -EINVAL;
}
- if (kstrtobool(page, &is_dm_key_reused))
+ if (kstrtobool(page, &val) || !val)
return -EINVAL;
- if (is_dm_key_reused)
- get_keys_from_kdump_reserved_memory();
+ if (is_dm_key_reused) {
+ pr_info("Already got dm-crypt keys, please continue with kexec_file_load syscall\n");
+ } else {
+ r = get_keys_from_kdump_reserved_memory();
+ if (r) {
+ pr_warn("Failed to get dm-crypt keys from reserved memory\n");
+ return r;
+ }
+ is_dm_key_reused = true;
+ }
return count;
}
@@ -369,9 +387,6 @@ static int build_keys_header(void)
struct config_key *key;
int i, r;
- if (keys_header != NULL)
- kvfree(keys_header);
-
keys_header = kzalloc(get_keys_header_size(key_count), GFP_KERNEL);
if (!keys_header)
return -ENOMEM;
@@ -415,8 +430,7 @@ int crash_load_dm_crypt_keys(struct kimage *image)
.top_down = false,
.random = true,
};
- int r;
-
+ int r = 0;
if (key_count <= 0) {
kexec_dprintk("No dm-crypt keys\n");
@@ -424,14 +438,15 @@ int crash_load_dm_crypt_keys(struct kimage *image)
}
if (!is_dm_key_reused) {
- image->dm_crypt_keys_addr = 0;
r = build_keys_header();
- if (r) {
- pr_err("Failed to build dm-crypt keys header, ret=%d\n", r);
- return r;
- }
+ if (r)
+ goto out;
}
+ /*
+ * keys_header will be copied to reserver memory later and then be
+ * cleaned up at the end of kexec_file_load syscall
+ */
kbuf.buffer = keys_header;
kbuf.bufsz = get_keys_header_size(key_count);
@@ -441,18 +456,33 @@ int crash_load_dm_crypt_keys(struct kimage *image)
r = kexec_add_buffer(&kbuf);
if (r) {
pr_err("Failed to call kexec_add_buffer, ret=%d\n", r);
- kvfree((void *)kbuf.buffer);
- return r;
+ goto out;
}
+
image->dm_crypt_keys_addr = kbuf.mem;
image->dm_crypt_keys_sz = kbuf.bufsz;
kexec_dprintk(
"Loaded dm crypt keys to kexec_buffer bufsz=0x%lx memsz=0x%lx\n",
kbuf.bufsz, kbuf.memsz);
+out:
+ is_dm_key_reused = false;
return r;
}
+void kexec_file_post_load_cleanup_dm_crypt(struct kimage *image)
+{
+ /*
+ * For CPU/memory hot-plugging, the kdump image will be reloaded. Prevent
+ * keys_header from being cleaned up during unloading when
+ * is_dm_key_reused=true
+ */
+ if (!is_dm_key_reused) {
+ kfree_sensitive(keys_header);
+ keys_header = NULL;
+ }
+}
+
static int __init configfs_dmcrypt_keys_init(void)
{
int ret;
diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
index 2bfbb2d144e6..0421f1e89791 100644
--- a/kernel/kexec_file.c
+++ b/kernel/kexec_file.c
@@ -139,6 +139,8 @@ void kimage_file_post_load_cleanup(struct kimage *image)
kfree(image->image_loader_data);
image->image_loader_data = NULL;
+ kexec_file_post_load_cleanup_dm_crypt(image);
+
kexec_file_dbg_print = false;
}
--
2.55.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* [PATCH v3 03/10] crash_dump: Disallow writing to dm-crypt configfs during kexec_file_load syscall
2026-07-29 3:36 [PATCH v3 00/10] Bug fixes and enhancements for kdump LUKS support Coiby Xu
2026-07-29 3:36 ` [PATCH v3 01/10] crash_dump: release keyring reference at the correct time Coiby Xu
2026-07-29 3:36 ` [PATCH v3 02/10] crash_dump: Fix potential double free and UAF of keys_header Coiby Xu
@ 2026-07-29 3:36 ` Coiby Xu
2026-08-05 10:30 ` Sourabh Jain
2026-07-29 3:36 ` [PATCH v3 04/10] crash_dump: Read the number of dm-crypt keys from reserved memory Coiby Xu
` (6 subsequent siblings)
9 siblings, 1 reply; 24+ messages in thread
From: Coiby Xu @ 2026-07-29 3:36 UTC (permalink / raw)
To: kexec
Cc: Andrew Morton, Sourabh Jain, Baoquan He, Dave Young,
Pratyush Yadav, Mike Rapoport, Pasha Tatashin, Coiby Xu,
open list
If writing to the configfs group happens concurrently during
kexec_file_load syscall, it may lead to the following issues,
- buffer overflow if dm-crypt keys are added after allocation
- stale total_keys if dm-crypt keys are removed during iteration
- keys_header will not be freed if config/crash_dm_crypt_key/reuse is
set true
So hold config_keys_subsys.su_mutex for the entire sequence during the
kexec_file_load syscall to ensure a consistent snapshot.
Fixes: 479e58549b0f ("crash_dump: store dm crypt keys in kdump reserved memory")
Suggested-by: Sourabh Jain <sourabhjain@linux.ibm.com>
Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
---
kernel/crash_dump_dm_crypt.c | 23 +++++++++++++++++++++--
1 file changed, 21 insertions(+), 2 deletions(-)
diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
index 4335b6cb1fc4..d2e66c6fe6f3 100644
--- a/kernel/crash_dump_dm_crypt.c
+++ b/kernel/crash_dump_dm_crypt.c
@@ -293,6 +293,7 @@ static ssize_t config_keys_reuse_show(struct config_item *item, char *page)
static ssize_t config_keys_reuse_store(struct config_item *item,
const char *page, size_t count)
{
+ struct mutex *lock;
bool val;
int r;
@@ -302,8 +303,12 @@ static ssize_t config_keys_reuse_store(struct config_item *item,
return -EINVAL;
}
+ lock = &to_config_group(item)->cg_subsys->su_mutex;
+ mutex_lock(lock);
+
+ r = -EINVAL;
if (kstrtobool(page, &val) || !val)
- return -EINVAL;
+ goto unlock;
if (is_dm_key_reused) {
pr_info("Already got dm-crypt keys, please continue with kexec_file_load syscall\n");
@@ -311,11 +316,15 @@ static ssize_t config_keys_reuse_store(struct config_item *item,
r = get_keys_from_kdump_reserved_memory();
if (r) {
pr_warn("Failed to get dm-crypt keys from reserved memory\n");
- return r;
+ goto unlock;
}
is_dm_key_reused = true;
}
+ r = count;
+
+unlock:
+ mutex_unlock(lock);
return count;
}
@@ -421,6 +430,8 @@ static int build_keys_header(void)
return 0;
}
+static bool mutex_acquired;
+
int crash_load_dm_crypt_keys(struct kimage *image)
{
struct kexec_buf kbuf = {
@@ -432,6 +443,9 @@ int crash_load_dm_crypt_keys(struct kimage *image)
};
int r = 0;
+ mutex_lock(&config_keys_subsys.su_mutex);
+ mutex_acquired = true;
+
if (key_count <= 0) {
kexec_dprintk("No dm-crypt keys\n");
return 0;
@@ -481,6 +495,11 @@ void kexec_file_post_load_cleanup_dm_crypt(struct kimage *image)
kfree_sensitive(keys_header);
keys_header = NULL;
}
+
+ if (mutex_acquired) {
+ mutex_unlock(&config_keys_subsys.su_mutex);
+ mutex_acquired = false;
+ }
}
static int __init configfs_dmcrypt_keys_init(void)
--
2.55.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH v3 03/10] crash_dump: Disallow writing to dm-crypt configfs during kexec_file_load syscall
2026-07-29 3:36 ` [PATCH v3 03/10] crash_dump: Disallow writing to dm-crypt configfs during kexec_file_load syscall Coiby Xu
@ 2026-08-05 10:30 ` Sourabh Jain
2026-08-06 5:20 ` Coiby Xu
0 siblings, 1 reply; 24+ messages in thread
From: Sourabh Jain @ 2026-08-05 10:30 UTC (permalink / raw)
To: Coiby Xu, kexec
Cc: Andrew Morton, Baoquan He, Dave Young, Pratyush Yadav,
Mike Rapoport, Pasha Tatashin, Coiby Xu, open list
On 29/07/26 09:06, Coiby Xu wrote:
> If writing to the configfs group happens concurrently during
> kexec_file_load syscall, it may lead to the following issues,
> - buffer overflow if dm-crypt keys are added after allocation
> - stale total_keys if dm-crypt keys are removed during iteration
> - keys_header will not be freed if config/crash_dm_crypt_key/reuse is
> set true
>
> So hold config_keys_subsys.su_mutex for the entire sequence during the
> kexec_file_load syscall to ensure a consistent snapshot.
>
> Fixes: 479e58549b0f ("crash_dump: store dm crypt keys in kdump reserved memory")
> Suggested-by: Sourabh Jain <sourabhjain@linux.ibm.com>
> Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
> ---
> kernel/crash_dump_dm_crypt.c | 23 +++++++++++++++++++++--
> 1 file changed, 21 insertions(+), 2 deletions(-)
>
> diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
> index 4335b6cb1fc4..d2e66c6fe6f3 100644
> --- a/kernel/crash_dump_dm_crypt.c
> +++ b/kernel/crash_dump_dm_crypt.c
> @@ -293,6 +293,7 @@ static ssize_t config_keys_reuse_show(struct config_item *item, char *page)
> static ssize_t config_keys_reuse_store(struct config_item *item,
> const char *page, size_t count)
> {
> + struct mutex *lock;
> bool val;
> int r;
>
> @@ -302,8 +303,12 @@ static ssize_t config_keys_reuse_store(struct config_item *item,
> return -EINVAL;
> }
>
> + lock = &to_config_group(item)->cg_subsys->su_mutex;
> + mutex_lock(lock);
Is this lock only protecting against races between key reuse and
kexec_file_load(),
or does it also handle the case where a new key is added during key reuse or
kexec_file_load() is running?
If it is only intended to protect key reuse versus kexec_file_load(),
why can't we use
the kexec lock instead?
The reason I'm asking is that, in upcoming patches, the key reuse path
accesses
kexec_crash_image properties and the crash reserved region directly.
Doing so
without taking the kexec lock (using kexec_trylock()) could lead to race
conditions.
- Sourabh Jain
> +
> + r = -EINVAL;
> if (kstrtobool(page, &val) || !val)
> - return -EINVAL;
> + goto unlock;
The jump above skips setting count, causing the function to return count
instead of -EINVAL.
Is this really intended?
>
> if (is_dm_key_reused) {
> pr_info("Already got dm-crypt keys, please continue with kexec_file_load syscall\n");
> @@ -311,11 +316,15 @@ static ssize_t config_keys_reuse_store(struct config_item *item,
> r = get_keys_from_kdump_reserved_memory();
> if (r) {
> pr_warn("Failed to get dm-crypt keys from reserved memory\n");
> - return r;
> + goto unlock;
> }
> is_dm_key_reused = true;
> }
>
> + r = count;
> +
> +unlock:
> + mutex_unlock(lock);
> return count;
> }
>
> @@ -421,6 +430,8 @@ static int build_keys_header(void)
> return 0;
> }
>
> +static bool mutex_acquired;
> +
> int crash_load_dm_crypt_keys(struct kimage *image)
> {
> struct kexec_buf kbuf = {
> @@ -432,6 +443,9 @@ int crash_load_dm_crypt_keys(struct kimage *image)
> };
> int r = 0;
>
> + mutex_lock(&config_keys_subsys.su_mutex);
> + mutex_acquired = true;
> +
> if (key_count <= 0) {
> kexec_dprintk("No dm-crypt keys\n");
> return 0;
> @@ -481,6 +495,11 @@ void kexec_file_post_load_cleanup_dm_crypt(struct kimage *image)
> kfree_sensitive(keys_header);
> keys_header = NULL;
> }
> +
> + if (mutex_acquired) {
> + mutex_unlock(&config_keys_subsys.su_mutex);
> + mutex_acquired = false;
> + }
> }
>
> static int __init configfs_dmcrypt_keys_init(void)
^ permalink raw reply [flat|nested] 24+ messages in thread* Re: [PATCH v3 03/10] crash_dump: Disallow writing to dm-crypt configfs during kexec_file_load syscall
2026-08-05 10:30 ` Sourabh Jain
@ 2026-08-06 5:20 ` Coiby Xu
0 siblings, 0 replies; 24+ messages in thread
From: Coiby Xu @ 2026-08-06 5:20 UTC (permalink / raw)
To: Sourabh Jain
Cc: kexec, Andrew Morton, Baoquan He, Dave Young, Pratyush Yadav,
Mike Rapoport, Pasha Tatashin, Coiby Xu, open list
On Wed, Aug 05, 2026 at 04:00:51PM +0530, Sourabh Jain wrote:
>
>
>On 29/07/26 09:06, Coiby Xu wrote:
>>If writing to the configfs group happens concurrently during
>>kexec_file_load syscall, it may lead to the following issues,
>> - buffer overflow if dm-crypt keys are added after allocation
>> - stale total_keys if dm-crypt keys are removed during iteration
>> - keys_header will not be freed if config/crash_dm_crypt_key/reuse is
>> set true
>>
>>So hold config_keys_subsys.su_mutex for the entire sequence during the
>>kexec_file_load syscall to ensure a consistent snapshot.
>>
>>Fixes: 479e58549b0f ("crash_dump: store dm crypt keys in kdump reserved memory")
>>Suggested-by: Sourabh Jain <sourabhjain@linux.ibm.com>
>>Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
>>---
>> kernel/crash_dump_dm_crypt.c | 23 +++++++++++++++++++++--
>> 1 file changed, 21 insertions(+), 2 deletions(-)
>>
>>diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
>>index 4335b6cb1fc4..d2e66c6fe6f3 100644
>>--- a/kernel/crash_dump_dm_crypt.c
>>+++ b/kernel/crash_dump_dm_crypt.c
>>@@ -293,6 +293,7 @@ static ssize_t config_keys_reuse_show(struct config_item *item, char *page)
>> static ssize_t config_keys_reuse_store(struct config_item *item,
>> const char *page, size_t count)
>> {
>>+ struct mutex *lock;
>> bool val;
>> int r;
>>@@ -302,8 +303,12 @@ static ssize_t config_keys_reuse_store(struct config_item *item,
>> return -EINVAL;
>> }
>>+ lock = &to_config_group(item)->cg_subsys->su_mutex;
>>+ mutex_lock(lock);
>
>Is this lock only protecting against races between key reuse and
>kexec_file_load(),
The lock here is to protect against races between key reuse and
kexec_file_load.
>or does it also handle the case where a new key is added during key reuse or
>kexec_file_load() is running?
For the cases where a key is added/deleted, configfs will automatically
take care of them because it will acquire mutex lock automatically.
>
>If it is only intended to protect key reuse versus kexec_file_load(),
>why can't we use
>the kexec lock instead?
>
>The reason I'm asking is that, in upcoming patches, the key reuse path
>accesses
>kexec_crash_image properties and the crash reserved region directly.
>Doing so
>without taking the kexec lock (using kexec_trylock()) could lead to
>race conditions.
After comparing the kexec lock approach with the configfs mutex lock
approach, I think the latter is a simpler solution because
1. the kexec lock is non-blocking and we have to repeatedly try until the
lock get acquired. So it means user space has to make changes as
well.
2. configfs already acquires the mutex lock automatically for
creating/deleting configfs items. So if we use configfs mutex lock,
it means one less place to use the lock.
In config_keys_reuse_store, kexec_crash_image will be checked before
accessing its properties and the crash reserved region. Can you
elaborate on what the race conditions are? Will acquiring the lock
before accessing kexec_crash_image properties and the crash reserved
region help protect against these races?
In theory, the kexec lock can be a more robust approach. But considering
only root can write to the crash dm-crypt keys configfs and load kdump
image, I'm not sure it's necessary to adopt a bit more complex solution.
>
>- Sourabh Jain
>>+
>>+ r = -EINVAL;
>> if (kstrtobool(page, &val) || !val)
>>- return -EINVAL;
>>+ goto unlock;
>
>The jump above skips setting count, causing the function to return
>count instead of -EINVAL.
>Is this really intended?
Thanks for catching this issue! In the end of the function, r instead of
count should be returned.
>
>> if (is_dm_key_reused) {
>> pr_info("Already got dm-crypt keys, please continue with kexec_file_load syscall\n");
>>@@ -311,11 +316,15 @@ static ssize_t config_keys_reuse_store(struct config_item *item,
>> r = get_keys_from_kdump_reserved_memory();
>> if (r) {
>> pr_warn("Failed to get dm-crypt keys from reserved memory\n");
>>- return r;
>>+ goto unlock;
>> }
>> is_dm_key_reused = true;
>> }
>>+ r = count;
>>+
>>+unlock:
>>+ mutex_unlock(lock);
>> return count;
>> }
>>@@ -421,6 +430,8 @@ static int build_keys_header(void)
>> return 0;
>> }
>>+static bool mutex_acquired;
>>+
>> int crash_load_dm_crypt_keys(struct kimage *image)
>> {
>> struct kexec_buf kbuf = {
>>@@ -432,6 +443,9 @@ int crash_load_dm_crypt_keys(struct kimage *image)
>> };
>> int r = 0;
>>+ mutex_lock(&config_keys_subsys.su_mutex);
>>+ mutex_acquired = true;
>>+
>> if (key_count <= 0) {
>> kexec_dprintk("No dm-crypt keys\n");
>> return 0;
>>@@ -481,6 +495,11 @@ void kexec_file_post_load_cleanup_dm_crypt(struct kimage *image)
>> kfree_sensitive(keys_header);
>> keys_header = NULL;
>> }
>>+
>>+ if (mutex_acquired) {
>>+ mutex_unlock(&config_keys_subsys.su_mutex);
>>+ mutex_acquired = false;
>>+ }
>> }
>> static int __init configfs_dmcrypt_keys_init(void)
>
--
Best regards,
Coiby
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v3 04/10] crash_dump: Read the number of dm-crypt keys from reserved memory
2026-07-29 3:36 [PATCH v3 00/10] Bug fixes and enhancements for kdump LUKS support Coiby Xu
` (2 preceding siblings ...)
2026-07-29 3:36 ` [PATCH v3 03/10] crash_dump: Disallow writing to dm-crypt configfs during kexec_file_load syscall Coiby Xu
@ 2026-07-29 3:36 ` Coiby Xu
2026-08-05 11:05 ` Sourabh Jain
2026-07-29 3:36 ` [PATCH v3 05/10] crash_dump: Free temporary dm-crypt keys_header buffer in kdump kernel Coiby Xu
` (5 subsequent siblings)
9 siblings, 1 reply; 24+ messages in thread
From: Coiby Xu @ 2026-07-29 3:36 UTC (permalink / raw)
To: kexec
Cc: Andrew Morton, Sourabh Jain, Baoquan He, Dave Young,
Pratyush Yadav, Mike Rapoport, Pasha Tatashin, Coiby Xu,
open list
In case user adds/deletes the keys by mistake, it's safer to read the
number of keys from reserved memory.
Fixes: 9ebfa8dcaea7 ("crash_dump: reuse saved dm crypt keys for CPU/memory hot-plugging")
Reported-and-Suggested-by: Sourabh Jain <sourabhjain@linux.ibm.com>
Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
---
kernel/crash_dump_dm_crypt.c | 36 +++++++++++++++++++++++-------------
1 file changed, 23 insertions(+), 13 deletions(-)
diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
index d2e66c6fe6f3..a3996208738b 100644
--- a/kernel/crash_dump_dm_crypt.c
+++ b/kernel/crash_dump_dm_crypt.c
@@ -88,21 +88,31 @@ static int get_keys_from_kdump_reserved_memory(void)
{
struct keys_header *keys_header_loaded;
size_t keys_header_size;
-
- keys_header_size = get_keys_header_size(key_count);
- keys_header = kzalloc(keys_header_size, GFP_KERNEL);
- if (!keys_header)
- return -ENOMEM;
+ int r = 0;
arch_kexec_unprotect_crashkres();
keys_header_loaded = kmap_local_page(pfn_to_page(
kexec_crash_image->dm_crypt_keys_addr >> PAGE_SHIFT));
+ if (keys_header_loaded->total_keys <= 0 ||
+ keys_header_loaded->total_keys > KEY_NUM_MAX) {
+ pr_warn("keys_header saved to reserved memory may be corrupt\n");
+ r = -EINVAL;
+ goto kunmap;
+ }
+
+ keys_header_size = get_keys_header_size(keys_header_loaded->total_keys);
+ keys_header = kzalloc(keys_header_size, GFP_KERNEL);
+ if (!keys_header) {
+ r = -ENOMEM;
+ goto kunmap;
+ }
+
memcpy(keys_header, keys_header_loaded, keys_header_size);
+kunmap:
kunmap_local(keys_header_loaded);
arch_kexec_protect_crashkres();
-
- return 0;
+ return r;
}
static int restore_dm_crypt_keys_to_thread_keyring(void)
@@ -446,12 +456,12 @@ int crash_load_dm_crypt_keys(struct kimage *image)
mutex_lock(&config_keys_subsys.su_mutex);
mutex_acquired = true;
- if (key_count <= 0) {
- kexec_dprintk("No dm-crypt keys\n");
- return 0;
- }
-
if (!is_dm_key_reused) {
+ if (key_count <= 0) {
+ kexec_dprintk("No dm-crypt keys\n");
+ return 0;
+ }
+
r = build_keys_header();
if (r)
goto out;
@@ -462,7 +472,7 @@ int crash_load_dm_crypt_keys(struct kimage *image)
* cleaned up at the end of kexec_file_load syscall
*/
kbuf.buffer = keys_header;
- kbuf.bufsz = get_keys_header_size(key_count);
+ kbuf.bufsz = get_keys_header_size(keys_header->total_keys);
kbuf.memsz = kbuf.bufsz;
kbuf.buf_align = ELF_CORE_HEADER_ALIGN;
--
2.55.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH v3 04/10] crash_dump: Read the number of dm-crypt keys from reserved memory
2026-07-29 3:36 ` [PATCH v3 04/10] crash_dump: Read the number of dm-crypt keys from reserved memory Coiby Xu
@ 2026-08-05 11:05 ` Sourabh Jain
2026-08-06 6:20 ` Coiby Xu
0 siblings, 1 reply; 24+ messages in thread
From: Sourabh Jain @ 2026-08-05 11:05 UTC (permalink / raw)
To: Coiby Xu, kexec
Cc: Andrew Morton, Baoquan He, Dave Young, Pratyush Yadav,
Mike Rapoport, Pasha Tatashin, Coiby Xu, open list
Hi Coiby,
On 29/07/26 09:06, Coiby Xu wrote:
> In case user adds/deletes the keys by mistake, it's safer to read the
> number of keys from reserved memory.
I am not sure how we differentiate between a key being deleted
accidentally and a user
intentionally deleting it. However, I have a question about how the
kernel handles key
addition and removal.
How does the kernel handle key add/remove operations to keep the kexec
segment
corresponding to the key header up to date?
The reason I am asking is to understand what happens when a user deletes
a key. Does the
kexec segment corresponding to that key header still retain information
about the deleted key?
If it does, could you explain why? If it does not, could you explain how
the kexec segment gets updated?
Also, for my understanding, could you please point me to what exactly is
stored in the key header's kexec
segment? During restore, kernel access the old kernel memory using the
information stored in that kexec
segment, so I would like to better understand what data it contains.
Thanks,
Sourabh Jain
>
> Fixes: 9ebfa8dcaea7 ("crash_dump: reuse saved dm crypt keys for CPU/memory hot-plugging")
> Reported-and-Suggested-by: Sourabh Jain <sourabhjain@linux.ibm.com>
> Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
> ---
> kernel/crash_dump_dm_crypt.c | 36 +++++++++++++++++++++++-------------
> 1 file changed, 23 insertions(+), 13 deletions(-)
>
> diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
> index d2e66c6fe6f3..a3996208738b 100644
> --- a/kernel/crash_dump_dm_crypt.c
> +++ b/kernel/crash_dump_dm_crypt.c
> @@ -88,21 +88,31 @@ static int get_keys_from_kdump_reserved_memory(void)
> {
> struct keys_header *keys_header_loaded;
> size_t keys_header_size;
> -
> - keys_header_size = get_keys_header_size(key_count);
> - keys_header = kzalloc(keys_header_size, GFP_KERNEL);
> - if (!keys_header)
> - return -ENOMEM;
> + int r = 0;
>
> arch_kexec_unprotect_crashkres();
> keys_header_loaded = kmap_local_page(pfn_to_page(
> kexec_crash_image->dm_crypt_keys_addr >> PAGE_SHIFT));
>
> + if (keys_header_loaded->total_keys <= 0 ||
> + keys_header_loaded->total_keys > KEY_NUM_MAX) {
> + pr_warn("keys_header saved to reserved memory may be corrupt\n");
> + r = -EINVAL;
> + goto kunmap;
> + }
> +
> + keys_header_size = get_keys_header_size(keys_header_loaded->total_keys);
> + keys_header = kzalloc(keys_header_size, GFP_KERNEL);
> + if (!keys_header) {
> + r = -ENOMEM;
> + goto kunmap;
> + }
> +
> memcpy(keys_header, keys_header_loaded, keys_header_size);
> +kunmap:
> kunmap_local(keys_header_loaded);
> arch_kexec_protect_crashkres();
> -
> - return 0;
> + return r;
> }
>
> static int restore_dm_crypt_keys_to_thread_keyring(void)
> @@ -446,12 +456,12 @@ int crash_load_dm_crypt_keys(struct kimage *image)
> mutex_lock(&config_keys_subsys.su_mutex);
> mutex_acquired = true;
>
> - if (key_count <= 0) {
> - kexec_dprintk("No dm-crypt keys\n");
> - return 0;
> - }
> -
> if (!is_dm_key_reused) {
> + if (key_count <= 0) {
> + kexec_dprintk("No dm-crypt keys\n");
> + return 0;
> + }
> +
> r = build_keys_header();
> if (r)
> goto out;
> @@ -462,7 +472,7 @@ int crash_load_dm_crypt_keys(struct kimage *image)
> * cleaned up at the end of kexec_file_load syscall
> */
> kbuf.buffer = keys_header;
> - kbuf.bufsz = get_keys_header_size(key_count);
> + kbuf.bufsz = get_keys_header_size(keys_header->total_keys);
>
> kbuf.memsz = kbuf.bufsz;
> kbuf.buf_align = ELF_CORE_HEADER_ALIGN;
^ permalink raw reply [flat|nested] 24+ messages in thread* Re: [PATCH v3 04/10] crash_dump: Read the number of dm-crypt keys from reserved memory
2026-08-05 11:05 ` Sourabh Jain
@ 2026-08-06 6:20 ` Coiby Xu
0 siblings, 0 replies; 24+ messages in thread
From: Coiby Xu @ 2026-08-06 6:20 UTC (permalink / raw)
To: Sourabh Jain
Cc: kexec, Andrew Morton, Baoquan He, Dave Young, Pratyush Yadav,
Mike Rapoport, Pasha Tatashin, Coiby Xu, open list
On Wed, Aug 05, 2026 at 04:35:50PM +0530, Sourabh Jain wrote:
>Hi Coiby,
Hi Sourabh,
>
>On 29/07/26 09:06, Coiby Xu wrote:
>>In case user adds/deletes the keys by mistake, it's safer to read the
>>number of keys from reserved memory.
>
>I am not sure how we differentiate between a key being deleted
>accidentally and a user
>intentionally deleting it. However, I have a question about how the
>kernel handles key
>addition and removal.
>
>How does the kernel handle key add/remove operations to keep the kexec
>segment
>corresponding to the key header up to date?
>
>The reason I am asking is to understand what happens when a user
>deletes a key. Does the
>kexec segment corresponding to that key header still retain
>information about the deleted key?
>
>If it does, could you explain why? If it does not, could you explain
>how the kexec segment gets updated?
Thanks for the questions! When a user delete a key by removing a
configfs item, the kexec segment still retain information about the
deleted key. The kexec segment will only be updated when the user tries
to reload the kdump kernel. Because I think introducing a sync mechanism to
automatically update the kexec segment when there is a change to
configfs is unnecessary.
>
>Also, for my understanding, could you please point me to what exactly
>is stored in the key header's kexec
>segment? During restore, kernel access the old kernel memory using the
>information stored in that kexec
>segment, so I would like to better understand what data it contains.
What is stored can be known from struct keys_header and dm_crypt_key,
struct dm_crypt_key {
unsigned int key_size;
char key_desc[KEY_DESC_MAX_LEN];
u8 data[KEY_SIZE_MAX];
};
struct keys_header {
unsigned int total_keys;
struct dm_crypt_key keys[] __counted_by(total_keys);
} *keys_header;
[...]
--
Best regards,
Coiby
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v3 05/10] crash_dump: Free temporary dm-crypt keys_header buffer in kdump kernel
2026-07-29 3:36 [PATCH v3 00/10] Bug fixes and enhancements for kdump LUKS support Coiby Xu
` (3 preceding siblings ...)
2026-07-29 3:36 ` [PATCH v3 04/10] crash_dump: Read the number of dm-crypt keys from reserved memory Coiby Xu
@ 2026-07-29 3:36 ` Coiby Xu
2026-08-05 11:20 ` Sourabh Jain
2026-07-29 3:36 ` [PATCH v3 06/10] crash_dump: Only use kexec_dprintk during the kexec_file_load syscall Coiby Xu
` (4 subsequent siblings)
9 siblings, 1 reply; 24+ messages in thread
From: Coiby Xu @ 2026-07-29 3:36 UTC (permalink / raw)
To: kexec
Cc: Andrew Morton, Sourabh Jain, Baoquan He, Dave Young,
Pratyush Yadav, Mike Rapoport, Pasha Tatashin, Coiby Xu,
open list
Although we expect the system to reboot immediately after vmcore dumping
is finished, it's still good to free the temporary keys_header buffer.
Fixes: 62f17d9df692 ("crash_dump: retrieve dm crypt keys in kdump kernel")
Reported-by: Sourabh Jain <sourabhjain@linux.ibm.com>
Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
---
kernel/crash_dump_dm_crypt.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
index a3996208738b..9a64e2d6841b 100644
--- a/kernel/crash_dump_dm_crypt.c
+++ b/kernel/crash_dump_dm_crypt.c
@@ -117,6 +117,7 @@ static int get_keys_from_kdump_reserved_memory(void)
static int restore_dm_crypt_keys_to_thread_keyring(void)
{
+ struct keys_header *keys_header __free(kfree_sensitive) = NULL;
struct dm_crypt_key *key;
size_t keys_header_size;
key_ref_t keyring_ref;
--
2.55.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH v3 05/10] crash_dump: Free temporary dm-crypt keys_header buffer in kdump kernel
2026-07-29 3:36 ` [PATCH v3 05/10] crash_dump: Free temporary dm-crypt keys_header buffer in kdump kernel Coiby Xu
@ 2026-08-05 11:20 ` Sourabh Jain
0 siblings, 0 replies; 24+ messages in thread
From: Sourabh Jain @ 2026-08-05 11:20 UTC (permalink / raw)
To: Coiby Xu, kexec
Cc: Andrew Morton, Baoquan He, Dave Young, Pratyush Yadav,
Mike Rapoport, Pasha Tatashin, Coiby Xu, open list
On 29/07/26 09:06, Coiby Xu wrote:
> Although we expect the system to reboot immediately after vmcore dumping
> is finished, it's still good to free the temporary keys_header buffer.
>
> Fixes: 62f17d9df692 ("crash_dump: retrieve dm crypt keys in kdump kernel")
> Reported-by: Sourabh Jain <sourabhjain@linux.ibm.com>
> Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
> ---
> kernel/crash_dump_dm_crypt.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
> index a3996208738b..9a64e2d6841b 100644
> --- a/kernel/crash_dump_dm_crypt.c
> +++ b/kernel/crash_dump_dm_crypt.c
> @@ -117,6 +117,7 @@ static int get_keys_from_kdump_reserved_memory(void)
>
> static int restore_dm_crypt_keys_to_thread_keyring(void)
> {
> + struct keys_header *keys_header __free(kfree_sensitive) = NULL;
> struct dm_crypt_key *key;
> size_t keys_header_size;
> key_ref_t keyring_ref;
Yeah, it's good to release the memory regardless.
Feel free to add:
Reviewed-by: Sourabh Jain <sourabhjain@linux.ibm.com>
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v3 06/10] crash_dump: Only use kexec_dprintk during the kexec_file_load syscall
2026-07-29 3:36 [PATCH v3 00/10] Bug fixes and enhancements for kdump LUKS support Coiby Xu
` (4 preceding siblings ...)
2026-07-29 3:36 ` [PATCH v3 05/10] crash_dump: Free temporary dm-crypt keys_header buffer in kdump kernel Coiby Xu
@ 2026-07-29 3:36 ` Coiby Xu
2026-08-05 11:36 ` Sourabh Jain
2026-07-29 3:36 ` [PATCH v3 07/10] crash_dump: Improve readability of config_keys_restore_store Coiby Xu
` (3 subsequent siblings)
9 siblings, 1 reply; 24+ messages in thread
From: Coiby Xu @ 2026-07-29 3:36 UTC (permalink / raw)
To: kexec
Cc: Andrew Morton, Sourabh Jain, Baoquan He, Dave Young,
Pratyush Yadav, Mike Rapoport, Pasha Tatashin, Coiby Xu,
open list
kexec_dprintk will only be activated by "kexec -d" during
kexec_file_load syscall. So use pr_* outside of this syscall.
Fixes: 9ebfa8dcaea7 ("crash_dump: reuse saved dm crypt keys for CPU/memory hot-plugging")
Fixes: 62f17d9df692 ("crash_dump: retrieve dm crypt keys in kdump kernel")
Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
---
kernel/crash_dump_dm_crypt.c | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
index 9a64e2d6841b..3ee01996778f 100644
--- a/kernel/crash_dump_dm_crypt.c
+++ b/kernel/crash_dump_dm_crypt.c
@@ -75,10 +75,10 @@ static int add_key_to_keyring(struct dm_crypt_key *dm_key,
if (!IS_ERR(key_ref)) {
r = key_ref_to_ptr(key_ref)->serial;
key_ref_put(key_ref);
- kexec_dprintk("Success adding key %s", dm_key->key_desc);
+ pr_debug("Success adding key %s", dm_key->key_desc);
} else {
r = PTR_ERR(key_ref);
- kexec_dprintk("Error when adding key");
+ pr_warn("Error when adding key");
}
return r;
@@ -128,19 +128,19 @@ static int restore_dm_crypt_keys_to_thread_keyring(void)
keyring_ref =
lookup_user_key(KEY_SPEC_USER_KEYRING, 0x01, KEY_NEED_WRITE);
if (IS_ERR(keyring_ref)) {
- kexec_dprintk("Failed to get the user keyring\n");
+ pr_warn("Failed to get the user keyring\n");
return PTR_ERR(keyring_ref);
}
addr = dm_crypt_keys_addr;
dm_crypt_keys_read((char *)&key_count, sizeof(key_count), &addr);
if (key_count > KEY_NUM_MAX) {
- kexec_dprintk("Failed to read the number of dm-crypt keys\n");
+ pr_warn("Failed to read the number of dm-crypt keys\n");
ret = -1;
goto out;
}
- kexec_dprintk("There are %u keys\n", key_count);
+ pr_debug("There are %u keys\n", key_count);
addr = dm_crypt_keys_addr;
keys_header_size = get_keys_header_size(key_count);
@@ -154,7 +154,7 @@ static int restore_dm_crypt_keys_to_thread_keyring(void)
for (int i = 0; i < keys_header->total_keys; i++) {
key = &keys_header->keys[i];
- kexec_dprintk("Get key (size=%u)\n", key->key_size);
+ pr_debug("Get key (size=%u)\n", key->key_size);
add_key_to_keyring(key, keyring_ref);
}
@@ -309,8 +309,7 @@ static ssize_t config_keys_reuse_store(struct config_item *item,
int r;
if (!kexec_crash_image || !kexec_crash_image->dm_crypt_keys_addr) {
- kexec_dprintk(
- "dm-crypt keys haven't be saved to crash-reserved memory\n");
+ pr_debug("dm-crypt keys haven't be saved to crash-reserved memory\n");
return -EINVAL;
}
--
2.55.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH v3 06/10] crash_dump: Only use kexec_dprintk during the kexec_file_load syscall
2026-07-29 3:36 ` [PATCH v3 06/10] crash_dump: Only use kexec_dprintk during the kexec_file_load syscall Coiby Xu
@ 2026-08-05 11:36 ` Sourabh Jain
2026-08-06 5:27 ` Coiby Xu
0 siblings, 1 reply; 24+ messages in thread
From: Sourabh Jain @ 2026-08-05 11:36 UTC (permalink / raw)
To: Coiby Xu, kexec
Cc: Andrew Morton, Baoquan He, Dave Young, Pratyush Yadav,
Mike Rapoport, Pasha Tatashin, Coiby Xu, open list
On 29/07/26 09:06, Coiby Xu wrote:
> kexec_dprintk will only be activated by "kexec -d" during
> kexec_file_load syscall. So use pr_* outside of this syscall.
>
> Fixes: 9ebfa8dcaea7 ("crash_dump: reuse saved dm crypt keys for CPU/memory hot-plugging")
> Fixes: 62f17d9df692 ("crash_dump: retrieve dm crypt keys in kdump kernel")
> Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
> ---
> kernel/crash_dump_dm_crypt.c | 15 +++++++--------
> 1 file changed, 7 insertions(+), 8 deletions(-)
>
> diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
> index 9a64e2d6841b..3ee01996778f 100644
> --- a/kernel/crash_dump_dm_crypt.c
> +++ b/kernel/crash_dump_dm_crypt.c
> @@ -75,10 +75,10 @@ static int add_key_to_keyring(struct dm_crypt_key *dm_key,
> if (!IS_ERR(key_ref)) {
> r = key_ref_to_ptr(key_ref)->serial;
> key_ref_put(key_ref);
> - kexec_dprintk("Success adding key %s", dm_key->key_desc);
> + pr_debug("Success adding key %s", dm_key->key_desc);
Missing a newline in the above debug message.
> } else {
> r = PTR_ERR(key_ref);
> - kexec_dprintk("Error when adding key");
> + pr_warn("Error when adding key");
> }
Missing a newline. Also, I think printing the error code (r) would be
helpful.
Apart from these two minor nits, the changes look good to me.
Reviewed-by: Sourabh Jain <sourabhjain@linux.ibm.com>
>
> return r;
> @@ -128,19 +128,19 @@ static int restore_dm_crypt_keys_to_thread_keyring(void)
> keyring_ref =
> lookup_user_key(KEY_SPEC_USER_KEYRING, 0x01, KEY_NEED_WRITE);
> if (IS_ERR(keyring_ref)) {
> - kexec_dprintk("Failed to get the user keyring\n");
> + pr_warn("Failed to get the user keyring\n");
> return PTR_ERR(keyring_ref);
> }
>
> addr = dm_crypt_keys_addr;
> dm_crypt_keys_read((char *)&key_count, sizeof(key_count), &addr);
> if (key_count > KEY_NUM_MAX) {
> - kexec_dprintk("Failed to read the number of dm-crypt keys\n");
> + pr_warn("Failed to read the number of dm-crypt keys\n");
> ret = -1;
> goto out;
> }
>
> - kexec_dprintk("There are %u keys\n", key_count);
> + pr_debug("There are %u keys\n", key_count);
> addr = dm_crypt_keys_addr;
>
> keys_header_size = get_keys_header_size(key_count);
> @@ -154,7 +154,7 @@ static int restore_dm_crypt_keys_to_thread_keyring(void)
>
> for (int i = 0; i < keys_header->total_keys; i++) {
> key = &keys_header->keys[i];
> - kexec_dprintk("Get key (size=%u)\n", key->key_size);
> + pr_debug("Get key (size=%u)\n", key->key_size);
> add_key_to_keyring(key, keyring_ref);
> }
>
> @@ -309,8 +309,7 @@ static ssize_t config_keys_reuse_store(struct config_item *item,
> int r;
>
> if (!kexec_crash_image || !kexec_crash_image->dm_crypt_keys_addr) {
> - kexec_dprintk(
> - "dm-crypt keys haven't be saved to crash-reserved memory\n");
> + pr_debug("dm-crypt keys haven't be saved to crash-reserved memory\n");
> return -EINVAL;
> }
>
^ permalink raw reply [flat|nested] 24+ messages in thread* Re: [PATCH v3 06/10] crash_dump: Only use kexec_dprintk during the kexec_file_load syscall
2026-08-05 11:36 ` Sourabh Jain
@ 2026-08-06 5:27 ` Coiby Xu
0 siblings, 0 replies; 24+ messages in thread
From: Coiby Xu @ 2026-08-06 5:27 UTC (permalink / raw)
To: Sourabh Jain
Cc: kexec, Andrew Morton, Baoquan He, Dave Young, Pratyush Yadav,
Mike Rapoport, Pasha Tatashin, Coiby Xu, open list
On Wed, Aug 05, 2026 at 05:06:39PM +0530, Sourabh Jain wrote:
>
>
>On 29/07/26 09:06, Coiby Xu wrote:
>>kexec_dprintk will only be activated by "kexec -d" during
>>kexec_file_load syscall. So use pr_* outside of this syscall.
>>
>>Fixes: 9ebfa8dcaea7 ("crash_dump: reuse saved dm crypt keys for CPU/memory hot-plugging")
>>Fixes: 62f17d9df692 ("crash_dump: retrieve dm crypt keys in kdump kernel")
>>Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
>>---
>> kernel/crash_dump_dm_crypt.c | 15 +++++++--------
>> 1 file changed, 7 insertions(+), 8 deletions(-)
>>
>>diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
>>index 9a64e2d6841b..3ee01996778f 100644
>>--- a/kernel/crash_dump_dm_crypt.c
>>+++ b/kernel/crash_dump_dm_crypt.c
>>@@ -75,10 +75,10 @@ static int add_key_to_keyring(struct dm_crypt_key *dm_key,
>> if (!IS_ERR(key_ref)) {
>> r = key_ref_to_ptr(key_ref)->serial;
>> key_ref_put(key_ref);
>>- kexec_dprintk("Success adding key %s", dm_key->key_desc);
>>+ pr_debug("Success adding key %s", dm_key->key_desc);
>
>Missing a newline in the above debug message.
>
>> } else {
>> r = PTR_ERR(key_ref);
>>- kexec_dprintk("Error when adding key");
>>+ pr_warn("Error when adding key");
>> }
>
>Missing a newline. Also, I think printing the error code (r) would be
>helpful.
Good catches! And I'll apply your suggestion!
>
>Apart from these two minor nits, the changes look good to me.
>
>Reviewed-by: Sourabh Jain <sourabhjain@linux.ibm.com>
Thanks for reviewing the patch!
[...]
--
Best regards,
Coiby
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v3 07/10] crash_dump: Improve readability of config_keys_restore_store
2026-07-29 3:36 [PATCH v3 00/10] Bug fixes and enhancements for kdump LUKS support Coiby Xu
` (5 preceding siblings ...)
2026-07-29 3:36 ` [PATCH v3 06/10] crash_dump: Only use kexec_dprintk during the kexec_file_load syscall Coiby Xu
@ 2026-07-29 3:36 ` Coiby Xu
2026-08-05 11:52 ` Sourabh Jain
2026-07-29 3:36 ` [PATCH v3 08/10] crash_dump: Check the function return codes in restore_dm_crypt_keys_to_thread_keyring Coiby Xu
` (2 subsequent siblings)
9 siblings, 1 reply; 24+ messages in thread
From: Coiby Xu @ 2026-07-29 3:36 UTC (permalink / raw)
To: kexec
Cc: Andrew Morton, Sourabh Jain, Baoquan He, Dave Young,
Pratyush Yadav, Mike Rapoport, Pasha Tatashin, Coiby Xu,
open list
config_keys_restore_store currently doesn't validate the user input
before restoring dm-crypt keys. Although it's not necessary for the case
of vmcore dumping, it's better to do it for the sake of consistency and
code readability. Also check the return code of
restore_dm_crypt_keys_to_thread_keyring.
Fixes: 62f17d9df692 ("crash_dump: retrieve dm crypt keys in kdump kernel")
Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
---
kernel/crash_dump_dm_crypt.c | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
index 3ee01996778f..1f4549956824 100644
--- a/kernel/crash_dump_dm_crypt.c
+++ b/kernel/crash_dump_dm_crypt.c
@@ -370,12 +370,19 @@ static ssize_t config_keys_restore_show(struct config_item *item, char *page)
static ssize_t config_keys_restore_store(struct config_item *item,
const char *page, size_t count)
{
- if (!restore)
- restore_dm_crypt_keys_to_thread_keyring();
+ bool val;
- if (kstrtobool(page, &restore))
+ if (kstrtobool(page, &val))
return -EINVAL;
+ if (val) {
+ if (restore) {
+ pr_warn("dm-crypt keys already restored!\n");
+ return count;
+ } else if (!restore_dm_crypt_keys_to_thread_keyring())
+ restore = true;
+ }
+
return count;
}
--
2.55.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH v3 07/10] crash_dump: Improve readability of config_keys_restore_store
2026-07-29 3:36 ` [PATCH v3 07/10] crash_dump: Improve readability of config_keys_restore_store Coiby Xu
@ 2026-08-05 11:52 ` Sourabh Jain
2026-08-06 6:26 ` Coiby Xu
0 siblings, 1 reply; 24+ messages in thread
From: Sourabh Jain @ 2026-08-05 11:52 UTC (permalink / raw)
To: Coiby Xu, kexec
Cc: Andrew Morton, Baoquan He, Dave Young, Pratyush Yadav,
Mike Rapoport, Pasha Tatashin, Coiby Xu, open list
On 29/07/26 09:06, Coiby Xu wrote:
> config_keys_restore_store currently doesn't validate the user input
> before restoring dm-crypt keys. Although it's not necessary for the case
> of vmcore dumping, it's better to do it for the sake of consistency and
> code readability. Also check the return code of
> restore_dm_crypt_keys_to_thread_keyring.
>
> Fixes: 62f17d9df692 ("crash_dump: retrieve dm crypt keys in kdump kernel")
> Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
> ---
> kernel/crash_dump_dm_crypt.c | 13 ++++++++++---
> 1 file changed, 10 insertions(+), 3 deletions(-)
>
> diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
> index 3ee01996778f..1f4549956824 100644
> --- a/kernel/crash_dump_dm_crypt.c
> +++ b/kernel/crash_dump_dm_crypt.c
> @@ -370,12 +370,19 @@ static ssize_t config_keys_restore_show(struct config_item *item, char *page)
> static ssize_t config_keys_restore_store(struct config_item *item,
> const char *page, size_t count)
> {
> - if (!restore)
> - restore_dm_crypt_keys_to_thread_keyring();
> + bool val;
>
> - if (kstrtobool(page, &restore))
> + if (kstrtobool(page, &val))
> return -EINVAL;
>
> + if (val) {
> + if (restore) {
> + pr_warn("dm-crypt keys already restored!\n");
> + return count;
> + } else if (!restore_dm_crypt_keys_to_thread_keyring())
> + restore = true;
> + }
> +
> return count;
Nit: returns count even when restore fails.
Rest of changes looks good to me.
Reviewed-by: Sourabh Jain <sourabhjain@linux.ibm.com>
> }
>
^ permalink raw reply [flat|nested] 24+ messages in thread* Re: [PATCH v3 07/10] crash_dump: Improve readability of config_keys_restore_store
2026-08-05 11:52 ` Sourabh Jain
@ 2026-08-06 6:26 ` Coiby Xu
0 siblings, 0 replies; 24+ messages in thread
From: Coiby Xu @ 2026-08-06 6:26 UTC (permalink / raw)
To: Sourabh Jain
Cc: kexec, Andrew Morton, Baoquan He, Dave Young, Pratyush Yadav,
Mike Rapoport, Pasha Tatashin, Coiby Xu, open list
On Wed, Aug 05, 2026 at 05:22:39PM +0530, Sourabh Jain wrote:
>
>
>On 29/07/26 09:06, Coiby Xu wrote:
>>config_keys_restore_store currently doesn't validate the user input
>>before restoring dm-crypt keys. Although it's not necessary for the case
>>of vmcore dumping, it's better to do it for the sake of consistency and
>>code readability. Also check the return code of
>>restore_dm_crypt_keys_to_thread_keyring.
>>
>>Fixes: 62f17d9df692 ("crash_dump: retrieve dm crypt keys in kdump kernel")
>>Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
>>---
>> kernel/crash_dump_dm_crypt.c | 13 ++++++++++---
>> 1 file changed, 10 insertions(+), 3 deletions(-)
>>
>>diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
>>index 3ee01996778f..1f4549956824 100644
>>--- a/kernel/crash_dump_dm_crypt.c
>>+++ b/kernel/crash_dump_dm_crypt.c
>>@@ -370,12 +370,19 @@ static ssize_t config_keys_restore_show(struct config_item *item, char *page)
>> static ssize_t config_keys_restore_store(struct config_item *item,
>> const char *page, size_t count)
>> {
>>- if (!restore)
>>- restore_dm_crypt_keys_to_thread_keyring();
>>+ bool val;
>>- if (kstrtobool(page, &restore))
>>+ if (kstrtobool(page, &val))
>> return -EINVAL;
>>+ if (val) {
>>+ if (restore) {
>>+ pr_warn("dm-crypt keys already restored!\n");
>>+ return count;
>>+ } else if (!restore_dm_crypt_keys_to_thread_keyring())
>>+ restore = true;
>>+ }
>>+
>> return count;
>
>Nit: returns count even when restore fails.
I'll change it in next version, thanks!
>
>Rest of changes looks good to me.
>Reviewed-by: Sourabh Jain <sourabhjain@linux.ibm.com>
And thanks for reviewing and ack'ing the patch!
>
>> }
>
--
Best regards,
Coiby
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v3 08/10] crash_dump: Check the function return codes in restore_dm_crypt_keys_to_thread_keyring
2026-07-29 3:36 [PATCH v3 00/10] Bug fixes and enhancements for kdump LUKS support Coiby Xu
` (6 preceding siblings ...)
2026-07-29 3:36 ` [PATCH v3 07/10] crash_dump: Improve readability of config_keys_restore_store Coiby Xu
@ 2026-07-29 3:36 ` Coiby Xu
2026-08-05 12:03 ` Sourabh Jain
2026-07-29 3:36 ` [PATCH v3 09/10] crash_dump: Disallow configfs/crash_dm_crypt_key/reuse if crash hotplug supported Coiby Xu
2026-07-29 3:36 ` [PATCH v3 10/10] Documentation: kdump: Add arm64 and ppc64le to encrypted dump target support list Coiby Xu
9 siblings, 1 reply; 24+ messages in thread
From: Coiby Xu @ 2026-07-29 3:36 UTC (permalink / raw)
To: kexec
Cc: Andrew Morton, Sourabh Jain, Baoquan He, Dave Young,
Pratyush Yadav, Mike Rapoport, Pasha Tatashin, open list
We should check the return codes so we can abort if keyring allocation
or reading old memory fails.
Note there is no need to refer a key add_key_to_keyring, so delete
related code.
Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
---
kernel/crash_dump_dm_crypt.c | 23 ++++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)
diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
index 1f4549956824..b5b78656cf06 100644
--- a/kernel/crash_dump_dm_crypt.c
+++ b/kernel/crash_dump_dm_crypt.c
@@ -65,7 +65,7 @@ static int add_key_to_keyring(struct dm_crypt_key *dm_key,
key_ref_t keyring_ref)
{
key_ref_t key_ref;
- int r;
+ int r = 0;
/* create or update the requested key and add it to the target keyring */
key_ref = key_create_or_update(keyring_ref, "user", dm_key->key_desc,
@@ -73,8 +73,6 @@ static int add_key_to_keyring(struct dm_crypt_key *dm_key,
KEY_USR_ALL, KEY_ALLOC_IN_QUOTA);
if (!IS_ERR(key_ref)) {
- r = key_ref_to_ptr(key_ref)->serial;
- key_ref_put(key_ref);
pr_debug("Success adding key %s", dm_key->key_desc);
} else {
r = PTR_ERR(key_ref);
@@ -133,9 +131,14 @@ static int restore_dm_crypt_keys_to_thread_keyring(void)
}
addr = dm_crypt_keys_addr;
- dm_crypt_keys_read((char *)&key_count, sizeof(key_count), &addr);
+ ret = dm_crypt_keys_read((char *)&key_count, sizeof(key_count), &addr);
+ if (ret < 0) {
+ pr_err("Failed to read the number of dm-crypt keys\n");
+ goto out;
+ }
+
if (key_count > KEY_NUM_MAX) {
- pr_warn("Failed to read the number of dm-crypt keys\n");
+ pr_warn("Read %u dm-crypt keys (max=%u)\n", key_count, KEY_NUM_MAX);
ret = -1;
goto out;
}
@@ -150,12 +153,18 @@ static int restore_dm_crypt_keys_to_thread_keyring(void)
goto out;
}
- dm_crypt_keys_read((char *)keys_header, keys_header_size, &addr);
+ ret = dm_crypt_keys_read((char *)keys_header, keys_header_size, &addr);
+ if (ret < 0) {
+ pr_err("Failed to read dm-crypt keys\n");
+ goto out;
+ }
for (int i = 0; i < keys_header->total_keys; i++) {
key = &keys_header->keys[i];
pr_debug("Get key (size=%u)\n", key->key_size);
- add_key_to_keyring(key, keyring_ref);
+ ret = add_key_to_keyring(key, keyring_ref);
+ if (ret)
+ break;
}
out:
--
2.55.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH v3 08/10] crash_dump: Check the function return codes in restore_dm_crypt_keys_to_thread_keyring
2026-07-29 3:36 ` [PATCH v3 08/10] crash_dump: Check the function return codes in restore_dm_crypt_keys_to_thread_keyring Coiby Xu
@ 2026-08-05 12:03 ` Sourabh Jain
0 siblings, 0 replies; 24+ messages in thread
From: Sourabh Jain @ 2026-08-05 12:03 UTC (permalink / raw)
To: Coiby Xu, kexec
Cc: Andrew Morton, Baoquan He, Dave Young, Pratyush Yadav,
Mike Rapoport, Pasha Tatashin, open list
On 29/07/26 09:06, Coiby Xu wrote:
> We should check the return codes so we can abort if keyring allocation
> or reading old memory fails.
>
> Note there is no need to refer a key add_key_to_keyring, so delete
> related code.
>
> Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
> ---
> kernel/crash_dump_dm_crypt.c | 23 ++++++++++++++++-------
> 1 file changed, 16 insertions(+), 7 deletions(-)
>
> diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
> index 1f4549956824..b5b78656cf06 100644
> --- a/kernel/crash_dump_dm_crypt.c
> +++ b/kernel/crash_dump_dm_crypt.c
> @@ -65,7 +65,7 @@ static int add_key_to_keyring(struct dm_crypt_key *dm_key,
> key_ref_t keyring_ref)
> {
> key_ref_t key_ref;
> - int r;
> + int r = 0;
>
> /* create or update the requested key and add it to the target keyring */
> key_ref = key_create_or_update(keyring_ref, "user", dm_key->key_desc,
> @@ -73,8 +73,6 @@ static int add_key_to_keyring(struct dm_crypt_key *dm_key,
> KEY_USR_ALL, KEY_ALLOC_IN_QUOTA);
>
> if (!IS_ERR(key_ref)) {
> - r = key_ref_to_ptr(key_ref)->serial;
> - key_ref_put(key_ref);
> pr_debug("Success adding key %s", dm_key->key_desc);
> } else {
> r = PTR_ERR(key_ref);
> @@ -133,9 +131,14 @@ static int restore_dm_crypt_keys_to_thread_keyring(void)
> }
>
> addr = dm_crypt_keys_addr;
> - dm_crypt_keys_read((char *)&key_count, sizeof(key_count), &addr);
> + ret = dm_crypt_keys_read((char *)&key_count, sizeof(key_count), &addr);
> + if (ret < 0) {
> + pr_err("Failed to read the number of dm-crypt keys\n");
> + goto out;
> + }
> +
> if (key_count > KEY_NUM_MAX) {
> - pr_warn("Failed to read the number of dm-crypt keys\n");
> + pr_warn("Read %u dm-crypt keys (max=%u)\n", key_count, KEY_NUM_MAX);
> ret = -1;
> goto out;
> }
> @@ -150,12 +153,18 @@ static int restore_dm_crypt_keys_to_thread_keyring(void)
> goto out;
> }
>
> - dm_crypt_keys_read((char *)keys_header, keys_header_size, &addr);
> + ret = dm_crypt_keys_read((char *)keys_header, keys_header_size, &addr);
> + if (ret < 0) {
> + pr_err("Failed to read dm-crypt keys\n");
> + goto out;
> + }
>
> for (int i = 0; i < keys_header->total_keys; i++) {
> key = &keys_header->keys[i];
> pr_debug("Get key (size=%u)\n", key->key_size);
> - add_key_to_keyring(key, keyring_ref);
> + ret = add_key_to_keyring(key, keyring_ref);
> + if (ret)
> + break;
> }
>
> out:
Changes looks good to me. Feel free to add.
Reviewed-by: Sourabh Jain <sourabhjain@linux.ibm.com>
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v3 09/10] crash_dump: Disallow configfs/crash_dm_crypt_key/reuse if crash hotplug supported
2026-07-29 3:36 [PATCH v3 00/10] Bug fixes and enhancements for kdump LUKS support Coiby Xu
` (7 preceding siblings ...)
2026-07-29 3:36 ` [PATCH v3 08/10] crash_dump: Check the function return codes in restore_dm_crypt_keys_to_thread_keyring Coiby Xu
@ 2026-07-29 3:36 ` Coiby Xu
2026-08-05 12:09 ` Sourabh Jain
2026-07-29 3:36 ` [PATCH v3 10/10] Documentation: kdump: Add arm64 and ppc64le to encrypted dump target support list Coiby Xu
9 siblings, 1 reply; 24+ messages in thread
From: Coiby Xu @ 2026-07-29 3:36 UTC (permalink / raw)
To: kexec
Cc: Andrew Morton, Sourabh Jain, Baoquan He, Dave Young,
Pratyush Yadav, Mike Rapoport, Pasha Tatashin, Jonathan Corbet,
Shuah Khan, Coiby Xu, open list:DOCUMENTATION, open list
If crash hotplug is supported, dm-crypt keys saved to reserved memory
will be taken care of automatically. Thus it doesn't make sense to use
configfs/crash_dm_crypt_key/reuse. Reserving image->dm_crypt_keys_addr
is also unnecessary. Currently x86_64 and ppc64le have implemented
crash hotplug feature.
Also update the doc accordingly. Note two doc issues are fixed as well.
Fixes: 9ebfa8dcaea7 ("crash_dump: reuse saved dm crypt keys for CPU/memory hot-plugging")
Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
---
Documentation/admin-guide/kdump/kdump.rst | 16 ++++++++++------
kernel/crash_dump_dm_crypt.c | 23 ++++++++++++++++++++---
2 files changed, 30 insertions(+), 9 deletions(-)
diff --git a/Documentation/admin-guide/kdump/kdump.rst b/Documentation/admin-guide/kdump/kdump.rst
index 7587caadbae1..0bf2eb100a05 100644
--- a/Documentation/admin-guide/kdump/kdump.rst
+++ b/Documentation/admin-guide/kdump/kdump.rst
@@ -577,9 +577,10 @@ with /sys/kernel/config/crash_dm_crypt_keys for setup,
1. Tell the first kernel what logon keys are needed to unlock the disk volumes,
# Add key #1
- mkdir /sys/kernel/config/crash_dm_crypt_keys/7d26b7b4-e342-4d2d-b660-7426b0996720
+ VOL1_UUID=7d26b7b4-e342-4d2d-b660-7426b0996720
+ mkdir /sys/kernel/config/crash_dm_crypt_keys/$VOL1_UUID
# Add key #1's description
- echo cryptsetup:7d26b7b4-e342-4d2d-b660-7426b0996720 > /sys/kernel/config/crash_dm_crypt_keys/description
+ echo cryptsetup:$VOL1_UUID > /sys/kernel/config/crash_dm_crypt_keys/$VOL1_UUID/description
# how many keys do we have now?
cat /sys/kernel/config/crash_dm_crypt_keys/count
@@ -591,15 +592,18 @@ with /sys/kernel/config/crash_dm_crypt_keys for setup,
cat /sys/kernel/config/crash_dm_crypt_keys/count
2
- # To support CPU/memory hot-plugging, reuse keys already saved to reserved
- # memory
- echo true > /sys/kernel/config/crash_dm_crypt_key/reuse
-
2. Load the dump-capture kernel
3. After the dump-capture kerne get booted, restore the keys to user keyring
echo yes > /sys/kernel/crash_dm_crypt_keys/restore
+For CPU/memory hot-plugging, you can reuse keys already saved to reserved
+memory before reloading the kdump image,
+ echo true > /sys/kernel/config/crash_dm_crypt_keys/reuse
+
+Note if crash hotplug is supported, this API is totally unnecessary thus will
+be disabled automatically.
+
Contact
=======
diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
index b5b78656cf06..46d6b31c3ca4 100644
--- a/kernel/crash_dump_dm_crypt.c
+++ b/kernel/crash_dump_dm_crypt.c
@@ -310,6 +310,15 @@ static ssize_t config_keys_reuse_show(struct config_item *item, char *page)
return sysfs_emit(page, "%d\n", is_dm_key_reused);
}
+static bool crash_hotplug_support(struct kimage *image)
+{
+#ifdef CONFIG_CRASH_HOTPLUG
+ return image->hotplug_support;
+#else
+ return false;
+#endif
+}
+
static ssize_t config_keys_reuse_store(struct config_item *item,
const char *page, size_t count)
{
@@ -317,6 +326,11 @@ static ssize_t config_keys_reuse_store(struct config_item *item,
bool val;
int r;
+ if (kexec_crash_image && crash_hotplug_support(kexec_crash_image)) {
+ pr_debug("Crash hotplug supported\n");
+ return -EINVAL;
+ }
+
if (!kexec_crash_image || !kexec_crash_image->dm_crypt_keys_addr) {
pr_debug("dm-crypt keys haven't be saved to crash-reserved memory\n");
return -EINVAL;
@@ -513,9 +527,9 @@ int crash_load_dm_crypt_keys(struct kimage *image)
void kexec_file_post_load_cleanup_dm_crypt(struct kimage *image)
{
/*
- * For CPU/memory hot-plugging, the kdump image will be reloaded. Prevent
- * keys_header from being cleaned up during unloading when
- * is_dm_key_reused=true
+ * For CPU/memory hot-plugging without CONFIG_CRASH_HOTPLUG, the whole kdump
+ * image will be reloaded. Prevent keys_header from being cleaned up during
+ * unloading when is_dm_key_reused=true
*/
if (!is_dm_key_reused) {
kfree_sensitive(keys_header);
@@ -526,6 +540,9 @@ void kexec_file_post_load_cleanup_dm_crypt(struct kimage *image)
mutex_unlock(&config_keys_subsys.su_mutex);
mutex_acquired = false;
}
+
+ if (crash_hotplug_support(image))
+ image->dm_crypt_keys_addr = 0;
}
static int __init configfs_dmcrypt_keys_init(void)
--
2.55.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH v3 09/10] crash_dump: Disallow configfs/crash_dm_crypt_key/reuse if crash hotplug supported
2026-07-29 3:36 ` [PATCH v3 09/10] crash_dump: Disallow configfs/crash_dm_crypt_key/reuse if crash hotplug supported Coiby Xu
@ 2026-08-05 12:09 ` Sourabh Jain
2026-08-06 5:33 ` Coiby Xu
0 siblings, 1 reply; 24+ messages in thread
From: Sourabh Jain @ 2026-08-05 12:09 UTC (permalink / raw)
To: Coiby Xu, kexec
Cc: Andrew Morton, Baoquan He, Dave Young, Pratyush Yadav,
Mike Rapoport, Pasha Tatashin, Jonathan Corbet, Shuah Khan,
Coiby Xu, open list:DOCUMENTATION, open list
On 29/07/26 09:06, Coiby Xu wrote:
> If crash hotplug is supported, dm-crypt keys saved to reserved memory
> will be taken care of automatically. Thus it doesn't make sense to use
> configfs/crash_dm_crypt_key/reuse. Reserving image->dm_crypt_keys_addr
> is also unnecessary. Currently x86_64 and ppc64le have implemented
> crash hotplug feature.
>
> Also update the doc accordingly. Note two doc issues are fixed as well.
>
> Fixes: 9ebfa8dcaea7 ("crash_dump: reuse saved dm crypt keys for CPU/memory hot-plugging")
> Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
> ---
> Documentation/admin-guide/kdump/kdump.rst | 16 ++++++++++------
> kernel/crash_dump_dm_crypt.c | 23 ++++++++++++++++++++---
> 2 files changed, 30 insertions(+), 9 deletions(-)
>
> diff --git a/Documentation/admin-guide/kdump/kdump.rst b/Documentation/admin-guide/kdump/kdump.rst
> index 7587caadbae1..0bf2eb100a05 100644
> --- a/Documentation/admin-guide/kdump/kdump.rst
> +++ b/Documentation/admin-guide/kdump/kdump.rst
> @@ -577,9 +577,10 @@ with /sys/kernel/config/crash_dm_crypt_keys for setup,
>
> 1. Tell the first kernel what logon keys are needed to unlock the disk volumes,
> # Add key #1
> - mkdir /sys/kernel/config/crash_dm_crypt_keys/7d26b7b4-e342-4d2d-b660-7426b0996720
> + VOL1_UUID=7d26b7b4-e342-4d2d-b660-7426b0996720
> + mkdir /sys/kernel/config/crash_dm_crypt_keys/$VOL1_UUID
> # Add key #1's description
> - echo cryptsetup:7d26b7b4-e342-4d2d-b660-7426b0996720 > /sys/kernel/config/crash_dm_crypt_keys/description
> + echo cryptsetup:$VOL1_UUID > /sys/kernel/config/crash_dm_crypt_keys/$VOL1_UUID/description
>
> # how many keys do we have now?
> cat /sys/kernel/config/crash_dm_crypt_keys/count
> @@ -591,15 +592,18 @@ with /sys/kernel/config/crash_dm_crypt_keys for setup,
> cat /sys/kernel/config/crash_dm_crypt_keys/count
> 2
>
> - # To support CPU/memory hot-plugging, reuse keys already saved to reserved
> - # memory
> - echo true > /sys/kernel/config/crash_dm_crypt_key/reuse
> -
> 2. Load the dump-capture kernel
>
> 3. After the dump-capture kerne get booted, restore the keys to user keyring
> echo yes > /sys/kernel/crash_dm_crypt_keys/restore
>
> +For CPU/memory hot-plugging, you can reuse keys already saved to reserved
> +memory before reloading the kdump image,
> + echo true > /sys/kernel/config/crash_dm_crypt_keys/reuse
> +
> +Note if crash hotplug is supported, this API is totally unnecessary thus will
> +be disabled automatically.
> +
> Contact
> =======
>
> diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
> index b5b78656cf06..46d6b31c3ca4 100644
> --- a/kernel/crash_dump_dm_crypt.c
> +++ b/kernel/crash_dump_dm_crypt.c
> @@ -310,6 +310,15 @@ static ssize_t config_keys_reuse_show(struct config_item *item, char *page)
> return sysfs_emit(page, "%d\n", is_dm_key_reused);
> }
>
> +static bool crash_hotplug_support(struct kimage *image)
> +{
> +#ifdef CONFIG_CRASH_HOTPLUG
> + return image->hotplug_support;
I don't think it is good idea to access kexec_crash_image properties without
holding the kexec lock.
Also, would it make sense to move this API somewhere else?
- Sourabh Jain
> +#else
> + return false;
> +#endif
> +}
> +
> static ssize_t config_keys_reuse_store(struct config_item *item,
> const char *page, size_t count)
> {
> @@ -317,6 +326,11 @@ static ssize_t config_keys_reuse_store(struct config_item *item,
> bool val;
> int r;
>
> + if (kexec_crash_image && crash_hotplug_support(kexec_crash_image)) {
> + pr_debug("Crash hotplug supported\n");
> + return -EINVAL;
> + }
> +
> if (!kexec_crash_image || !kexec_crash_image->dm_crypt_keys_addr) {
> pr_debug("dm-crypt keys haven't be saved to crash-reserved memory\n");
> return -EINVAL;
> @@ -513,9 +527,9 @@ int crash_load_dm_crypt_keys(struct kimage *image)
> void kexec_file_post_load_cleanup_dm_crypt(struct kimage *image)
> {
> /*
> - * For CPU/memory hot-plugging, the kdump image will be reloaded. Prevent
> - * keys_header from being cleaned up during unloading when
> - * is_dm_key_reused=true
> + * For CPU/memory hot-plugging without CONFIG_CRASH_HOTPLUG, the whole kdump
> + * image will be reloaded. Prevent keys_header from being cleaned up during
> + * unloading when is_dm_key_reused=true
> */
> if (!is_dm_key_reused) {
> kfree_sensitive(keys_header);
> @@ -526,6 +540,9 @@ void kexec_file_post_load_cleanup_dm_crypt(struct kimage *image)
> mutex_unlock(&config_keys_subsys.su_mutex);
> mutex_acquired = false;
> }
> +
> + if (crash_hotplug_support(image))
> + image->dm_crypt_keys_addr = 0;
> }
>
> static int __init configfs_dmcrypt_keys_init(void)
^ permalink raw reply [flat|nested] 24+ messages in thread* Re: [PATCH v3 09/10] crash_dump: Disallow configfs/crash_dm_crypt_key/reuse if crash hotplug supported
2026-08-05 12:09 ` Sourabh Jain
@ 2026-08-06 5:33 ` Coiby Xu
0 siblings, 0 replies; 24+ messages in thread
From: Coiby Xu @ 2026-08-06 5:33 UTC (permalink / raw)
To: Sourabh Jain
Cc: kexec, Andrew Morton, Baoquan He, Dave Young, Pratyush Yadav,
Mike Rapoport, Pasha Tatashin, Jonathan Corbet, Shuah Khan,
Coiby Xu, open list:DOCUMENTATION, open list
On Wed, Aug 05, 2026 at 05:39:28PM +0530, Sourabh Jain wrote:
>
>
>On 29/07/26 09:06, Coiby Xu wrote:
>>If crash hotplug is supported, dm-crypt keys saved to reserved memory
>>will be taken care of automatically. Thus it doesn't make sense to use
>>configfs/crash_dm_crypt_key/reuse. Reserving image->dm_crypt_keys_addr
>>is also unnecessary. Currently x86_64 and ppc64le have implemented
>>crash hotplug feature.
>>
>>Also update the doc accordingly. Note two doc issues are fixed as well.
>>
>>Fixes: 9ebfa8dcaea7 ("crash_dump: reuse saved dm crypt keys for CPU/memory hot-plugging")
>>Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
>>---
>> Documentation/admin-guide/kdump/kdump.rst | 16 ++++++++++------
>> kernel/crash_dump_dm_crypt.c | 23 ++++++++++++++++++++---
>> 2 files changed, 30 insertions(+), 9 deletions(-)
>>
>>diff --git a/Documentation/admin-guide/kdump/kdump.rst b/Documentation/admin-guide/kdump/kdump.rst
>>index 7587caadbae1..0bf2eb100a05 100644
>>--- a/Documentation/admin-guide/kdump/kdump.rst
>>+++ b/Documentation/admin-guide/kdump/kdump.rst
>>@@ -577,9 +577,10 @@ with /sys/kernel/config/crash_dm_crypt_keys for setup,
>> 1. Tell the first kernel what logon keys are needed to unlock the disk volumes,
>> # Add key #1
>>- mkdir /sys/kernel/config/crash_dm_crypt_keys/7d26b7b4-e342-4d2d-b660-7426b0996720
>>+ VOL1_UUID=7d26b7b4-e342-4d2d-b660-7426b0996720
>>+ mkdir /sys/kernel/config/crash_dm_crypt_keys/$VOL1_UUID
>> # Add key #1's description
>>- echo cryptsetup:7d26b7b4-e342-4d2d-b660-7426b0996720 > /sys/kernel/config/crash_dm_crypt_keys/description
>>+ echo cryptsetup:$VOL1_UUID > /sys/kernel/config/crash_dm_crypt_keys/$VOL1_UUID/description
>> # how many keys do we have now?
>> cat /sys/kernel/config/crash_dm_crypt_keys/count
>>@@ -591,15 +592,18 @@ with /sys/kernel/config/crash_dm_crypt_keys for setup,
>> cat /sys/kernel/config/crash_dm_crypt_keys/count
>> 2
>>- # To support CPU/memory hot-plugging, reuse keys already saved to reserved
>>- # memory
>>- echo true > /sys/kernel/config/crash_dm_crypt_key/reuse
>>-
>> 2. Load the dump-capture kernel
>> 3. After the dump-capture kerne get booted, restore the keys to user keyring
>> echo yes > /sys/kernel/crash_dm_crypt_keys/restore
>>+For CPU/memory hot-plugging, you can reuse keys already saved to reserved
>>+memory before reloading the kdump image,
>>+ echo true > /sys/kernel/config/crash_dm_crypt_keys/reuse
>>+
>>+Note if crash hotplug is supported, this API is totally unnecessary thus will
>>+be disabled automatically.
>>+
>> Contact
>> =======
>>diff --git a/kernel/crash_dump_dm_crypt.c b/kernel/crash_dump_dm_crypt.c
>>index b5b78656cf06..46d6b31c3ca4 100644
>>--- a/kernel/crash_dump_dm_crypt.c
>>+++ b/kernel/crash_dump_dm_crypt.c
>>@@ -310,6 +310,15 @@ static ssize_t config_keys_reuse_show(struct config_item *item, char *page)
>> return sysfs_emit(page, "%d\n", is_dm_key_reused);
>> }
>>+static bool crash_hotplug_support(struct kimage *image)
>>+{
>>+#ifdef CONFIG_CRASH_HOTPLUG
>>+ return image->hotplug_support;
>
>I don't think it is good idea to access kexec_crash_image properties without
>holding the kexec lock.
Thanks for raising the concern! Let's discuss this issue in [PATCH v3 03/10].
>
>Also, would it make sense to move this API somewhere else?
Can you help me understand why to move this API? Is it because using
ifdef in .c file is discouraged?
>
>- Sourabh Jain
[...]
--
Best regards,
Coiby
^ permalink raw reply [flat|nested] 24+ messages in thread
* [PATCH v3 10/10] Documentation: kdump: Add arm64 and ppc64le to encrypted dump target support list
2026-07-29 3:36 [PATCH v3 00/10] Bug fixes and enhancements for kdump LUKS support Coiby Xu
` (8 preceding siblings ...)
2026-07-29 3:36 ` [PATCH v3 09/10] crash_dump: Disallow configfs/crash_dm_crypt_key/reuse if crash hotplug supported Coiby Xu
@ 2026-07-29 3:36 ` Coiby Xu
2026-08-05 12:10 ` Sourabh Jain
9 siblings, 1 reply; 24+ messages in thread
From: Coiby Xu @ 2026-07-29 3:36 UTC (permalink / raw)
To: kexec
Cc: Andrew Morton, Sourabh Jain, Baoquan He, Dave Young,
Pratyush Yadav, Mike Rapoport, Pasha Tatashin, Jonathan Corbet,
Shuah Khan, Coiby Xu, Rob Herring (Arm), open list:DOCUMENTATION,
open list
The encrypted dump target support is now extended to arm64 and ppc64le.
Fixes: e3a84be1ec2f ("arm64,ppc64le/kdump: pass dm-crypt keys to kdump kernel")
Reported-by: Sourabh Jain <sourabhjain@linux.ibm.com>
Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
---
Documentation/admin-guide/kdump/kdump.rst | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Documentation/admin-guide/kdump/kdump.rst b/Documentation/admin-guide/kdump/kdump.rst
index 0bf2eb100a05..36ad6125c670 100644
--- a/Documentation/admin-guide/kdump/kdump.rst
+++ b/Documentation/admin-guide/kdump/kdump.rst
@@ -572,8 +572,8 @@ Write the dump file to encrypted disk volume
============================================
CONFIG_CRASH_DM_CRYPT can be enabled to support saving the dump file to an
-encrypted disk volume (only x86_64 supported for now). User space can interact
-with /sys/kernel/config/crash_dm_crypt_keys for setup,
+encrypted disk volume (only x86_64, arm64, ppc64le supported for now). User
+space can interact with /sys/kernel/config/crash_dm_crypt_keys for setup,
1. Tell the first kernel what logon keys are needed to unlock the disk volumes,
# Add key #1
--
2.55.0
^ permalink raw reply related [flat|nested] 24+ messages in thread* Re: [PATCH v3 10/10] Documentation: kdump: Add arm64 and ppc64le to encrypted dump target support list
2026-07-29 3:36 ` [PATCH v3 10/10] Documentation: kdump: Add arm64 and ppc64le to encrypted dump target support list Coiby Xu
@ 2026-08-05 12:10 ` Sourabh Jain
0 siblings, 0 replies; 24+ messages in thread
From: Sourabh Jain @ 2026-08-05 12:10 UTC (permalink / raw)
To: Coiby Xu, kexec
Cc: Andrew Morton, Baoquan He, Dave Young, Pratyush Yadav,
Mike Rapoport, Pasha Tatashin, Jonathan Corbet, Shuah Khan,
Coiby Xu, Rob Herring (Arm), open list:DOCUMENTATION, open list
On 29/07/26 09:06, Coiby Xu wrote:
> The encrypted dump target support is now extended to arm64 and ppc64le.
>
> Fixes: e3a84be1ec2f ("arm64,ppc64le/kdump: pass dm-crypt keys to kdump kernel")
> Reported-by: Sourabh Jain <sourabhjain@linux.ibm.com>
> Signed-off-by: Coiby Xu <coiby.xu@gmail.com>
> ---
> Documentation/admin-guide/kdump/kdump.rst | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/Documentation/admin-guide/kdump/kdump.rst b/Documentation/admin-guide/kdump/kdump.rst
> index 0bf2eb100a05..36ad6125c670 100644
> --- a/Documentation/admin-guide/kdump/kdump.rst
> +++ b/Documentation/admin-guide/kdump/kdump.rst
> @@ -572,8 +572,8 @@ Write the dump file to encrypted disk volume
> ============================================
>
> CONFIG_CRASH_DM_CRYPT can be enabled to support saving the dump file to an
> -encrypted disk volume (only x86_64 supported for now). User space can interact
> -with /sys/kernel/config/crash_dm_crypt_keys for setup,
> +encrypted disk volume (only x86_64, arm64, ppc64le supported for now). User
> +space can interact with /sys/kernel/config/crash_dm_crypt_keys for setup,
>
> 1. Tell the first kernel what logon keys are needed to unlock the disk volumes,
> # Add key #1
Changes look good to me. Feel free to add.
Reviewed-by: Sourabh Jain <sourabhjain@linux.ibm.com>
^ permalink raw reply [flat|nested] 24+ messages in thread