From 3d93c24d3923be67ecfdc0d2522c8cf12fdc84b9 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 27 Aug 2024 15:17:18 +0200 Subject: [PATCH] 6.6-stable patches added patches: revert-s390-dasd-establish-dma-alignment.patch --- ...rt-s390-dasd-establish-dma-alignment.patch | 96 +++++++++++++++++++ queue-6.6/series | 1 + 2 files changed, 97 insertions(+) create mode 100644 queue-6.6/revert-s390-dasd-establish-dma-alignment.patch diff --git a/queue-6.6/revert-s390-dasd-establish-dma-alignment.patch b/queue-6.6/revert-s390-dasd-establish-dma-alignment.patch new file mode 100644 index 00000000000..e53833914c8 --- /dev/null +++ b/queue-6.6/revert-s390-dasd-establish-dma-alignment.patch @@ -0,0 +1,96 @@ +From hoeppner@linux.ibm.com Tue Aug 27 15:13:30 2024 +From: "Jan Höppner" +Date: Tue, 20 Aug 2024 16:13:07 +0200 +Subject: Revert "s390/dasd: Establish DMA alignment" +To: gregkh@linuxfoundation.org +Cc: stable@vger.kernel.org, sth@linux.ibm.com +Message-ID: <20240820141307.2869182-1-hoeppner@linux.ibm.com> + +From: "Jan Höppner" + +This reverts commit bc792884b76f ("s390/dasd: Establish DMA alignment"). + +Quoting the original commit: + linux-next commit bf8d08532bc1 ("iomap: add support for dma aligned + direct-io") changes the alignment requirement to come from the block + device rather than the block size, and the default alignment + requirement is 512-byte boundaries. Since DASD I/O has page + alignments for IDAW/TIDAW requests, let's override this value to + restore the expected behavior. + +I mentioned TIDAW, but that was wrong. TIDAWs have no distinct alignment +requirement (per p. 15-70 of POPS SA22-7832-13): + + Unless otherwise specified, TIDAWs may designate + a block of main storage on any boundary and length + up to 4K bytes, provided the specified block does not + cross a 4 K-byte boundary. + +IDAWs do, but the original commit neglected that while ECKD DASD are +typically formatted in 4096-byte blocks, they don't HAVE to be. Formatting +an ECKD volume with smaller blocks is permitted (dasdfmt -b xxx), and the +problematic commit enforces alignment properties to such a device that +will result in errors, such as: + + [test@host ~]# lsdasd -l a367 | grep blksz + blksz: 512 + [test@host ~]# mkfs.xfs -f /dev/disk/by-path/ccw-0.0.a367-part1 + meta-data=/dev/dasdc1 isize=512 agcount=4, agsize=230075 blks + = sectsz=512 attr=2, projid32bit=1 + = crc=1 finobt=1, sparse=1, rmapbt=1 + = reflink=1 bigtime=1 inobtcount=1 nrext64=1 + data = bsize=4096 blocks=920299, imaxpct=25 + = sunit=0 swidth=0 blks + naming =version 2 bsize=4096 ascii-ci=0, ftype=1 + log =internal log bsize=4096 blocks=16384, version=2 + = sectsz=512 sunit=0 blks, lazy-count=1 + realtime =none extsz=4096 blocks=0, rtextents=0 + error reading existing superblock: Invalid argument + mkfs.xfs: pwrite failed: Invalid argument + libxfs_bwrite: write failed on (unknown) bno 0x70565c/0x100, err=22 + mkfs.xfs: Releasing dirty buffer to free list! + found dirty buffer (bulk) on free list! + mkfs.xfs: pwrite failed: Invalid argument + ...snipped... + +The original commit omitted the FBA discipline for just this reason, +but the formatted block size of the other disciplines was overlooked. +The solution to all of this is to revert to the original behavior, +such that the block size can be respected. + +But what of the original problem? That was manifested with a direct-io +QEMU guest, where QEMU itself was changed a month or two later with +commit 25474d90aa ("block: use the request length for iov alignment") +such that the blamed kernel commit is unnecessary. + +Note: This is an adapted version of the original upstream commit +2a07bb64d801 ("s390/dasd: Remove DMA alignment"). + +Cc: stable@vger.kernel.org # 6.0+ +Signed-off-by: Jan Höppner +Signed-off-by: Greg Kroah-Hartman +--- + drivers/s390/block/dasd_diag.c | 1 - + drivers/s390/block/dasd_eckd.c | 1 - + 2 files changed, 2 deletions(-) + +--- a/drivers/s390/block/dasd_diag.c ++++ b/drivers/s390/block/dasd_diag.c +@@ -639,7 +639,6 @@ static void dasd_diag_setup_blk_queue(st + /* With page sized segments each segment can be translated into one idaw/tidaw */ + blk_queue_max_segment_size(q, PAGE_SIZE); + blk_queue_segment_boundary(q, PAGE_SIZE - 1); +- blk_queue_dma_alignment(q, PAGE_SIZE - 1); + } + + static int dasd_diag_pe_handler(struct dasd_device *device, +--- a/drivers/s390/block/dasd_eckd.c ++++ b/drivers/s390/block/dasd_eckd.c +@@ -6888,7 +6888,6 @@ static void dasd_eckd_setup_blk_queue(st + /* With page sized segments each segment can be translated into one idaw/tidaw */ + blk_queue_max_segment_size(q, PAGE_SIZE); + blk_queue_segment_boundary(q, PAGE_SIZE - 1); +- blk_queue_dma_alignment(q, PAGE_SIZE - 1); + } + + static struct ccw_driver dasd_eckd_driver = { diff --git a/queue-6.6/series b/queue-6.6/series index 803340633b0..6a7ffdf7fca 100644 --- a/queue-6.6/series +++ b/queue-6.6/series @@ -337,3 +337,4 @@ drm-amdgpu-vcn-identify-unified-queue-in-sw-init.patch drm-amdgpu-vcn-not-pause-dpg-for-unified-queue.patch ksmbd-fix-race-condition-between-destroy_previous_session-and-smb2-operations.patch net-ngbe-fix-phy-mode-set-to-external-phy.patch +revert-s390-dasd-establish-dma-alignment.patch -- 2.47.3