From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PULL 07/31] block: Track write zero limits in bytes
Date: Wed, 8 Jun 2016 11:16:33 +0200 [thread overview]
Message-ID: <1465377417-5012-8-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1465377417-5012-1-git-send-email-kwolf@redhat.com>
From: Eric Blake <eblake@redhat.com>
Another step towards removing sector-based interfaces: convert
the maximum write and minimum alignment values from sectors to
bytes. Rename the variables to let the compiler check that all
users are converted to the new semantics.
The maximum remains an int as long as BDRV_REQUEST_MAX_SECTORS
is constrained by INT_MAX (this means that we can't even
support a 2G write_zeroes, but just under it) - changing
operation lengths to unsigned or to 64-bits is a much bigger
audit, and debatable if we even want to do it (since at the
core, a 32-bit platform will still have ssize_t as its
underlying limit on write()).
Meanwhile, alignment is changed to 'uint32_t', since it makes no
sense to have an alignment larger than the maximum write, and
less painful to use an unsigned type with well-defined behavior
in bit operations than to have to worry about what happens if
a driver mistakenly supplies a negative alignment.
Add an assert that no one was trying to use sectors to get a
write zeroes larger than 2G, and therefore that a later conversion
to bytes won't be impacted by keeping the limit at 32 bits.
Signed-off-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
block/io.c | 22 +++++++++++++---------
block/iscsi.c | 13 ++++++-------
block/qcow2.c | 2 +-
block/qed.c | 2 +-
block/vmdk.c | 6 +++---
include/block/block_int.h | 10 ++++++----
6 files changed, 30 insertions(+), 25 deletions(-)
diff --git a/block/io.c b/block/io.c
index c73be55..1eda1b2 100644
--- a/block/io.c
+++ b/block/io.c
@@ -1121,15 +1121,19 @@ static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs,
int head = 0;
int tail = 0;
- int max_write_zeroes = MIN_NON_ZERO(bs->bl.max_write_zeroes,
- BDRV_REQUEST_MAX_SECTORS);
- if (bs->bl.write_zeroes_alignment) {
- assert(is_power_of_2(bs->bl.write_zeroes_alignment));
- head = sector_num & (bs->bl.write_zeroes_alignment - 1);
- tail = (sector_num + nb_sectors) & (bs->bl.write_zeroes_alignment - 1);
- max_write_zeroes &= ~(bs->bl.write_zeroes_alignment - 1);
+ int max_write_zeroes = MIN_NON_ZERO(bs->bl.max_pwrite_zeroes, INT_MAX);
+ int write_zeroes_sector_align =
+ bs->bl.pwrite_zeroes_alignment >> BDRV_SECTOR_BITS;
+
+ max_write_zeroes >>= BDRV_SECTOR_BITS;
+ if (write_zeroes_sector_align) {
+ assert(is_power_of_2(bs->bl.pwrite_zeroes_alignment));
+ head = sector_num & (write_zeroes_sector_align - 1);
+ tail = (sector_num + nb_sectors) & (write_zeroes_sector_align - 1);
+ max_write_zeroes &= ~(write_zeroes_sector_align - 1);
}
+ assert(nb_sectors <= BDRV_REQUEST_MAX_SECTORS);
while (nb_sectors > 0 && !ret) {
int num = nb_sectors;
@@ -1139,9 +1143,9 @@ static int coroutine_fn bdrv_co_do_write_zeroes(BlockDriverState *bs,
*/
if (head) {
/* Make a small request up to the first aligned sector. */
- num = MIN(nb_sectors, bs->bl.write_zeroes_alignment - head);
+ num = MIN(nb_sectors, write_zeroes_sector_align - head);
head = 0;
- } else if (tail && num > bs->bl.write_zeroes_alignment) {
+ } else if (tail && num > write_zeroes_sector_align) {
/* Shorten the request to the last aligned sector. */
num -= tail;
}
diff --git a/block/iscsi.c b/block/iscsi.c
index 94f9974..52ea9d7 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
@@ -1715,16 +1715,15 @@ static void iscsi_refresh_limits(BlockDriverState *bs, Error **errp)
bs->bl.discard_alignment = iscsilun->block_size >> BDRV_SECTOR_BITS;
}
- if (iscsilun->bl.max_ws_len < 0xffffffff) {
- bs->bl.max_write_zeroes =
- sector_limits_lun2qemu(iscsilun->bl.max_ws_len, iscsilun);
+ if (iscsilun->bl.max_ws_len < 0xffffffff / iscsilun->block_size) {
+ bs->bl.max_pwrite_zeroes =
+ iscsilun->bl.max_ws_len * iscsilun->block_size;
}
if (iscsilun->lbp.lbpws) {
- bs->bl.write_zeroes_alignment =
- sector_limits_lun2qemu(iscsilun->bl.opt_unmap_gran, iscsilun);
+ bs->bl.pwrite_zeroes_alignment =
+ iscsilun->bl.opt_unmap_gran * iscsilun->block_size;
} else {
- bs->bl.write_zeroes_alignment =
- iscsilun->block_size >> BDRV_SECTOR_BITS;
+ bs->bl.pwrite_zeroes_alignment = iscsilun->block_size;
}
bs->bl.opt_transfer_length =
sector_limits_lun2qemu(iscsilun->bl.opt_xfer_len, iscsilun);
diff --git a/block/qcow2.c b/block/qcow2.c
index ecac399..a6ea6cb 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -1193,7 +1193,7 @@ static void qcow2_refresh_limits(BlockDriverState *bs, Error **errp)
{
BDRVQcow2State *s = bs->opaque;
- bs->bl.write_zeroes_alignment = s->cluster_sectors;
+ bs->bl.pwrite_zeroes_alignment = s->cluster_size;
}
static int qcow2_set_key(BlockDriverState *bs, const char *key)
diff --git a/block/qed.c b/block/qed.c
index 0f62192..113b8e8 100644
--- a/block/qed.c
+++ b/block/qed.c
@@ -517,7 +517,7 @@ static void bdrv_qed_refresh_limits(BlockDriverState *bs, Error **errp)
{
BDRVQEDState *s = bs->opaque;
- bs->bl.write_zeroes_alignment = s->header.cluster_size >> BDRV_SECTOR_BITS;
+ bs->bl.pwrite_zeroes_alignment = s->header.cluster_size;
}
/* We have nothing to do for QED reopen, stubs just return
diff --git a/block/vmdk.c b/block/vmdk.c
index 2205cc8..5a01e16 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
@@ -997,9 +997,9 @@ static void vmdk_refresh_limits(BlockDriverState *bs, Error **errp)
for (i = 0; i < s->num_extents; i++) {
if (!s->extents[i].flat) {
- bs->bl.write_zeroes_alignment =
- MAX(bs->bl.write_zeroes_alignment,
- s->extents[i].cluster_sectors);
+ bs->bl.pwrite_zeroes_alignment =
+ MAX(bs->bl.pwrite_zeroes_alignment,
+ s->extents[i].cluster_sectors << BDRV_SECTOR_BITS);
}
}
}
diff --git a/include/block/block_int.h b/include/block/block_int.h
index 30a9717..2e9c81f 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -328,11 +328,13 @@ typedef struct BlockLimits {
/* optimal alignment for discard requests in sectors */
int64_t discard_alignment;
- /* maximum number of sectors that can zeroized at once */
- int max_write_zeroes;
+ /* maximum number of bytes that can zeroized at once (since it is
+ * signed, it must be < 2G, if set) */
+ int32_t max_pwrite_zeroes;
- /* optimal alignment for write zeroes requests in sectors */
- int64_t write_zeroes_alignment;
+ /* optimal alignment for write zeroes requests in bytes, must be
+ * power of 2, and less than max_pwrite_zeroes if that is set */
+ uint32_t pwrite_zeroes_alignment;
/* optimal transfer length in sectors */
int opt_transfer_length;
--
1.8.3.1
next prev parent reply other threads:[~2016-06-08 9:17 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-08 9:16 [Qemu-devel] [PULL 00/31] Block layer patches Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 01/31] block: split write_zeroes always Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 02/31] qcow2: simplify logic in qcow2_co_write_zeroes Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 03/31] qcow2: add tracepoints for qcow2_co_write_zeroes Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 04/31] qemu-iotests: Test one more spot for optimizing write_zeroes Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 05/31] qcow2: Catch more unaligned write_zero into zero cluster Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 06/31] iscsi: Use block size as minimum zero/discard alignment Kevin Wolf
2016-06-08 9:16 ` Kevin Wolf [this message]
2016-06-08 9:16 ` [Qemu-devel] [PULL 08/31] block: Add .bdrv_co_pwrite_zeroes() Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 09/31] block: Switch bdrv_write_zeroes() to byte interface Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 10/31] iscsi: Convert to bdrv_co_pwrite_zeroes() Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 11/31] qcow2: " Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 12/31] blkreplay: " Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 13/31] gluster: " Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 14/31] qed: " Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 15/31] raw-posix: " Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 16/31] raw_bsd: " Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 17/31] vmdk: " Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 18/31] block: Kill bdrv_co_write_zeroes() Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 19/31] migration/block: Convert load to BlockBackend Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 20/31] migration/block: Convert saving " Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 21/31] block: assert that bs->request_alignment is a power of 2 Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 22/31] raw-posix: Fetch max sectors for host block device Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 23/31] qcow2: avoid extra flushes in qcow2 Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 24/31] block: Fix bdrv_all_delete_snapshot() error handling Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 25/31] blockdev: clean up error handling in do_open_tray Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 26/31] block: Don't emulate natively supported pwritev flags Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 27/31] qemu-img bench Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 28/31] qemu-img bench: Sequential writes Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 29/31] qemu-img bench: Make start offset configurable Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 30/31] qemu-img bench: Implement -S (step size) Kevin Wolf
2016-06-08 9:16 ` [Qemu-devel] [PULL 31/31] qemu-img bench: Add --flush-interval Kevin Wolf
2016-06-08 17:27 ` [Qemu-devel] [PULL 00/31] Block layer patches Peter Maydell
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=1465377417-5012-8-git-send-email-kwolf@redhat.com \
--to=kwolf@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/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;
as well as URLs for NNTP newsgroup(s).