Linux s390 Architecture development
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Mike Rapoport (Microsoft)" <rppt@kernel.org>
Cc: "Vasily Gorbik" <gor@linux.ibm.com>,
	"Alexander Gordeev" <agordeev@linux.ibm.com>,
	"Heiko Carstens" <hca@linux.ibm.com>,
	linux-s390@vger.kernel.org,
	"Christian Borntraeger" <borntraeger@linux.ibm.com>
Subject: Re: [PATCH v3 07/13] s390/idals: Use kmalloc() for IDAL data buffers
Date: Wed, 16 Sep 2026 12:16:43 +0000	[thread overview]
Message-ID: <20260916121644.6FEF71F000FF@smtp.kernel.org> (raw)
In-Reply-To: <20260916-s390-cio-ready-v3-7-39e4894637d6@kernel.org>

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Critical] s390/idals: hardware alignment violation in IDAL buffers due to kmalloc()
--

commit d18db8674582ba776adea76af1cc752b0a5fcd3a
Author: Mike Rapoport (Microsoft) <rppt@kernel.org>

s390/idals: Use kmalloc() for IDAL data buffers

idal_buffer_alloc() allocates the data chunks of an IDAL buffer that is
used for channel I/O. Replace use of __get_free_pages() with kmalloc()
and free_pages() with kfree().

Link: https://lore.kernel.org/all/635405e4-9423-4a25-a6e7-e03c8ea0bcbe@redhat.com

> diff --git a/arch/s390/include/asm/idals.h b/arch/s390/include/asm/idals.h
> index 06e1ec2afd5af..213f430a8d33a 100644
> --- a/arch/s390/include/asm/idals.h
> +++ b/arch/s390/include/asm/idals.h

[ ... ]

> @@ -135,21 +136,23 @@ struct idal_buffer {
>   * Allocate an idal buffer
>   */
>  static inline struct idal_buffer *idal_buffer_alloc(size_t size, int page_order)
>  {
>  	int nr_chunks, nr_ptrs, i;
>  	struct idal_buffer *ib;
>  	void *vaddr;
>  
>  	nr_ptrs = (size + IDA_BLOCK_SIZE - 1) >> IDA_SIZE_SHIFT;
>  	nr_chunks = (PAGE_SIZE << page_order) >> IDA_SIZE_SHIFT;
>  	ib = kmalloc_flex(*ib, data, nr_ptrs, GFP_DMA | GFP_KERNEL);
>  	if (!ib)
>  		return ERR_PTR(-ENOMEM);
>  	ib->size = size;
>  	ib->page_order = page_order;
>  	for (i = 0; i < nr_ptrs; i++) {
>  		if (i & (nr_chunks - 1)) {
>  			ib->data[i] = dma64_add(ib->data[i - 1], IDA_BLOCK_SIZE);
>  			continue;
>  		}
> -		vaddr = (void *)__get_free_pages(GFP_KERNEL, page_order);
> +		vaddr = kmalloc(PAGE_SIZE << page_order, GFP_KERNEL);

[Severity: Critical]
Does using kmalloc() here drop the hardware alignment guarantees required for
IDAL data buffers?

The s390 Channel Subsystem strictly requires all Indirect Data Address Words
(IDAWs), except the first, to be aligned to absolute 2K or 4K boundaries.

kmalloc() does not guarantee page alignment, especially when debugging options
like SLAB_RED_ZONE or KFENCE are enabled.

If an unaligned address is returned and passed to the channel subsystem, it
will generate a program check (I/O error).

Also, subsequent IDAW addresses are computed from the base pointer slightly
earlier in this loop:

	ib->data[i] = dma64_add(ib->data[i - 1], IDA_BLOCK_SIZE);

If the base pointer from kmalloc() is unaligned, does this corrupt all
subsequent IDAWs and violate the hardware alignment rules?

Furthermore, if the first IDAW is unaligned, the hardware transfers data only
up to the next 4K boundary (fewer than 4096 bytes).

The software size calculation earlier in idal_buffer_alloc() assumes exactly
4096 bytes are transferred per IDAW:

	nr_ptrs = (size + IDA_BLOCK_SIZE - 1) >> IDA_SIZE_SHIFT;

To satisfy the total transfer count, will the hardware attempt to fetch more
IDAWs than were allocated in the ib->data array?

This could lead to an out-of-bounds read where the hardware interprets random
data past the array bounds as a physical address, causing silent memory
corruption during DMA I/O.

>  		if (!vaddr)
>  			goto error;
> +		/* Only DMA addresses are retained in ib->data. */
> +		kmemleak_ignore(vaddr);
>  		ib->data[i] = virt_to_dma64(vaddr);
>  	}
>  	return ib;

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260916-s390-cio-ready-v3-0-39e4894637d6@kernel.org?part=7

  reply	other threads:[~2026-09-16 12:16 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-16 12:03 [PATCH v3 00/13] s390/cio: replace page allocator calls with k[mz]alloc() Mike Rapoport (Microsoft)
2026-09-16 12:03 ` [PATCH v3 01/13] s390/chsc: Use kzalloc() for CUBs Mike Rapoport (Microsoft)
2026-09-16 12:15   ` sashiko-bot
2026-09-16 12:03 ` [PATCH v3 02/13] s390/chsc: Use kzalloc() for the SEI work area Mike Rapoport (Microsoft)
2026-09-16 12:15   ` sashiko-bot
2026-09-16 12:03 ` [PATCH v3 03/13] s390/chsc_sch: Use kzalloc() for CHSC requests Mike Rapoport (Microsoft)
2026-09-16 12:14   ` sashiko-bot
2026-09-16 12:03 ` [PATCH v3 04/13] s390/chsc_sch: Use __free(kfree) for synchronous " Mike Rapoport (Microsoft)
2026-09-16 12:10   ` sashiko-bot
2026-09-16 12:03 ` [PATCH v3 05/13] s390/cio: Use kzalloc() for CHSC work areas Mike Rapoport (Microsoft)
2026-09-16 12:12   ` sashiko-bot
2026-09-16 12:03 ` [PATCH v3 06/13] s390/cmf: Use kmalloc() for the CMB area Mike Rapoport (Microsoft)
2026-09-16 12:18   ` sashiko-bot
2026-09-16 12:03 ` [PATCH v3 07/13] s390/idals: Use kmalloc() for IDAL data buffers Mike Rapoport (Microsoft)
2026-09-16 12:16   ` sashiko-bot [this message]
2026-09-16 12:03 ` [PATCH v3 08/13] s390/qdio_main: Use kzalloc() for the IRQ structure Mike Rapoport (Microsoft)
2026-09-16 12:17   ` sashiko-bot
2026-09-16 12:03 ` [PATCH v3 09/13] s390/qdio_main: Use kzalloc() for the QDR Mike Rapoport (Microsoft)
2026-09-16 12:16   ` sashiko-bot
2026-09-16 12:03 ` [PATCH v3 10/13] s390/qdio_setup: Use kzalloc() for QDIO buffers Mike Rapoport (Microsoft)
2026-09-16 12:21   ` sashiko-bot
2026-09-16 12:03 ` [PATCH v3 11/13] s390/qdio_setup: Use kmalloc() for the storage list Mike Rapoport (Microsoft)
2026-09-16 12:23   ` sashiko-bot
2026-09-16 12:03 ` [PATCH v3 12/13] s390/qdio_setup: Use kmalloc() for the SSQD request Mike Rapoport (Microsoft)
2026-09-16 12:23   ` sashiko-bot
2026-09-16 12:03 ` [PATCH v3 13/13] s390/scm: Use kmalloc() for SCM information Mike Rapoport (Microsoft)
2026-09-16 12:23   ` sashiko-bot
2026-09-16 13:06 ` [PATCH v3 00/13] s390/cio: replace page allocator calls with k[mz]alloc() Heiko Carstens
2026-09-18 16:23   ` Peter Oberparleiter
2026-09-20 18:20     ` Heiko Carstens

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260916121644.6FEF71F000FF@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=agordeev@linux.ibm.com \
    --cc=borntraeger@linux.ibm.com \
    --cc=gor@linux.ibm.com \
    --cc=hca@linux.ibm.com \
    --cc=linux-s390@vger.kernel.org \
    --cc=rppt@kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox