Re: [PATCHv2 2/2] kernel/kexec: Fix IMA when allocation happens in CMA area

Baoquan He
2025-11-07T09:34:32Z

On 11/06/25 at 02:59pm, Pingfan Liu wrote:
> When I tested kexec with the latest kernel, I ran into the following warning:
>
> [ 40.712410] ------------[ cut here ]------------
> [ 40.712576] WARNING: CPU: 2 PID: 1562 at kernel/kexec_core.c:1001 kimage_map_segment+0x144/0x198
> [...]
> [ 40.816047] Call trace:
> [ 40.818498] kimage_map_segment+0x144/0x198 (P)
> [ 40.823221] ima_kexec_post_load+0x58/0xc0
> [ 40.827246] __do_sys_kexec_file_load+0x29c/0x368
> [...]
> [ 40.855423] ---[ end trace 0000000000000000 ]---
>
> This is caused by the fact that kexec allocates the destination directly
> in the CMA area. In that case, the CMA kernel address should be exported
> directly to the IMA component, instead of using the vmalloc'd address.
>
> Fixes: 07d24902977e ("kexec: enable CMA based contiguous allocation")
> Signed-off-by: Pingfan Liu <piliu@redhat.com>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Baoquan He <bhe@redhat.com>
> Cc: Alexander Graf <graf@amazon.com>
> Cc: Steven Chen <chenste@linux.microsoft.com>
> Cc: linux-integrity@vger.kernel.org
> Cc: <stable@vger.kernel.org>
> To: kexec@lists.infradead.org
> ---
> v1 -> v2:
> return page_address(page) instead of *page
>
> kernel/kexec_core.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c
> index 9a1966207041..332204204e53 100644
> --- a/kernel/kexec_core.c
> +++ b/kernel/kexec_core.c
> @@ -967,6 +967,7 @@ void *kimage_map_segment(struct kimage *image, int idx)
> kimage_entry_t *ptr, entry;
> struct page **src_pages;
> unsigned int npages;
> + struct page *cma;
> void *vaddr = NULL;
> int i;
>
> @@ -974,6 +975,9 @@ void *kimage_map_segment(struct kimage *image, int idx)
> size = image->segment[idx].memsz;
> eaddr = addr + size;
>
> + cma = image->segment_cma[idx];
> + if (cma)
> + return page_address(cma);

This judgement can be put above the addr/size/eaddr assignment lines?

If you agree, maybe you can update the patch log by adding more details
to explain the root cause so that people can understand it easier.

> /*
> * Collect the source pages and map them in a contiguous VA range.
> */
> @@ -1014,7 +1018,8 @@ void *kimage_map_segment(struct kimage *image, int idx)
>
> void kimage_unmap_segment(void *segment_buffer)
> {
> - vunmap(segment_buffer);
> + if (is_vmalloc_addr(segment_buffer))
> + vunmap(segment_buffer);
> }
>
> struct kexec_load_limit {
> --
> 2.49.0
>