]> xenbits.xensource.com Git - xen.git/commit
libxl: event handling: ao_inprogress does waits while reports outstanding
authorIan Jackson <ian.jackson@eu.citrix.com>
Mon, 9 Feb 2015 15:20:32 +0000 (15:20 +0000)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Mon, 9 Feb 2015 17:41:32 +0000 (17:41 +0000)
commitf1335f0d7b2402e94e0c6e8a905dc309edaafcfb
tree38135605f87b125ee46a43416072f747d6f1bcd2
parent93699882d98cce9736d6e871db303275df1138a2
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>
tools/libxl/libxl_event.c