From: Emanuele Giuseppe Esposito <eesposit@redhat.com>
To: qemu-block@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
Emanuele Giuseppe Esposito <eesposit@redhat.com>,
qemu-devel@nongnu.org, Max Reitz <mreitz@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>
Subject: [PATCH v3 0/5] blkdebug: fix racing condition when iterating on
Date: Mon, 17 May 2021 16:50:44 +0200 [thread overview]
Message-ID: <20210517145049.55268-1-eesposit@redhat.com> (raw)
When qemu_coroutine_enter is executed in a loop
(even QEMU_FOREACH_SAFE), the new routine can modify the list,
for example removing an element, causing problem when control
is given back to the caller that continues iterating on the same list.
Patch 1 solves the issue in blkdebug_debug_resume by restarting
the list walk after every coroutine_enter if list has to be fully iterated.
Patches 2,3,4 aim to fix blkdebug_debug_event by gathering
all actions that the rules make in a counter and invoking
the respective coroutine_yeld only after processing all requests.
Patch 5 is somewhat independent of the others, it adds a lock to
protect rules and suspended_reqs; right now everything works because
it's protected by the AioContext lock.
This is a preparation for the current proposal of removing the AioContext
lock and instead using smaller granularity locks to allow multiple
iothread execution in the same block device.
Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
---
v2 -> v3
* Fix "yeld"->"yield" in patches 3-4 [Eric]
* Use lock guard instead of lock/unlock in patch 5 [Eric]
Emanuele Giuseppe Esposito (5):
blkdebug: refactor removal of a suspended request
blkdebug: move post-resume handling to resume_req_by_tag
blkdebug: track all actions
blkdebug: do not suspend in the middle of QLIST_FOREACH_SAFE
blkdebug: protect rules and suspended_reqs with a lock
block/blkdebug.c | 124 +++++++++++++++++++++++++++++++----------------
1 file changed, 83 insertions(+), 41 deletions(-)
--
2.30.2
next reply other threads:[~2021-05-17 14:52 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-17 14:50 Emanuele Giuseppe Esposito [this message]
2021-05-17 14:50 ` [PATCH v3 1/5] blkdebug: refactor removal of a suspended request Emanuele Giuseppe Esposito
2021-05-31 19:44 ` Vladimir Sementsov-Ogievskiy
2021-05-17 14:50 ` [PATCH v3 2/5] blkdebug: move post-resume handling to resume_req_by_tag Emanuele Giuseppe Esposito
2021-05-31 19:50 ` Vladimir Sementsov-Ogievskiy
2021-05-17 14:50 ` [PATCH v3 3/5] blkdebug: track all actions Emanuele Giuseppe Esposito
2021-05-31 19:57 ` Vladimir Sementsov-Ogievskiy
2021-05-17 14:50 ` [PATCH v3 4/5] blkdebug: do not suspend in the middle of QLIST_FOREACH_SAFE Emanuele Giuseppe Esposito
2021-06-01 7:58 ` Vladimir Sementsov-Ogievskiy
2021-05-17 14:50 ` [PATCH v3 5/5] blkdebug: protect rules and suspended_reqs with a lock Emanuele Giuseppe Esposito
2021-06-01 8:39 ` Vladimir Sementsov-Ogievskiy
2021-06-02 12:59 ` Emanuele Giuseppe Esposito
2021-06-02 13:24 ` Vladimir Sementsov-Ogievskiy
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=20210517145049.55268-1-eesposit@redhat.com \
--to=eesposit@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=pbonzini@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.