* [PATCH v2 0/3] block: Start/end drain on correct AioContext
@ 2022-11-07 15:13 Hanna Reitz
2022-11-07 15:13 ` [PATCH v2 1/3] block: Make bdrv_child_get_parent_aio_context I/O Hanna Reitz
` (4 more replies)
0 siblings, 5 replies; 9+ messages in thread
From: Hanna Reitz @ 2022-11-07 15:13 UTC (permalink / raw)
To: qemu-block; +Cc: qemu-devel, Hanna Reitz, Kevin Wolf, Stefan Hajnoczi
Hi,
v1 cover letter:
https://lists.nongnu.org/archive/html/qemu-block/2022-09/msg00389.html
bdrv_replace_child_noperm() drains the child via
bdrv_parent_drained_{begin,end}_single(). When it removes a child, the
bdrv_parent_drained_end_single() at its end will be called on an empty
child, making the BDRV_POLL_WHILE() in it poll the main AioContext
(because c->bs is NULL).
Thatâs wrong, though, because itâs supposed to operate on the parent.
bdrv_parent_drained_end_single_no_poll() will have scheduled any BHs in
the parentsâ AioContext, which may be anything, not necessarily the main
context. Therefore, we must poll the parentâs context.
Patch 3 does this for both bdrv_parent_drained_{begin,end}_single().
Patch 1 ensures that we can legally call
bdrv_child_get_parent_aio_context() from those I/O context functions,
and patch 2 fixes blk_do_set_aio_context() to not cause an assertion
failure if it beginning a drain can end up in blk_get_aio_context()
before blk->ctx has been updated.
v2:
- Patch 1:
- Move bdrv_child_get_parent_aio_context() from block-global-state.h
to block-io.h
- Move BdrvChildClass.get_parent_aio_context into the I/O code section
- Mark blk_root_get_parent_aio_context() as I/O code
- Mark child_job_get_parent_aio_context(), and lock the job mutex,
which we now need to do (as of 3ed4f708fe1)
- Patch 2:
- Added comment similar to Kevinâs suggestion
(Still decided to take Kevinâs R-b, even though I didnât use the
literal suggestion, but made it a bit more verbose)
Hanna Reitz (3):
block: Make bdrv_child_get_parent_aio_context I/O
block-backend: Update ctx immediately after root
block: Start/end drain on correct AioContext
include/block/block-global-state.h | 1 -
include/block/block-io.h | 2 ++
include/block/block_int-common.h | 4 ++--
block.c | 2 +-
block/block-backend.c | 9 ++++++++-
block/io.c | 6 ++++--
blockjob.c | 3 ++-
7 files changed, 19 insertions(+), 8 deletions(-)
--
2.36.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 1/3] block: Make bdrv_child_get_parent_aio_context I/O
2022-11-07 15:13 [PATCH v2 0/3] block: Start/end drain on correct AioContext Hanna Reitz
@ 2022-11-07 15:13 ` Hanna Reitz
2022-11-07 15:13 ` [PATCH v2 2/3] block-backend: Update ctx immediately after root Hanna Reitz
` (3 subsequent siblings)
4 siblings, 0 replies; 9+ messages in thread
From: Hanna Reitz @ 2022-11-07 15:13 UTC (permalink / raw)
To: qemu-block; +Cc: qemu-devel, Hanna Reitz, Kevin Wolf, Stefan Hajnoczi
We want to use bdrv_child_get_parent_aio_context() from
bdrv_parent_drained_{begin,end}_single(), both of which are "I/O or GS"
functions.
Prior to 3ed4f708fe1, all the implementations were I/O code anyway.
3ed4f708fe1 has put block jobs' AioContext field under the job mutex, so
to make child_job_get_parent_aio_context() work in an I/O context, we
need to take that lock there.
Furthermore, blk_root_get_parent_aio_context() is not marked as
anything, but is safe to run in an I/O context, so mark it that way now.
(blk_get_aio_context() is an I/O code function.)
With that done, all implementations explicitly are I/O code, so we can
mark bdrv_child_get_parent_aio_context() as I/O code, too, so callers
know it is safe to run from both GS and I/O contexts.
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
---
include/block/block-global-state.h | 1 -
include/block/block-io.h | 2 ++
include/block/block_int-common.h | 4 ++--
block.c | 2 +-
block/block-backend.c | 1 +
blockjob.c | 3 ++-
6 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/include/block/block-global-state.h b/include/block/block-global-state.h
index bb42ed9559..c7bd4a2088 100644
--- a/include/block/block-global-state.h
+++ b/include/block/block-global-state.h
@@ -220,7 +220,6 @@ void coroutine_fn bdrv_co_lock(BlockDriverState *bs);
*/
void coroutine_fn bdrv_co_unlock(BlockDriverState *bs);
-AioContext *bdrv_child_get_parent_aio_context(BdrvChild *c);
bool bdrv_child_change_aio_context(BdrvChild *c, AioContext *ctx,
GHashTable *visited, Transaction *tran,
Error **errp);
diff --git a/include/block/block-io.h b/include/block/block-io.h
index 770ddeb7c8..b099d7db45 100644
--- a/include/block/block-io.h
+++ b/include/block/block-io.h
@@ -171,6 +171,8 @@ void bdrv_debug_event(BlockDriverState *bs, BlkdebugEvent event);
*/
AioContext *bdrv_get_aio_context(BlockDriverState *bs);
+AioContext *bdrv_child_get_parent_aio_context(BdrvChild *c);
+
/**
* Move the current coroutine to the AioContext of @bs and return the old
* AioContext of the coroutine. Increase bs->in_flight so that draining @bs
diff --git a/include/block/block_int-common.h b/include/block/block_int-common.h
index 5a2cc077a0..31ae91e56e 100644
--- a/include/block/block_int-common.h
+++ b/include/block/block_int-common.h
@@ -911,8 +911,6 @@ struct BdrvChildClass {
GHashTable *visited, Transaction *tran,
Error **errp);
- AioContext *(*get_parent_aio_context)(BdrvChild *child);
-
/*
* I/O API functions. These functions are thread-safe.
*
@@ -929,6 +927,8 @@ struct BdrvChildClass {
*/
const char *(*get_name)(BdrvChild *child);
+ AioContext *(*get_parent_aio_context)(BdrvChild *child);
+
/*
* If this pair of functions is implemented, the parent doesn't issue new
* requests after returning from .drained_begin() until .drained_end() is
diff --git a/block.c b/block.c
index 3bd594eb2a..2d6128d80a 100644
--- a/block.c
+++ b/block.c
@@ -1533,7 +1533,7 @@ const BdrvChildClass child_of_bds = {
AioContext *bdrv_child_get_parent_aio_context(BdrvChild *c)
{
- GLOBAL_STATE_CODE();
+ IO_CODE();
return c->klass->get_parent_aio_context(c);
}
diff --git a/block/block-backend.c b/block/block-backend.c
index c0c7d56c8d..ed2f4b67a2 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -311,6 +311,7 @@ static void blk_root_detach(BdrvChild *child)
static AioContext *blk_root_get_parent_aio_context(BdrvChild *c)
{
BlockBackend *blk = c->opaque;
+ IO_CODE();
return blk_get_aio_context(blk);
}
diff --git a/blockjob.c b/blockjob.c
index 2d86014fa5..f51d4e18f3 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -173,7 +173,8 @@ static bool child_job_change_aio_ctx(BdrvChild *c, AioContext *ctx,
static AioContext *child_job_get_parent_aio_context(BdrvChild *c)
{
BlockJob *job = c->opaque;
- GLOBAL_STATE_CODE();
+ IO_CODE();
+ JOB_LOCK_GUARD();
return job->job.aio_context;
}
--
2.36.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 2/3] block-backend: Update ctx immediately after root
2022-11-07 15:13 [PATCH v2 0/3] block: Start/end drain on correct AioContext Hanna Reitz
2022-11-07 15:13 ` [PATCH v2 1/3] block: Make bdrv_child_get_parent_aio_context I/O Hanna Reitz
@ 2022-11-07 15:13 ` Hanna Reitz
2022-11-07 15:13 ` [PATCH v2 3/3] block: Start/end drain on correct AioContext Hanna Reitz
` (2 subsequent siblings)
4 siblings, 0 replies; 9+ messages in thread
From: Hanna Reitz @ 2022-11-07 15:13 UTC (permalink / raw)
To: qemu-block; +Cc: qemu-devel, Hanna Reitz, Kevin Wolf, Stefan Hajnoczi
blk_get_aio_context() asserts that blk->ctx is always equal to the root
BDS's context (if there is a root BDS). Therefore,
blk_do_set_aio_context() must update blk->ctx immediately after the root
BDS's context has changed.
Without this patch, the next patch would break iotest 238, because
bdrv_drained_begin() (called by blk_do_set_aio_context()) may then
invoke bdrv_child_get_parent_aio_context() on the root child, i.e.
blk_get_aio_context(). However, by this point, blk->ctx would not have
been updated and thus differ from the root node's context. This patch
fixes that.
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
---
block/block-backend.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/block/block-backend.c b/block/block-backend.c
index ed2f4b67a2..b48c91f4e1 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -2158,6 +2158,11 @@ static int blk_do_set_aio_context(BlockBackend *blk, AioContext *new_context,
return ret;
}
}
+ /*
+ * Make blk->ctx consistent with the root node before we invoke any
+ * other operations like drain that might inquire blk->ctx
+ */
+ blk->ctx = new_context;
if (tgm->throttle_state) {
bdrv_drained_begin(bs);
throttle_group_detach_aio_context(tgm);
@@ -2166,9 +2171,10 @@ static int blk_do_set_aio_context(BlockBackend *blk, AioContext *new_context,
}
bdrv_unref(bs);
+ } else {
+ blk->ctx = new_context;
}
- blk->ctx = new_context;
return 0;
}
--
2.36.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 3/3] block: Start/end drain on correct AioContext
2022-11-07 15:13 [PATCH v2 0/3] block: Start/end drain on correct AioContext Hanna Reitz
2022-11-07 15:13 ` [PATCH v2 1/3] block: Make bdrv_child_get_parent_aio_context I/O Hanna Reitz
2022-11-07 15:13 ` [PATCH v2 2/3] block-backend: Update ctx immediately after root Hanna Reitz
@ 2022-11-07 15:13 ` Hanna Reitz
2022-11-08 14:13 ` [PATCH v2 0/3] " Kevin Wolf
2022-11-10 14:01 ` Kevin Wolf
4 siblings, 0 replies; 9+ messages in thread
From: Hanna Reitz @ 2022-11-07 15:13 UTC (permalink / raw)
To: qemu-block; +Cc: qemu-devel, Hanna Reitz, Kevin Wolf, Stefan Hajnoczi
bdrv_parent_drained_{begin,end}_single() are supposed to operate on the
parent, not on the child, so they should not attempt to get the context
to poll from the child but the parent instead. BDRV_POLL_WHILE(c->bs)
does get the context from the child, so we should replace it with
AIO_WAIT_WHILE() on the parent's context instead.
This problem becomes apparent when bdrv_replace_child_noperm() invokes
bdrv_parent_drained_end_single() after removing a child from a subgraph
that is in an I/O thread. By the time bdrv_parent_drained_end_single()
is called, child->bs is NULL, and so BDRV_POLL_WHILE(c->bs, ...) will
poll the main loop instead of the I/O thread; but anything that
bdrv_parent_drained_end_single_no_poll() may have scheduled is going to
want to run in the I/O thread, but because we poll the main loop, the
I/O thread is never unpaused, and nothing is run, resulting in a
deadlock.
Closes: https://gitlab.com/qemu-project/qemu/-/issues/1215
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
---
block/io.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/block/io.c b/block/io.c
index 34b30e304e..b9424024f9 100644
--- a/block/io.c
+++ b/block/io.c
@@ -71,9 +71,10 @@ static void bdrv_parent_drained_end_single_no_poll(BdrvChild *c,
void bdrv_parent_drained_end_single(BdrvChild *c)
{
int drained_end_counter = 0;
+ AioContext *ctx = bdrv_child_get_parent_aio_context(c);
IO_OR_GS_CODE();
bdrv_parent_drained_end_single_no_poll(c, &drained_end_counter);
- BDRV_POLL_WHILE(c->bs, qatomic_read(&drained_end_counter) > 0);
+ AIO_WAIT_WHILE(ctx, qatomic_read(&drained_end_counter) > 0);
}
static void bdrv_parent_drained_end(BlockDriverState *bs, BdrvChild *ignore,
@@ -116,13 +117,14 @@ static bool bdrv_parent_drained_poll(BlockDriverState *bs, BdrvChild *ignore,
void bdrv_parent_drained_begin_single(BdrvChild *c, bool poll)
{
+ AioContext *ctx = bdrv_child_get_parent_aio_context(c);
IO_OR_GS_CODE();
c->parent_quiesce_counter++;
if (c->klass->drained_begin) {
c->klass->drained_begin(c);
}
if (poll) {
- BDRV_POLL_WHILE(c->bs, bdrv_parent_drained_poll_single(c));
+ AIO_WAIT_WHILE(ctx, bdrv_parent_drained_poll_single(c));
}
}
--
2.36.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 0/3] block: Start/end drain on correct AioContext
2022-11-07 15:13 [PATCH v2 0/3] block: Start/end drain on correct AioContext Hanna Reitz
` (2 preceding siblings ...)
2022-11-07 15:13 ` [PATCH v2 3/3] block: Start/end drain on correct AioContext Hanna Reitz
@ 2022-11-08 14:13 ` Kevin Wolf
2022-11-08 14:23 ` Kevin Wolf
2022-11-10 14:01 ` Kevin Wolf
4 siblings, 1 reply; 9+ messages in thread
From: Kevin Wolf @ 2022-11-08 14:13 UTC (permalink / raw)
To: Hanna Reitz; +Cc: qemu-block, qemu-devel, Stefan Hajnoczi
Am 07.11.2022 um 16:13 hat Hanna Reitz geschrieben:
> Hi,
>
> v1 cover letter:
> https://lists.nongnu.org/archive/html/qemu-block/2022-09/msg00389.html
>
> bdrv_replace_child_noperm() drains the child via
> bdrv_parent_drained_{begin,end}_single(). When it removes a child, the
> bdrv_parent_drained_end_single() at its end will be called on an empty
> child, making the BDRV_POLL_WHILE() in it poll the main AioContext
> (because c->bs is NULL).
>
> That’s wrong, though, because it’s supposed to operate on the parent.
> bdrv_parent_drained_end_single_no_poll() will have scheduled any BHs in
> the parents’ AioContext, which may be anything, not necessarily the main
> context. Therefore, we must poll the parent’s context.
>
> Patch 3 does this for both bdrv_parent_drained_{begin,end}_single().
> Patch 1 ensures that we can legally call
> bdrv_child_get_parent_aio_context() from those I/O context functions,
> and patch 2 fixes blk_do_set_aio_context() to not cause an assertion
> failure if it beginning a drain can end up in blk_get_aio_context()
> before blk->ctx has been updated.
Hmm, I may have unintentionally made this series obsolete with the drain
series I sent today. The poll instances that you're fixing simply don't
exist any more after it.
Can you check if the bug is gone with my series? I would hope so, but if
not, we would probably need to apply a fix in a different place.
Kevin
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 0/3] block: Start/end drain on correct AioContext
2022-11-08 14:13 ` [PATCH v2 0/3] " Kevin Wolf
@ 2022-11-08 14:23 ` Kevin Wolf
0 siblings, 0 replies; 9+ messages in thread
From: Kevin Wolf @ 2022-11-08 14:23 UTC (permalink / raw)
To: Hanna Reitz; +Cc: qemu-block, qemu-devel, Stefan Hajnoczi
Am 08.11.2022 um 15:13 hat Kevin Wolf geschrieben:
> Am 07.11.2022 um 16:13 hat Hanna Reitz geschrieben:
> > Hi,
> >
> > v1 cover letter:
> > https://lists.nongnu.org/archive/html/qemu-block/2022-09/msg00389.html
> >
> > bdrv_replace_child_noperm() drains the child via
> > bdrv_parent_drained_{begin,end}_single(). When it removes a child, the
> > bdrv_parent_drained_end_single() at its end will be called on an empty
> > child, making the BDRV_POLL_WHILE() in it poll the main AioContext
> > (because c->bs is NULL).
> >
> > That’s wrong, though, because it’s supposed to operate on the parent.
> > bdrv_parent_drained_end_single_no_poll() will have scheduled any BHs in
> > the parents’ AioContext, which may be anything, not necessarily the main
> > context. Therefore, we must poll the parent’s context.
> >
> > Patch 3 does this for both bdrv_parent_drained_{begin,end}_single().
> > Patch 1 ensures that we can legally call
> > bdrv_child_get_parent_aio_context() from those I/O context functions,
> > and patch 2 fixes blk_do_set_aio_context() to not cause an assertion
> > failure if it beginning a drain can end up in blk_get_aio_context()
> > before blk->ctx has been updated.
>
> Hmm, I may have unintentionally made this series obsolete with the drain
> series I sent today. The poll instances that you're fixing simply don't
> exist any more after it.
>
> Can you check if the bug is gone with my series? I would hope so, but if
> not, we would probably need to apply a fix in a different place.
Actually, on second thoughts, we'd probably still apply your patches as
a fix for 7.2 and then have my patches which would get rid of the
polling only in block-next. Patch 1 and 2 of this series would stay in
the tree, and that seems to make sense to me, too. So obsolete was not
the right word.
But it would still be interesting to see if my series fixes the bug,
too, because otherwise it might introduce a regression later.
By the way, is the bug hard to test in a test case? If this series had
one, I could just have run it myself against my tree.
Kevin
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 0/3] block: Start/end drain on correct AioContext
2022-11-07 15:13 [PATCH v2 0/3] block: Start/end drain on correct AioContext Hanna Reitz
` (3 preceding siblings ...)
2022-11-08 14:13 ` [PATCH v2 0/3] " Kevin Wolf
@ 2022-11-10 14:01 ` Kevin Wolf
2022-11-10 16:11 ` Hanna Reitz
4 siblings, 1 reply; 9+ messages in thread
From: Kevin Wolf @ 2022-11-10 14:01 UTC (permalink / raw)
To: Hanna Reitz; +Cc: qemu-block, qemu-devel, Stefan Hajnoczi
Am 07.11.2022 um 16:13 hat Hanna Reitz geschrieben:
> Hi,
>
> v1 cover letter:
> https://lists.nongnu.org/archive/html/qemu-block/2022-09/msg00389.html
>
> bdrv_replace_child_noperm() drains the child via
> bdrv_parent_drained_{begin,end}_single(). When it removes a child, the
> bdrv_parent_drained_end_single() at its end will be called on an empty
> child, making the BDRV_POLL_WHILE() in it poll the main AioContext
> (because c->bs is NULL).
>
> That’s wrong, though, because it’s supposed to operate on the parent.
> bdrv_parent_drained_end_single_no_poll() will have scheduled any BHs in
> the parents’ AioContext, which may be anything, not necessarily the main
> context. Therefore, we must poll the parent’s context.
>
> Patch 3 does this for both bdrv_parent_drained_{begin,end}_single().
> Patch 1 ensures that we can legally call
> bdrv_child_get_parent_aio_context() from those I/O context functions,
> and patch 2 fixes blk_do_set_aio_context() to not cause an assertion
> failure if it beginning a drain can end up in blk_get_aio_context()
> before blk->ctx has been updated.
Thanks, applied to the block branch.
I would still be interested in a test case as a follow-up.
Kevin
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 0/3] block: Start/end drain on correct AioContext
2022-11-10 14:01 ` Kevin Wolf
@ 2022-11-10 16:11 ` Hanna Reitz
2022-11-10 17:46 ` Kevin Wolf
0 siblings, 1 reply; 9+ messages in thread
From: Hanna Reitz @ 2022-11-10 16:11 UTC (permalink / raw)
To: Kevin Wolf; +Cc: qemu-block, qemu-devel, Stefan Hajnoczi
On 10.11.22 15:01, Kevin Wolf wrote:
> Am 07.11.2022 um 16:13 hat Hanna Reitz geschrieben:
>> Hi,
>>
>> v1 cover letter:
>> https://lists.nongnu.org/archive/html/qemu-block/2022-09/msg00389.html
>>
>> bdrv_replace_child_noperm() drains the child via
>> bdrv_parent_drained_{begin,end}_single(). When it removes a child, the
>> bdrv_parent_drained_end_single() at its end will be called on an empty
>> child, making the BDRV_POLL_WHILE() in it poll the main AioContext
>> (because c->bs is NULL).
>>
>> That’s wrong, though, because it’s supposed to operate on the parent.
>> bdrv_parent_drained_end_single_no_poll() will have scheduled any BHs in
>> the parents’ AioContext, which may be anything, not necessarily the main
>> context. Therefore, we must poll the parent’s context.
>>
>> Patch 3 does this for both bdrv_parent_drained_{begin,end}_single().
>> Patch 1 ensures that we can legally call
>> bdrv_child_get_parent_aio_context() from those I/O context functions,
>> and patch 2 fixes blk_do_set_aio_context() to not cause an assertion
>> failure if it beginning a drain can end up in blk_get_aio_context()
>> before blk->ctx has been updated.
> Thanks, applied to the block branch.
Thanks!
I tested your drain series, and it does indeed fix the bug, too. (Sorry
for the delay, I thought it’d take less time to write an iotest...)
> I would still be interested in a test case as a follow-up.
Got it working now and sent as “tests/stream-under-throttle: New test”.
Hanna
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 0/3] block: Start/end drain on correct AioContext
2022-11-10 16:11 ` Hanna Reitz
@ 2022-11-10 17:46 ` Kevin Wolf
0 siblings, 0 replies; 9+ messages in thread
From: Kevin Wolf @ 2022-11-10 17:46 UTC (permalink / raw)
To: Hanna Reitz; +Cc: qemu-block, qemu-devel, Stefan Hajnoczi
Am 10.11.2022 um 17:11 hat Hanna Reitz geschrieben:
> On 10.11.22 15:01, Kevin Wolf wrote:
> > Am 07.11.2022 um 16:13 hat Hanna Reitz geschrieben:
> > > Hi,
> > >
> > > v1 cover letter:
> > > https://lists.nongnu.org/archive/html/qemu-block/2022-09/msg00389.html
> > >
> > > bdrv_replace_child_noperm() drains the child via
> > > bdrv_parent_drained_{begin,end}_single(). When it removes a child, the
> > > bdrv_parent_drained_end_single() at its end will be called on an empty
> > > child, making the BDRV_POLL_WHILE() in it poll the main AioContext
> > > (because c->bs is NULL).
> > >
> > > That’s wrong, though, because it’s supposed to operate on the parent.
> > > bdrv_parent_drained_end_single_no_poll() will have scheduled any BHs in
> > > the parents’ AioContext, which may be anything, not necessarily the main
> > > context. Therefore, we must poll the parent’s context.
> > >
> > > Patch 3 does this for both bdrv_parent_drained_{begin,end}_single().
> > > Patch 1 ensures that we can legally call
> > > bdrv_child_get_parent_aio_context() from those I/O context functions,
> > > and patch 2 fixes blk_do_set_aio_context() to not cause an assertion
> > > failure if it beginning a drain can end up in blk_get_aio_context()
> > > before blk->ctx has been updated.
> > Thanks, applied to the block branch.
>
> Thanks!
>
> I tested your drain series, and it does indeed fix the bug, too.
> (Sorry for the delay, I thought it’d take less time to write an
> iotest...)
Thanks for testing, it's good to have this confirmed.
> > I would still be interested in a test case as a follow-up.
>
> Got it working now and sent as “tests/stream-under-throttle: New test”.
Great! I'll take a look.
Kevin
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2022-11-10 17:47 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-11-07 15:13 [PATCH v2 0/3] block: Start/end drain on correct AioContext Hanna Reitz
2022-11-07 15:13 ` [PATCH v2 1/3] block: Make bdrv_child_get_parent_aio_context I/O Hanna Reitz
2022-11-07 15:13 ` [PATCH v2 2/3] block-backend: Update ctx immediately after root Hanna Reitz
2022-11-07 15:13 ` [PATCH v2 3/3] block: Start/end drain on correct AioContext Hanna Reitz
2022-11-08 14:13 ` [PATCH v2 0/3] " Kevin Wolf
2022-11-08 14:23 ` Kevin Wolf
2022-11-10 14:01 ` Kevin Wolf
2022-11-10 16:11 ` Hanna Reitz
2022-11-10 17:46 ` Kevin Wolf
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).