From: Hanna Reitz <hreitz@redhat.com>
To: qemu-block@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
Peter Maydell <peter.maydell@linaro.org>,
Hanna Reitz <hreitz@redhat.com>,
qemu-devel@nongnu.org
Subject: [PULL 01/23] ide: Increment BB in-flight counter for TRIM BH
Date: Mon, 7 Mar 2022 11:35:27 +0100 [thread overview]
Message-ID: <20220307103549.808809-2-hreitz@redhat.com> (raw)
In-Reply-To: <20220307103549.808809-1-hreitz@redhat.com>
When we still have an AIOCB registered for DMA operations, we try to
settle the respective operation by draining the BlockBackend associated
with the IDE device.
However, this assumes that every DMA operation is associated with an
increment of the BlockBackend’s in-flight counter (e.g. through some
ongoing I/O operation), so that draining the BB until its in-flight
counter reaches 0 will settle all DMA operations. That is not the case:
For TRIM, the guest can issue a zero-length operation that will not
result in any I/O operation forwarded to the BlockBackend, and also not
increment the in-flight counter in any other way. In such a case,
blk_drain() will be a no-op if no other operations are in flight.
It is clear that if blk_drain() is a no-op, the value of
s->bus->dma->aiocb will not change between checking it in the `if`
condition and asserting that it is NULL after blk_drain().
The particular problem is that ide_issue_trim() creates a BH
(ide_trim_bh_cb()) to settle the TRIM request: iocb->common.cb() is
ide_dma_cb(), which will either create a new request, or find the
transfer to be done and call ide_set_inactive(), which clears
s->bus->dma->aiocb. Therefore, the blk_drain() must wait for
ide_trim_bh_cb() to run, which currently it will not always do.
To fix this issue, we increment the BlockBackend's in-flight counter
when the TRIM operation begins (in ide_issue_trim(), when the
ide_trim_bh_cb() BH is created) and decrement it when ide_trim_bh_cb()
is done.
Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=2029980
Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
Message-Id: <20220120142259.120189-1-hreitz@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: John Snow <jsnow@redhat.com>
Tested-by: John Snow <jsnow@redhat.com>
---
hw/ide/core.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/hw/ide/core.c b/hw/ide/core.c
index 33463d9b8f..d667d0b55e 100644
--- a/hw/ide/core.c
+++ b/hw/ide/core.c
@@ -434,12 +434,16 @@ static const AIOCBInfo trim_aiocb_info = {
static void ide_trim_bh_cb(void *opaque)
{
TrimAIOCB *iocb = opaque;
+ BlockBackend *blk = iocb->s->blk;
iocb->common.cb(iocb->common.opaque, iocb->ret);
qemu_bh_delete(iocb->bh);
iocb->bh = NULL;
qemu_aio_unref(iocb);
+
+ /* Paired with an increment in ide_issue_trim() */
+ blk_dec_in_flight(blk);
}
static void ide_issue_trim_cb(void *opaque, int ret)
@@ -509,6 +513,9 @@ BlockAIOCB *ide_issue_trim(
IDEState *s = opaque;
TrimAIOCB *iocb;
+ /* Paired with a decrement in ide_trim_bh_cb() */
+ blk_inc_in_flight(s->blk);
+
iocb = blk_aio_get(&trim_aiocb_info, s->blk, cb, cb_opaque);
iocb->s = s;
iocb->bh = qemu_bh_new(ide_trim_bh_cb, iocb);
--
2.34.1
next prev parent reply other threads:[~2022-03-07 11:24 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-07 10:35 [PULL 00/23] Block patches Hanna Reitz
2022-03-07 10:35 ` Hanna Reitz [this message]
2022-03-07 10:35 ` [PULL 02/23] block/curl.c: Set error message string if curl_init_state() fails Hanna Reitz
2022-03-07 10:35 ` [PULL 03/23] block/curl.c: Check error return from curl_easy_setopt() Hanna Reitz
2022-03-07 10:35 ` [PULL 04/23] block: fix preallocate filter: don't do unaligned preallocate requests Hanna Reitz
2022-03-07 10:35 ` [PULL 05/23] tests/qemu-iotests/040: Skip TestCommitWithFilters without 'throttle' Hanna Reitz
2022-03-07 10:35 ` [PULL 06/23] tests/qemu-iotests/testrunner: Quote "case not run" lines in TAP mode Hanna Reitz
2022-03-07 10:35 ` [PULL 07/23] iotests: Write test output to TEST_DIR Hanna Reitz
2022-03-07 10:35 ` [PULL 08/23] block/block-copy: move copy_bitmap initialization to block_copy_state_new() Hanna Reitz
2022-03-07 10:35 ` [PULL 09/23] block/dirty-bitmap: bdrv_merge_dirty_bitmap(): add return value Hanna Reitz
2022-03-07 10:35 ` [PULL 10/23] block/block-copy: block_copy_state_new(): add bitmap parameter Hanna Reitz
2022-03-07 10:35 ` [PULL 11/23] block/copy-before-write: add bitmap open parameter Hanna Reitz
2022-03-07 10:35 ` [PULL 12/23] block/block-copy: add block_copy_reset() Hanna Reitz
2022-03-07 10:35 ` [PULL 13/23] block: intoduce reqlist Hanna Reitz
2022-03-07 10:35 ` [PULL 14/23] block/reqlist: reqlist_find_conflict(): use ranges_overlap() Hanna Reitz
2022-03-07 10:35 ` [PULL 15/23] block/dirty-bitmap: introduce bdrv_dirty_bitmap_status() Hanna Reitz
2022-03-07 10:35 ` [PULL 16/23] block/reqlist: add reqlist_wait_all() Hanna Reitz
2022-03-07 10:35 ` [PULL 17/23] block/io: introduce block driver snapshot-access API Hanna Reitz
2022-03-07 10:35 ` [PULL 18/23] block: introduce snapshot-access block driver Hanna Reitz
2022-03-07 10:35 ` [PULL 19/23] block: copy-before-write: realize snapshot-access API Hanna Reitz
2022-03-07 10:35 ` [PULL 20/23] iotests/image-fleecing: add test-case for fleecing format node Hanna Reitz
2022-03-07 10:35 ` [PULL 21/23] iotests.py: add qemu_io_pipe_and_status() Hanna Reitz
2022-03-07 10:35 ` [PULL 22/23] iotests/image-fleecing: add test case with bitmap Hanna Reitz
2022-03-07 10:35 ` [PULL 23/23] iotests/image-fleecing: test push backup with fleecing Hanna Reitz
2022-03-07 19:07 ` [PULL 00/23] Block 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=20220307103549.808809-2-hreitz@redhat.com \
--to=hreitz@redhat.com \
--cc=kwolf@redhat.com \
--cc=peter.maydell@linaro.org \
--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).