88586bd480
- kvm-s390x-css-Introduce-an-ESW-struct.patch [bz#1957194] - kvm-s390x-css-Split-out-the-IRB-sense-data.patch [bz#1957194] - kvm-s390x-css-Refactor-IRB-construction.patch [bz#1957194] - kvm-s390x-css-Add-passthrough-IRB.patch [bz#1957194] - kvm-vhost-user-blk-Fail-gracefully-on-too-large-queue-si.patch [bz#1957194] - kvm-vhost-user-blk-Make-sure-to-set-Error-on-realize-fai.patch [bz#1957194] - kvm-vhost-user-blk-Don-t-reconnect-during-initialisation.patch [bz#1957194] - kvm-vhost-user-blk-Improve-error-reporting-in-realize.patch [bz#1957194] - kvm-vhost-user-blk-Get-more-feature-flags-from-vhost-dev.patch [bz#1957194] - kvm-virtio-Fail-if-iommu_platform-is-requested-but-unsup.patch [bz#1957194] - kvm-vhost-user-blk-Check-that-num-queues-is-supported-by.patch [bz#1957194] - kvm-vhost-user-Fix-backends-without-multiqueue-support.patch [bz#1957194] - kvm-file-posix-fix-max_iov-for-dev-sg-devices.patch [bz#1957194] - kvm-scsi-generic-pass-max_segments-via-max_iov-field-in-.patch [bz#1957194] - kvm-osdep-provide-ROUND_DOWN-macro.patch [bz#1957194] - kvm-block-backend-align-max_transfer-to-request-alignmen.patch [bz#1957194] - kvm-block-add-max_hw_transfer-to-BlockLimits.patch [bz#1957194] - kvm-file-posix-try-BLKSECTGET-on-block-devices-too-do-no.patch [bz#1957194] - kvm-block-Add-option-to-use-driver-whitelist-even-in-too.patch [bz#1957782] - kvm-spec-Restrict-block-drivers-in-tools.patch [bz#1957782] - kvm-Move-tools-to-separate-package.patch [bz#1972285] - kvm-Split-qemu-pr-helper-to-separate-package.patch [bz#1972300] - kvm-spec-RPM_BUILD_ROOT-buildroot.patch [bz#1973029] - kvm-spec-More-use-of-name-instead-of-qemu-kvm.patch [bz#1973029] - kvm-spec-Use-qemu-pr-helper.service-from-qemu.git.patch [bz#1973029] - kvm-spec-Use-_sourcedir-for-referencing-sources.patch [bz#1973029] - kvm-spec-Add-tools_only.patch [bz#1973029] - kvm-spec-build-Add-run_configure-helper.patch [bz#1973029] - kvm-spec-build-Disable-more-bits-with-disable_everything.patch [bz#1973029] - kvm-spec-build-Add-macros-for-some-configure-parameters.patch [bz#1973029] - kvm-spec-files-Move-qemu-guest-agent-and-qemu-img-earlie.patch [bz#1973029] - kvm-spec-install-Remove-redundant-bits.patch [bz#1973029] - kvm-spec-install-Add-modprobe_kvm_conf-macro.patch [bz#1973029] - kvm-spec-install-Remove-qemu-guest-agent-etc-qemu-kvm-us.patch [bz#1973029] - kvm-spec-install-clean-up-qemu-ga-section.patch [bz#1973029] - kvm-spec-install-Use-a-single-tools_only-section.patch [bz#1973029] - kvm-spec-Make-tools_only-not-cross-spec-sections.patch [bz#1973029] - kvm-spec-install-Limit-time-spent-in-qemu_kvm_build.patch [bz#1973029] - kvm-spec-misc-syntactic-merges-with-Fedora.patch [bz#1973029] - kvm-spec-Use-Fedora-s-pattern-for-specifying-rc-version.patch [bz#1973029] - kvm-spec-files-don-t-use-fine-grained-docs-file-list.patch [bz#1973029] - kvm-spec-files-Add-licenses-to-qemu-common-too.patch [bz#1973029] - kvm-spec-install-Drop-python3-shebang-fixup.patch [bz#1973029] - Resolves: bz#1957194 (Synchronize RHEL-AV 8.5.0 changes to RHEL 9.0.0 Beta) - Resolves: bz#1957782 (VMDK support should be read-only) - Resolves: bz#1972285 (Split out a qemu-kvm-tools subpackage) - Resolves: bz#1972300 (Split out a qemu-pr-helper subpackage) - Resolves: bz#1973029 (Spec file cleanups)
132 lines
5.4 KiB
Diff
132 lines
5.4 KiB
Diff
From 6773549977d94c504ec76aed67506ae85adff973 Mon Sep 17 00:00:00 2001
|
|
From: Paolo Bonzini <pbonzini@redhat.com>
|
|
Date: Fri, 16 Jul 2021 16:51:33 -0400
|
|
Subject: [PATCH 17/43] block: add max_hw_transfer to BlockLimits
|
|
|
|
RH-Author: Miroslav Rezanina <mrezanin@redhat.com>
|
|
RH-Bugzilla: 1957194
|
|
|
|
For block host devices, I/O can happen through either the kernel file
|
|
descriptor I/O system calls (preadv/pwritev, io_submit, io_uring)
|
|
or the SCSI passthrough ioctl SG_IO.
|
|
|
|
In the latter case, the size of each transfer can be limited by the
|
|
HBA, while for file descriptor I/O the kernel is able to split and
|
|
merge I/O in smaller pieces as needed. Applying the HBA limits to
|
|
file descriptor I/O results in more system calls and suboptimal
|
|
performance, so this patch splits the max_transfer limit in two:
|
|
max_transfer remains valid and is used in general, while max_hw_transfer
|
|
is limited to the maximum hardware size. max_hw_transfer can then be
|
|
included by the scsi-generic driver in the block limits page, to ensure
|
|
that the stricter hardware limit is used.
|
|
|
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
(cherry picked from commit 24b36e9813ec15da7db62e3b3621730710c5f020)
|
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
|
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
---
|
|
block/block-backend.c | 13 +++++++++++++
|
|
block/file-posix.c | 2 +-
|
|
block/io.c | 2 ++
|
|
hw/scsi/scsi-generic.c | 2 +-
|
|
include/block/block_int.h | 7 +++++++
|
|
include/sysemu/block-backend.h | 1 +
|
|
6 files changed, 25 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/block/block-backend.c b/block/block-backend.c
|
|
index 136cc602c5..b5f5b4b048 100644
|
|
--- a/block/block-backend.c
|
|
+++ b/block/block-backend.c
|
|
@@ -1939,6 +1939,19 @@ uint32_t blk_get_request_alignment(BlockBackend *blk)
|
|
return bs ? bs->bl.request_alignment : BDRV_SECTOR_SIZE;
|
|
}
|
|
|
|
+/* Returns the maximum hardware transfer length, in bytes; guaranteed nonzero */
|
|
+uint64_t blk_get_max_hw_transfer(BlockBackend *blk)
|
|
+{
|
|
+ BlockDriverState *bs = blk_bs(blk);
|
|
+ uint64_t max = INT_MAX;
|
|
+
|
|
+ if (bs) {
|
|
+ max = MIN_NON_ZERO(max, bs->bl.max_hw_transfer);
|
|
+ max = MIN_NON_ZERO(max, bs->bl.max_transfer);
|
|
+ }
|
|
+ return ROUND_DOWN(max, blk_get_request_alignment(blk));
|
|
+}
|
|
+
|
|
/* Returns the maximum transfer length, in bytes; guaranteed nonzero */
|
|
uint32_t blk_get_max_transfer(BlockBackend *blk)
|
|
{
|
|
diff --git a/block/file-posix.c b/block/file-posix.c
|
|
index 1a6c799e19..44325a635d 100644
|
|
--- a/block/file-posix.c
|
|
+++ b/block/file-posix.c
|
|
@@ -1258,7 +1258,7 @@ static void raw_refresh_limits(BlockDriverState *bs, Error **errp)
|
|
int ret = sg_get_max_transfer_length(s->fd);
|
|
|
|
if (ret > 0 && ret <= BDRV_REQUEST_MAX_BYTES) {
|
|
- bs->bl.max_transfer = pow2floor(ret);
|
|
+ bs->bl.max_hw_transfer = pow2floor(ret);
|
|
}
|
|
|
|
ret = sg_get_max_segments(s->fd);
|
|
diff --git a/block/io.c b/block/io.c
|
|
index ca2dca3007..a4b2e3adf1 100644
|
|
--- a/block/io.c
|
|
+++ b/block/io.c
|
|
@@ -126,6 +126,8 @@ static void bdrv_merge_limits(BlockLimits *dst, const BlockLimits *src)
|
|
{
|
|
dst->opt_transfer = MAX(dst->opt_transfer, src->opt_transfer);
|
|
dst->max_transfer = MIN_NON_ZERO(dst->max_transfer, src->max_transfer);
|
|
+ dst->max_hw_transfer = MIN_NON_ZERO(dst->max_hw_transfer,
|
|
+ src->max_hw_transfer);
|
|
dst->opt_mem_alignment = MAX(dst->opt_mem_alignment,
|
|
src->opt_mem_alignment);
|
|
dst->min_mem_alignment = MAX(dst->min_mem_alignment,
|
|
diff --git a/hw/scsi/scsi-generic.c b/hw/scsi/scsi-generic.c
|
|
index 82e1e2ee79..3762dce749 100644
|
|
--- a/hw/scsi/scsi-generic.c
|
|
+++ b/hw/scsi/scsi-generic.c
|
|
@@ -179,7 +179,7 @@ static void scsi_handle_inquiry_reply(SCSIGenericReq *r, SCSIDevice *s)
|
|
(r->req.cmd.buf[1] & 0x01)) {
|
|
page = r->req.cmd.buf[2];
|
|
if (page == 0xb0) {
|
|
- uint32_t max_transfer = blk_get_max_transfer(s->conf.blk);
|
|
+ uint64_t max_transfer = blk_get_max_hw_transfer(s->conf.blk);
|
|
uint32_t max_iov = blk_get_max_iov(s->conf.blk);
|
|
|
|
assert(max_transfer);
|
|
diff --git a/include/block/block_int.h b/include/block/block_int.h
|
|
index 88e4111939..09d8630ec4 100644
|
|
--- a/include/block/block_int.h
|
|
+++ b/include/block/block_int.h
|
|
@@ -695,6 +695,13 @@ typedef struct BlockLimits {
|
|
* clamped down. */
|
|
uint32_t max_transfer;
|
|
|
|
+ /* Maximal hardware transfer length in bytes. Applies whenever
|
|
+ * transfers to the device bypass the kernel I/O scheduler, for
|
|
+ * example with SG_IO. If larger than max_transfer or if zero,
|
|
+ * blk_get_max_hw_transfer will fall back to max_transfer.
|
|
+ */
|
|
+ uint64_t max_hw_transfer;
|
|
+
|
|
/* memory alignment, in bytes so that no bounce buffer is needed */
|
|
size_t min_mem_alignment;
|
|
|
|
diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h
|
|
index 5423e3d9c6..9ac5f7bbd3 100644
|
|
--- a/include/sysemu/block-backend.h
|
|
+++ b/include/sysemu/block-backend.h
|
|
@@ -208,6 +208,7 @@ void blk_eject(BlockBackend *blk, bool eject_flag);
|
|
int blk_get_flags(BlockBackend *blk);
|
|
uint32_t blk_get_request_alignment(BlockBackend *blk);
|
|
uint32_t blk_get_max_transfer(BlockBackend *blk);
|
|
+uint64_t blk_get_max_hw_transfer(BlockBackend *blk);
|
|
int blk_get_max_iov(BlockBackend *blk);
|
|
void blk_set_guest_block_size(BlockBackend *blk, int align);
|
|
void *blk_try_blockalign(BlockBackend *blk, size_t size);
|
|
--
|
|
2.27.0
|
|
|