mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
libxl: event handling: ao_inprogress does waits while reports outstanding
libxl__ao_inprogress needs to check (like libxl__ao_complete_check_progress_reports) that there are no oustanding progress callbacks. Otherwise it might happen that we would destroy the ao while another thread has an outstanding callback its egc report queue. The other thread would then, in its egc_run_callbacks, touch the destroyed ao. Instead, when this happens in libxl__ao_inprogress, simply run round the event loop again. The thread which eventually makes the callback will spot our poller in the ao, and notify the poller, waking us up. This fixes an assertion failure race seen with libvirt: libvirtd: libxl_event.c:1792: libxl__ao_complete_check_progress_reports: Assertion `ao->in_initiator' failed. or (after "Add an assert to egc_run_callbacks") libvirtd: libxl_event.c:1338: egc_run_callbacks: Assertion `aop->ao->magic == 0xA0FACE00ul' failed. Signed-off-by: Ian Jackson <Ian.Jackson@eu.citrix.com> CC: Ian Campbell <ian.campbell@citrix.com> CC: Wei Liu <wei.liu2@citrix.com> CC: Jim Fehlig <jfehlig@suse.com> Acked-by: Wei Liu <wei.liu2@citrix.com>
This commit is contained in:
1 parent
93699882d9
commit
f1335f0d7b
1 file changed
+1
-1
@@ -1878,7 +1878,7 @@ int libxl__ao_inprogress(libxl__ao *ao,
|
||||
for (;;) {
|
||||
assert(ao->magic == LIBXL__AO_MAGIC);
|
||||
|
||||
if (ao->complete) {
|
||||
if (!ao_work_outstanding(ao)) {
|
||||
rc = ao->rc;
|
||||
ao->notified = 1;
|
||||
break;
|
||||
|
||||