Message ID | 20250515174641.4000309-1-pierrick.bouvier@linaro.org |
---|---|
State | New |
Headers | show |
Series | system/main: comment lock rationale | expand |
On 5/15/25 10:46 AM, Pierrick Bouvier wrote: > Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> > --- > system/main.c | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/system/main.c b/system/main.c > index 1c022067349..b8f7157cc34 100644 > --- a/system/main.c > +++ b/system/main.c > @@ -69,8 +69,21 @@ int (*qemu_main)(void) = os_darwin_cfrunloop_main; > int main(int argc, char **argv) > { > qemu_init(argc, argv); > + > + /* > + * qemu_init acquires the BQL and replay mutex lock. BQL is acquired when > + * initializing cpus, to block associated threads until initialization is > + * complete. Replay_mutex lock is acquired on initialization, because it > + * must be held when configuring icount_mode. > + * > + * On MacOS, qemu main event loop runs in a background thread, as main > + * thread must be reserved for UI. Thus, we need to transfer lock ownership, > + * and the simplest way to do that is to release them, and reacquire them > + * from qemu_default_main. > + */ > bql_unlock(); > replay_mutex_unlock(); > + > if (qemu_main) { > QemuThread main_loop_thread; > qemu_thread_create(&main_loop_thread, "qemu_main", This was requested previously by Nicholas: https://lore.kernel.org/qemu-devel/D97QJO5Z909K.368VVIBFA17TA@gmail.com/ I sent this patch to qemu-devel some time ago, but it was never reviewed nor pulled, despite multiple pings, so I'm trying again with qemu-trivial. Regards, Pierrick
diff --git a/system/main.c b/system/main.c index 1c022067349..b8f7157cc34 100644 --- a/system/main.c +++ b/system/main.c @@ -69,8 +69,21 @@ int (*qemu_main)(void) = os_darwin_cfrunloop_main; int main(int argc, char **argv) { qemu_init(argc, argv); + + /* + * qemu_init acquires the BQL and replay mutex lock. BQL is acquired when + * initializing cpus, to block associated threads until initialization is + * complete. Replay_mutex lock is acquired on initialization, because it + * must be held when configuring icount_mode. + * + * On MacOS, qemu main event loop runs in a background thread, as main + * thread must be reserved for UI. Thus, we need to transfer lock ownership, + * and the simplest way to do that is to release them, and reacquire them + * from qemu_default_main. + */ bql_unlock(); replay_mutex_unlock(); + if (qemu_main) { QemuThread main_loop_thread; qemu_thread_create(&main_loop_thread, "qemu_main",
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> --- system/main.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)