All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Mike Rapoport (Microsoft)" <rppt@kernel.org>
Cc: "Alexander Gordeev" <agordeev@linux.ibm.com>,
	linux-s390@vger.kernel.org, "Heiko Carstens" <hca@linux.ibm.com>,
	"Vasily Gorbik" <gor@linux.ibm.com>,
	"Christian Borntraeger" <borntraeger@linux.ibm.com>
Subject: Re: [PATCH 07/13] s390/idals: Use kmalloc() for IDAL data buffers
Date: Mon, 07 Sep 2026 10:38:41 +0000	[thread overview]
Message-ID: <20260907103842.27ADA1F00A3A@smtp.kernel.org> (raw)
In-Reply-To: <20260907-s390-cio-ready-v1-7-ca7f39806234@kernel.org>

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:

New issues:
- [High] Replacing __get_free_pages() with kmalloc() violates the strict 4K page-alignment requirement for s390 Indirect Data Address Words (IDAWs), leading to hardware I/O rejection and out-of-bounds memory access.
- [Medium] Kmemleak will falsely report IDAL data chunks as memory leaks because only their physical addresses are stored.

Pre-existing issues:
- [High] Unprotected concurrent modification of device->char_data.ibs in tape_check_idalbuffer() leading to a Use-After-Free.
--

commit ee00e66345d4d1d6997d0f2f7bda11ae7ad10516
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.
These buffers can be allocated with kmalloc() as there's nothing special
about them to go directly to the page allocator.

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..248829d461bce 100644
> --- a/arch/s390/include/asm/idals.h
> +++ b/arch/s390/include/asm/idals.h
> @@ -147,7 +147,7 @@ static inline struct idal_buffer *idal_buffer_alloc(size_t size, int page_order)
>  			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: High]
Does replacing __get_free_pages() with kmalloc() violate the strict 4K
page-alignment requirement for s390 Indirect Data Address Words (IDAWs)?

kmalloc() with memory debugging enabled (like SLUB redzoning) can return
unaligned addresses for PAGE_SIZE allocations. Since the s390 Channel
Subsystem mandates that second and subsequent IDAWs must be aligned to a
4K boundary, could this unaligned address cause hardware I/O rejection?

Additionally, if the base address is unaligned, does adding 4K via
dma64_add() result in out-of-bounds array access, since the nr_ptrs
calculation mathematically assumes a 4K-aligned start address?

>  		if (!vaddr)
>  			goto error;
>  		ib->data[i] = virt_to_dma64(vaddr);

[Severity: Medium]
Will kmemleak falsely report these IDAL data chunks as memory leaks?

Since virt_to_dma64() stores the physical address, the kmemleak scanner
won't find the exact virtual address bit pattern returned by kmalloc()
during its garbage collection scan.

[ ... ]

This is a pre-existing issue, but I noticed a potential race condition in
the tape driver when checking IDAL buffers.

In drivers/s390/char/tape_char.c:tapechar_read():

    rc = tape_check_idalbuffer(device, block_size);

And in drivers/s390/char/tape_core.c:tape_check_idalbuffer():

    idal_buffer_array_free(&device->char_data.ibs);
    device->char_data.ibs = new;

[Severity: High]
If two threads call read() or write() concurrently without device->mutex
being held, could one thread free device->char_data.ibs while the other
is executing tape_do_io() or iterating over the old ibs array? Can this
lead to a use-after-free or data corruption?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260907-s390-cio-ready-v1-0-ca7f39806234@kernel.org?part=7

  reply	other threads:[~2026-09-07 10:38 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-07 10:23 [PATCH 00/13] s390/cio: replace page allocator calls with k[mz]alloc() Mike Rapoport (Microsoft)
2026-09-07 10:23 ` [PATCH 01/13] s390/chsc: Use kzalloc() for CUBs Mike Rapoport (Microsoft)
2026-09-07 10:37   ` sashiko-bot
2026-09-07 10:56     ` Mike Rapoport
2026-09-07 10:23 ` [PATCH 02/13] s390/chsc: Use kzalloc() for the SEI work area Mike Rapoport (Microsoft)
2026-09-07 10:34   ` sashiko-bot
2026-09-07 10:23 ` [PATCH 03/13] s390/chsc_sch: Use kzalloc() for CHSC requests Mike Rapoport (Microsoft)
2026-09-07 10:39   ` sashiko-bot
2026-09-07 10:23 ` [PATCH 04/13] s390/chsc_sch: Use __free(kfree) for synchronous " Mike Rapoport (Microsoft)
2026-09-07 10:30   ` sashiko-bot
2026-09-07 10:23 ` [PATCH 05/13] s390/cio: Use kzalloc() for CHSC work areas Mike Rapoport (Microsoft)
2026-09-07 10:37   ` sashiko-bot
2026-09-07 10:23 ` [PATCH 06/13] s390/cmf: Use kmalloc() for the CMB area Mike Rapoport (Microsoft)
2026-09-07 10:35   ` sashiko-bot
2026-09-07 10:59     ` Mike Rapoport
2026-09-07 10:23 ` [PATCH 07/13] s390/idals: Use kmalloc() for IDAL data buffers Mike Rapoport (Microsoft)
2026-09-07 10:38   ` sashiko-bot [this message]
2026-09-07 10:23 ` [PATCH 08/13] s390/qdio_main: Use kzalloc() for the IRQ structure Mike Rapoport (Microsoft)
2026-09-07 10:38   ` sashiko-bot
2026-09-07 10:23 ` [PATCH 09/13] s390/qdio_main: Use kzalloc() for the QDR Mike Rapoport (Microsoft)
2026-09-07 10:33   ` sashiko-bot
2026-09-07 10:23 ` [PATCH 10/13] s390/qdio_setup: Use kzalloc() for QDIO buffers Mike Rapoport (Microsoft)
2026-09-07 10:36   ` sashiko-bot
2026-09-07 10:23 ` [PATCH 11/13] s390/qdio_setup: Use kzalloc() for the storage list Mike Rapoport (Microsoft)
2026-09-07 10:42   ` sashiko-bot
2026-09-07 10:23 ` [PATCH 12/13] s390/qdio_setup: Use kzalloc() for the SSQD request Mike Rapoport (Microsoft)
2026-09-07 10:43   ` sashiko-bot
2026-09-07 10:23 ` [PATCH 13/13] s390/scm: Use kmalloc() for SCM information Mike Rapoport (Microsoft)
2026-09-07 10:44   ` sashiko-bot

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=20260907103842.27ADA1F00A3A@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.