- kvm-file-posix-probe-discard-alignment-on-Linux-block-de.patch [RHEL-87642] - kvm-block-io-skip-head-tail-requests-on-EINVAL.patch [RHEL-87642] - kvm-file-posix-Fix-crash-on-discard_granularity-0.patch [RHEL-87642] - kvm-Enable-vhost-user-gpu-pci-for-RHIVOS.patch [RHEL-86056] - Resolves: RHEL-87642 (QEMU sends unaligned discards on 4K devices[RHEL-10]) - Resolves: RHEL-86056 (Enable 'vhost-user-gpu-pci' in qemu-kvm for RHIVOS)
75 lines
3.1 KiB
Diff
75 lines
3.1 KiB
Diff
From 8d520ef6e8959a017535ecfc556b067e4b118cb7 Mon Sep 17 00:00:00 2001
|
|
From: Stefan Hajnoczi <stefanha@redhat.com>
|
|
Date: Thu, 17 Apr 2025 11:05:28 -0400
|
|
Subject: [PATCH 2/4] block/io: skip head/tail requests on EINVAL
|
|
|
|
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
|
|
RH-MergeRequest: 354: file-posix: probe discard alignment on Linux block devices
|
|
RH-Jira: RHEL-87642
|
|
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
|
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
|
RH-Commit: [2/3] 5fddeb3ba2df7c61cdb8dd709e56914f3b5c0972 (stefanha/centos-stream-qemu-kvm)
|
|
|
|
When guests send misaligned discard requests, the block layer breaks
|
|
them up into a misaligned head, an aligned main body, and a misaligned
|
|
tail.
|
|
|
|
The file-posix block driver on Linux returns -EINVAL on misaligned
|
|
discard requests. This causes bdrv_co_pdiscard() to fail and guests
|
|
configured with werror=stop will pause.
|
|
|
|
Add a special case for misaligned head/tail requests. Simply continue
|
|
when EINVAL is encountered so that the aligned main body of the request
|
|
can be completed and the guest is not paused. This is the best we can do
|
|
when guest discard limits do not match the host discard limits.
|
|
|
|
Fixes: https://issues.redhat.com/browse/RHEL-86032
|
|
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
Reviewed-by: Hanna Czenczek <hreitz@redhat.com>
|
|
Message-ID: <20250417150528.76470-3-stefanha@redhat.com>
|
|
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
|
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
(cherry picked from commit 4733cb0833c4b223f92ec0136980eeb5239ecb87)
|
|
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
---
|
|
block/io.c | 15 ++++++++++-----
|
|
1 file changed, 10 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/block/io.c b/block/io.c
|
|
index 1ba8d1aeea..ccec11386b 100644
|
|
--- a/block/io.c
|
|
+++ b/block/io.c
|
|
@@ -3109,11 +3109,12 @@ int coroutine_fn bdrv_co_pdiscard(BdrvChild *child, int64_t offset,
|
|
/* Invalidate the cached block-status data range if this discard overlaps */
|
|
bdrv_bsc_invalidate_range(bs, offset, bytes);
|
|
|
|
- /* Discard is advisory, but some devices track and coalesce
|
|
+ /*
|
|
+ * Discard is advisory, but some devices track and coalesce
|
|
* unaligned requests, so we must pass everything down rather than
|
|
- * round here. Still, most devices will just silently ignore
|
|
- * unaligned requests (by returning -ENOTSUP), so we must fragment
|
|
- * the request accordingly. */
|
|
+ * round here. Still, most devices reject unaligned requests with
|
|
+ * -EINVAL or -ENOTSUP, so we must fragment the request accordingly.
|
|
+ */
|
|
align = MAX(bs->bl.pdiscard_alignment, bs->bl.request_alignment);
|
|
assert(align % bs->bl.request_alignment == 0);
|
|
head = offset % align;
|
|
@@ -3180,7 +3181,11 @@ int coroutine_fn bdrv_co_pdiscard(BdrvChild *child, int64_t offset,
|
|
}
|
|
}
|
|
if (ret && ret != -ENOTSUP) {
|
|
- goto out;
|
|
+ if (ret == -EINVAL && (offset % align != 0 || num % align != 0)) {
|
|
+ /* Silently skip rejected unaligned head/tail requests */
|
|
+ } else {
|
|
+ goto out; /* bail out */
|
|
+ }
|
|
}
|
|
|
|
offset += num;
|
|
--
|
|
2.39.3
|
|
|