From: "Alex Bennée" <alex.bennee@linaro.org>
To: Pavel Dovgalyuk <dovgaluk@ispras.ru>
Cc: 'Paolo Bonzini' <pbonzini@redhat.com>,
'Pavel Dovgalyuk' <Pavel.Dovgaluk@ispras.ru>,
qemu-devel@nongnu.org, kwolf@redhat.com,
peter.maydell@linaro.org, boost.lists@gmail.com,
quintela@redhat.com, jasowang@redhat.com, mst@redhat.com,
zuban32s@gmail.com, maria.klimushenkova@ispras.ru,
kraxel@redhat.com
Subject: Re: [Qemu-devel] [RFC PATCH 17/26] replay: push replay_mutex_lock up the call tree
Date: Fri, 03 Nov 2017 09:47:56 +0000 [thread overview]
Message-ID: <87tvybhewj.fsf@linaro.org> (raw)
In-Reply-To: <001301d35484$75071110$5f153330$@ru>
Pavel Dovgalyuk <dovgaluk@ispras.ru> writes:
>> From: Paolo Bonzini [mailto:pbonzini@redhat.com]
>> On 31/10/2017 12:26, Pavel Dovgalyuk wrote:
>> > + /* We need to drop the replay_lock so any vCPU threads woken up
>> > + * can finish their replay tasks
>> > + */
>> > + if (replay_mode != REPLAY_MODE_NONE) {
>> > + g_assert(replay_mutex_locked());
>> > + qemu_mutex_unlock_iothread();
>> > + replay_mutex_unlock();
>> > + qemu_mutex_lock_iothread();
>> > + }
>>
>> The assert+unlock+lock here is unnecessary; just do
>>
>> if (replay_mode != REPLAY_MODE_NONE) {
>> replay_mutex_unlock();
>> }
>>
>> which according to a previous suggestion can become just
>>
>> replay_mutex_unlock();
>
> We can't remove qemu_mutex_unlock_iothread(), because there is an assert
> inside replay_mutex_unlock(), which checks that iothread is unlocked.
I'm certainly open to reviewing the locking order rules if it is easier
another way around. I'm just conscious that it's easy to deadlock if we
don't pay attention. This is what I wrote in replay.txt:
Locking and thread synchronisation
----------------------------------
Previously the synchronisation of the main thread and the vCPU thread
was ensured by the holding of the BQL. However the trend has been to
reduce the time the BQL was held across the system including under TCG
system emulation. As it is important that batches of events are kept
in sequence (e.g. expiring timers and checkpoints in the main thread
while instruction checkpoints are written by the vCPU thread) we need
another lock to keep things in lock-step. This role is now handled by
the replay_mutex_lock. It used to be held only for each event being
written but now it is held for a whole execution period. This results
in a deterministic ping-pong between the two main threads.
As deadlocks are easy to introduce a new rule is introduced that the
replay_mutex_lock is taken before any BQL locks. Conversely you cannot
release the replay_lock while the BQL is still held.
>
>>
>> > while (!all_vcpus_paused()) {
>> > qemu_cond_wait(&qemu_pause_cond, &qemu_global_mutex);
>> > CPU_FOREACH(cpu) {
>> > qemu_cpu_kick(cpu);
>> > }
>> > }
>> > +
>> > + if (replay_mode != REPLAY_MODE_NONE) {
>> > + qemu_mutex_unlock_iothread();
>> > + replay_mutex_lock();
>> > + qemu_mutex_lock_iothread();
>> > + }
>>
>
> Pavel Dovgalyuk
--
Alex Bennée
next prev parent reply other threads:[~2017-11-03 9:48 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-31 11:24 [Qemu-devel] [RFC PATCH 00/26] replay additions Pavel Dovgalyuk
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 01/26] block: implement bdrv_snapshot_goto for blkreplay Pavel Dovgalyuk
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 02/26] blkreplay: create temporary overlay for underlaying devices Pavel Dovgalyuk
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 03/26] replay: disable default snapshot for record/replay Pavel Dovgalyuk
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 04/26] replay: fix processing async events Pavel Dovgalyuk
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 05/26] replay: fixed replay_enable_events Pavel Dovgalyuk
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 06/26] replay: fix save/load vm for non-empty queue Pavel Dovgalyuk
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 07/26] replay: added replay log format description Pavel Dovgalyuk
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 08/26] replay: make safe vmstop at record/replay Pavel Dovgalyuk
2017-11-02 11:28 ` Paolo Bonzini
2017-11-02 11:57 ` Pavel Dovgalyuk
2017-11-02 12:00 ` Paolo Bonzini
2017-11-02 12:04 ` Pavel Dovgalyuk
2017-11-02 12:21 ` Paolo Bonzini
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 09/26] replay: save prior value of the host clock Pavel Dovgalyuk
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 10/26] icount: fixed saving/restoring of icount warp timers Pavel Dovgalyuk
2017-11-02 11:27 ` Paolo Bonzini
2017-10-31 11:25 ` [Qemu-devel] [RFC PATCH 11/26] target/arm/arm-powertctl: drop BQL assertions Pavel Dovgalyuk
2017-10-31 11:26 ` [Qemu-devel] [RFC PATCH 12/26] cpus: push BQL lock to qemu_*_wait_io_event Pavel Dovgalyuk
2017-11-02 11:26 ` Paolo Bonzini
2017-10-31 11:26 ` [Qemu-devel] [RFC PATCH 13/26] cpus: only take BQL for sleeping threads Pavel Dovgalyuk
2017-11-02 11:08 ` Paolo Bonzini
2017-11-02 18:39 ` David Hildenbrand
2017-11-02 20:03 ` Paolo Bonzini
2017-11-13 8:52 ` Pavel Dovgalyuk
2017-11-13 10:14 ` Alex Bennée
2017-11-13 10:58 ` Paolo Bonzini
2017-10-31 11:26 ` [Qemu-devel] [RFC PATCH 14/26] replay/replay.c: bump REPLAY_VERSION again Pavel Dovgalyuk
2017-10-31 11:26 ` [Qemu-devel] [RFC PATCH 15/26] replay/replay-internal.c: track holding of replay_lock Pavel Dovgalyuk
2017-10-31 11:26 ` [Qemu-devel] [RFC PATCH 16/26] replay: make locking visible outside replay code Pavel Dovgalyuk
2017-10-31 11:26 ` [Qemu-devel] [RFC PATCH 17/26] replay: push replay_mutex_lock up the call tree Pavel Dovgalyuk
2017-11-02 11:56 ` Paolo Bonzini
2017-11-02 12:00 ` Paolo Bonzini
2017-11-03 9:16 ` Pavel Dovgalyuk
2017-11-03 9:47 ` Alex Bennée [this message]
2017-11-03 10:17 ` Paolo Bonzini
2017-11-06 13:05 ` Alex Bennée
2017-11-06 13:10 ` Paolo Bonzini
2017-11-06 16:30 ` Alex Bennée
2017-11-06 16:35 ` Paolo Bonzini
2017-11-03 10:17 ` Paolo Bonzini
2017-10-31 11:26 ` [Qemu-devel] [RFC PATCH 18/26] cpu-exec: don't overwrite exception_index Pavel Dovgalyuk
2017-10-31 11:26 ` [Qemu-devel] [RFC PATCH 19/26] cpu-exec: reset exit flag before calling cpu_exec_nocache Pavel Dovgalyuk
2017-11-02 11:17 ` Paolo Bonzini
2017-11-02 11:24 ` Pavel Dovgalyuk
2017-11-02 11:33 ` Paolo Bonzini
2017-11-02 11:46 ` Paolo Bonzini
2017-11-03 8:27 ` Pavel Dovgalyuk
2017-11-06 13:48 ` Paolo Bonzini
2017-11-10 8:20 ` Pavel Dovgalyuk
2017-11-10 8:31 ` Paolo Bonzini
2017-11-10 12:29 ` Pavel Dovgalyuk
2017-11-10 13:12 ` Paolo Bonzini
2017-11-06 14:01 ` Alex Bennée
2017-11-02 12:45 ` Pavel Dovgalyuk
2017-11-02 14:43 ` Paolo Bonzini
2017-10-31 11:26 ` [Qemu-devel] [RFC PATCH 20/26] replay: don't destroy mutex at exit Pavel Dovgalyuk
2017-10-31 11:26 ` [Qemu-devel] [RFC PATCH 21/26] replay: check return values of fwrite Pavel Dovgalyuk
2017-10-31 11:27 ` [Qemu-devel] [RFC PATCH 22/26] scripts/qemu-gdb: add simple tcg lock status helper Pavel Dovgalyuk
2017-10-31 11:27 ` [Qemu-devel] [RFC PATCH 23/26] util/qemu-thread-*: add qemu_lock, locked and unlock trace events Pavel Dovgalyuk
2017-10-31 11:27 ` [Qemu-devel] [RFC PATCH 24/26] scripts/analyse-locks-simpletrace.py: script to analyse lock times Pavel Dovgalyuk
2017-10-31 11:27 ` [Qemu-devel] [RFC PATCH 25/26] scripts/replay-dump.py: replay log dumper Pavel Dovgalyuk
2017-10-31 11:27 ` [Qemu-devel] [RFC PATCH 26/26] scripts/qemu-gdb/timers.py: new helper to dump timer state Pavel Dovgalyuk
2017-10-31 16:11 ` [Qemu-devel] [RFC PATCH 00/26] replay additions no-reply
2017-10-31 18:31 ` no-reply
-- strict thread matches above, loose matches on Subject: below --
2017-10-31 11:06 Pavel Dovgalyuk
2017-10-31 11:08 ` [Qemu-devel] [RFC PATCH 17/26] replay: push replay_mutex_lock up the call tree Pavel Dovgalyuk
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=87tvybhewj.fsf@linaro.org \
--to=alex.bennee@linaro.org \
--cc=Pavel.Dovgaluk@ispras.ru \
--cc=boost.lists@gmail.com \
--cc=dovgaluk@ispras.ru \
--cc=jasowang@redhat.com \
--cc=kraxel@redhat.com \
--cc=kwolf@redhat.com \
--cc=maria.klimushenkova@ispras.ru \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=zuban32s@gmail.com \
/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.