Message ID | 20210507151203.39643-5-eesposit@redhat.com |
---|---|
State | New |
Headers | show |
Series | blkdebug: fix racing condition when iterating on | expand |
On 5/7/21 10:12 AM, Emanuele Giuseppe Esposito wrote: > That would be unsafe in case a rule other than the current one > is removed while the coroutine has yielded. > Keep FOREACH_SAFE because suspend_request deletes the current rule. > > After this patch, *all* matching rules are deleted before suspending > the coroutine, rather than just one. > This doesn't affect the existing testcases. > > Use actions_count to see how many yeld to issue. yield > > Co-developed-by: Paolo Bonzini <pbonzini@redhat.com> > Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> > --- > block/blkdebug.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) >
diff --git a/block/blkdebug.c b/block/blkdebug.c index 388b5ed615..dffd869b32 100644 --- a/block/blkdebug.c +++ b/block/blkdebug.c @@ -789,7 +789,6 @@ static void suspend_request(BlockDriverState *bs, BlkdebugRule *rule) if (!qtest_enabled()) { printf("blkdebug: Suspended request '%s'\n", r->tag); } - qemu_coroutine_yield(); } static void process_rule(BlockDriverState *bs, struct BlkdebugRule *rule, @@ -834,6 +833,12 @@ static void blkdebug_debug_event(BlockDriverState *bs, BlkdebugEvent event) QLIST_FOREACH_SAFE(rule, &s->rules[event], next, next) { process_rule(bs, rule, actions_count); } + + while (actions_count[ACTION_SUSPEND] > 0) { + qemu_coroutine_yield(); + actions_count[ACTION_SUSPEND]--; + } + s->state = s->new_state; }
That would be unsafe in case a rule other than the current one is removed while the coroutine has yielded. Keep FOREACH_SAFE because suspend_request deletes the current rule. After this patch, *all* matching rules are deleted before suspending the coroutine, rather than just one. This doesn't affect the existing testcases. Use actions_count to see how many yeld to issue. Co-developed-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> --- block/blkdebug.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)