From: Stefan Hajnoczi <stefanha@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
Eric Blake <eblake@redhat.com>,
Stefan Hajnoczi <stefanha@redhat.com>
Subject: [Qemu-devel] [PULL v2 07/25] block: Convert bdrv_co_discard() to byte-based
Date: Wed, 20 Jul 2016 17:21:04 +0100 [thread overview]
Message-ID: <1469031682-21863-8-git-send-email-stefanha@redhat.com> (raw)
In-Reply-To: <1469031682-21863-1-git-send-email-stefanha@redhat.com>
From: Eric Blake <eblake@redhat.com>
Another step towards byte-based interfaces everywhere. Replace
the sector-based bdrv_co_discard() with a new byte-based
bdrv_co_pdiscard(), which silently ignores any unaligned head
or tail. Driver callbacks will be converted in followup patches.
By calculating the alignment outside of the loop, and clamping
the max discard to an aligned value, we can simplify the actions
done within the loop.
Signed-off-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-id: 1468624988-423-2-git-send-email-eblake@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
block/blkreplay.c | 3 ++-
block/block-backend.c | 3 ++-
block/io.c | 67 +++++++++++++++++++++++++++------------------------
block/raw_bsd.c | 3 ++-
include/block/block.h | 2 +-
5 files changed, 42 insertions(+), 36 deletions(-)
diff --git a/block/blkreplay.c b/block/blkreplay.c
index 3368c8c..c69e5a5 100755
--- a/block/blkreplay.c
+++ b/block/blkreplay.c
@@ -118,7 +118,8 @@ static int coroutine_fn blkreplay_co_discard(BlockDriverState *bs,
int64_t sector_num, int nb_sectors)
{
uint64_t reqid = request_id++;
- int ret = bdrv_co_discard(bs->file->bs, sector_num, nb_sectors);
+ int ret = bdrv_co_pdiscard(bs->file->bs, sector_num << BDRV_SECTOR_BITS,
+ nb_sectors << BDRV_SECTOR_BITS);
block_request_create(reqid, bs, qemu_coroutine_self());
qemu_coroutine_yield();
diff --git a/block/block-backend.c b/block/block-backend.c
index f9cea1b..d982cf9 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -1113,7 +1113,8 @@ int blk_co_discard(BlockBackend *blk, int64_t sector_num, int nb_sectors)
return ret;
}
- return bdrv_co_discard(blk_bs(blk), sector_num, nb_sectors);
+ return bdrv_co_pdiscard(blk_bs(blk), sector_num << BDRV_SECTOR_BITS,
+ nb_sectors << BDRV_SECTOR_BITS);
}
int blk_co_flush(BlockBackend *blk)
diff --git a/block/io.c b/block/io.c
index 410394d..14d448d 100644
--- a/block/io.c
+++ b/block/io.c
@@ -2199,7 +2199,8 @@ static void coroutine_fn bdrv_aio_discard_co_entry(void *opaque)
BlockAIOCBCoroutine *acb = opaque;
BlockDriverState *bs = acb->common.bs;
- acb->req.error = bdrv_co_discard(bs, acb->req.sector, acb->req.nb_sectors);
+ acb->req.error = bdrv_co_pdiscard(bs, acb->req.sector << BDRV_SECTOR_BITS,
+ acb->req.nb_sectors << BDRV_SECTOR_BITS);
bdrv_co_complete(acb);
}
@@ -2398,20 +2399,22 @@ static void coroutine_fn bdrv_discard_co_entry(void *opaque)
{
DiscardCo *rwco = opaque;
- rwco->ret = bdrv_co_discard(rwco->bs, rwco->sector_num, rwco->nb_sectors);
+ rwco->ret = bdrv_co_pdiscard(rwco->bs, rwco->sector_num << BDRV_SECTOR_BITS,
+ rwco->nb_sectors << BDRV_SECTOR_BITS);
}
-int coroutine_fn bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
- int nb_sectors)
+int coroutine_fn bdrv_co_pdiscard(BlockDriverState *bs, int64_t offset,
+ int count)
{
BdrvTrackedRequest req;
- int max_discard, ret;
+ int max_pdiscard, ret;
+ int head, align;
if (!bs->drv) {
return -ENOMEDIUM;
}
- ret = bdrv_check_request(bs, sector_num, nb_sectors);
+ ret = bdrv_check_byte_request(bs, offset, count);
if (ret < 0) {
return ret;
} else if (bs->read_only) {
@@ -2428,45 +2431,45 @@ int coroutine_fn bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
return 0;
}
- tracked_request_begin(&req, bs, sector_num << BDRV_SECTOR_BITS,
- nb_sectors << BDRV_SECTOR_BITS, BDRV_TRACKED_DISCARD);
+ /* Discard is advisory, so ignore any unaligned head or tail */
+ align = MAX(BDRV_SECTOR_SIZE,
+ MAX(bs->bl.pdiscard_alignment, bs->bl.request_alignment));
+ assert(is_power_of_2(align));
+ head = MIN(count, -offset & (align - 1));
+ if (head) {
+ count -= head;
+ offset += head;
+ }
+ count = QEMU_ALIGN_DOWN(count, align);
+ if (!count) {
+ return 0;
+ }
+
+ tracked_request_begin(&req, bs, offset, count, BDRV_TRACKED_DISCARD);
ret = notifier_with_return_list_notify(&bs->before_write_notifiers, &req);
if (ret < 0) {
goto out;
}
- max_discard = MIN_NON_ZERO(bs->bl.max_pdiscard >> BDRV_SECTOR_BITS,
- BDRV_REQUEST_MAX_SECTORS);
- while (nb_sectors > 0) {
+ max_pdiscard = QEMU_ALIGN_DOWN(MIN_NON_ZERO(bs->bl.max_pdiscard, INT_MAX),
+ align);
+
+ while (count > 0) {
int ret;
- int num = nb_sectors;
- int discard_alignment = bs->bl.pdiscard_alignment >> BDRV_SECTOR_BITS;
-
- /* align request */
- if (discard_alignment &&
- num >= discard_alignment &&
- sector_num % discard_alignment) {
- if (num > discard_alignment) {
- num = discard_alignment;
- }
- num -= sector_num % discard_alignment;
- }
-
- /* limit request size */
- if (num > max_discard) {
- num = max_discard;
- }
+ int num = MIN(count, max_pdiscard);
if (bs->drv->bdrv_co_discard) {
- ret = bs->drv->bdrv_co_discard(bs, sector_num, num);
+ ret = bs->drv->bdrv_co_discard(bs, offset >> BDRV_SECTOR_BITS,
+ num >> BDRV_SECTOR_BITS);
} else {
BlockAIOCB *acb;
CoroutineIOCompletion co = {
.coroutine = qemu_coroutine_self(),
};
- acb = bs->drv->bdrv_aio_discard(bs, sector_num, nb_sectors,
+ acb = bs->drv->bdrv_aio_discard(bs, offset >> BDRV_SECTOR_BITS,
+ num >> BDRV_SECTOR_BITS,
bdrv_co_io_em_complete, &co);
if (acb == NULL) {
ret = -EIO;
@@ -2480,8 +2483,8 @@ int coroutine_fn bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
goto out;
}
- sector_num += num;
- nb_sectors -= num;
+ offset += num;
+ count -= num;
}
ret = 0;
out:
diff --git a/block/raw_bsd.c b/block/raw_bsd.c
index d767413..68f0a91 100644
--- a/block/raw_bsd.c
+++ b/block/raw_bsd.c
@@ -137,7 +137,8 @@ static int coroutine_fn raw_co_pwrite_zeroes(BlockDriverState *bs,
static int coroutine_fn raw_co_discard(BlockDriverState *bs,
int64_t sector_num, int nb_sectors)
{
- return bdrv_co_discard(bs->file->bs, sector_num, nb_sectors);
+ return bdrv_co_pdiscard(bs->file->bs, sector_num << BDRV_SECTOR_BITS,
+ nb_sectors << BDRV_SECTOR_BITS);
}
static int64_t raw_getlength(BlockDriverState *bs)
diff --git a/include/block/block.h b/include/block/block.h
index 616d8b9..4f5cebf 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -342,7 +342,7 @@ void coroutine_fn bdrv_co_drain(BlockDriverState *bs);
void bdrv_drain_all(void);
int bdrv_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors);
-int bdrv_co_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors);
+int bdrv_co_pdiscard(BlockDriverState *bs, int64_t offset, int count);
int bdrv_has_zero_init_1(BlockDriverState *bs);
int bdrv_has_zero_init(BlockDriverState *bs);
bool bdrv_unallocated_blocks_are_zero(BlockDriverState *bs);
--
2.7.4
next prev parent reply other threads:[~2016-07-20 16:21 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-20 16:20 [Qemu-devel] [PULL v2 00/25] Block patches Stefan Hajnoczi
2016-07-20 16:20 ` [Qemu-devel] [PULL v2 01/25] block: Fragment reads to max transfer length Stefan Hajnoczi
2016-07-20 16:20 ` [Qemu-devel] [PULL v2 02/25] raw_bsd: Don't advertise flags not supported by protocol layer Stefan Hajnoczi
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 03/25] block: Fragment writes to max transfer length Stefan Hajnoczi
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 04/25] nbd: Rely on block layer to break up large requests Stefan Hajnoczi
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 05/25] nbd: Drop unused offset parameter Stefan Hajnoczi
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 06/25] iscsi: Rely on block layer to break up large requests Stefan Hajnoczi
2016-07-20 16:21 ` Stefan Hajnoczi [this message]
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 08/25] block: Convert bdrv_discard() to byte-based Stefan Hajnoczi
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 09/25] block: Switch BlockRequest " Stefan Hajnoczi
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 10/25] block: Convert bdrv_aio_discard() " Stefan Hajnoczi
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 11/25] block: Convert BB interface to byte-based discards Stefan Hajnoczi
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 12/25] raw-posix: Switch paio_submit() to byte-based Stefan Hajnoczi
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 13/25] rbd: Switch rbd_start_aio() " Stefan Hajnoczi
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 14/25] block: Convert .bdrv_aio_discard() " Stefan Hajnoczi
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 15/25] block: Add .bdrv_co_pdiscard() driver callback Stefan Hajnoczi
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 16/25] blkreplay: Switch .bdrv_co_discard() to byte-based Stefan Hajnoczi
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 17/25] gluster: " Stefan Hajnoczi
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 18/25] iscsi: " Stefan Hajnoczi
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 19/25] nbd: " Stefan Hajnoczi
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 20/25] qcow2: " Stefan Hajnoczi
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 21/25] raw_bsd: " Stefan Hajnoczi
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 22/25] sheepdog: " Stefan Hajnoczi
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 23/25] block: Kill .bdrv_co_discard() Stefan Hajnoczi
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 24/25] nbd: Convert to byte-based interface Stefan Hajnoczi
2016-07-20 16:21 ` [Qemu-devel] [PULL v2 25/25] raw_bsd: " Stefan Hajnoczi
2016-07-20 21:03 ` [Qemu-devel] [PULL v2 00/25] Block patches Peter Maydell
2016-07-21 9:58 ` Stefan Hajnoczi
2016-07-21 10:47 ` 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=1469031682-21863-8-git-send-email-stefanha@redhat.com \
--to=stefanha@redhat.com \
--cc=eblake@redhat.com \
--cc=peter.maydell@linaro.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).