]> xenbits.xensource.com Git - libvirt.git/commit
rpc: fix race in waking up client event loop
authorDaniel P. Berrangé <berrange@redhat.com>
Mon, 18 Dec 2023 12:17:18 +0000 (12:17 +0000)
committerDaniel P. Berrangé <berrange@redhat.com>
Tue, 9 Jan 2024 11:58:41 +0000 (11:58 +0000)
commit7cb03e6a28e465c49f0cabe8fe2e7d21edb5aadf
tree4065173c36a58dc114c29406617f39938ab56a6b
parent024d6dc2631123d12969bdd8213be573373cf3c3
rpc: fix race in waking up client event loop

The first thread to issue a client RPC request will own the event
loop execution, sitting in the virNetClientIOEventLoop function.

It releases the client lock while running:

   virNetClientUnlock()
   g_main_loop_run()
   virNetClientLock()

If a second thread arrives with an RPC request, it will queue it
for the first thread to process. To inform the first thread that
there's a new request it calls g_main_loop_quit() to break it out
of the main loop.

This works if the first thread is in g_main_loop_run() at that
time. There is a small window of opportunity, however, where
the first thread has released the client lock, but not yet got
into g_main_loop_run(). If that happens, the wakeup from the
second thread is lost.

This patch deals with that by changing the way the wakeup is
performed. Instead of directly calling g_main_loop_quit(), the
second thread creates an idle source to run the quit function
from within the first thread. This guarantees that the first
thread will see the wakeup.

Tested by: Fima Shevrin <efim.shevrin@virtuozzo.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Denis V. Lunev <den@openvz.org>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
src/rpc/virnetclient.c