On Wed, Apr 19, 2017 at 04:42:19PM +0200, Paolo Bonzini wrote: > All block jobs are using block_job_defer_to_main_loop as the final > step just before the coroutine terminates. At this point, > block_job_enter should do nothing, but currently it restarts > the freed coroutine. > > Now, the job->co states should probably be changed to an enum > (e.g. BEFORE_START, STARTED, YIELDED, COMPLETED) subsuming > block_job_started, job->deferred_to_main_loop and job->busy. > For now, this patch eliminates the problematic reenter by > removing the reset of job->deferred_to_main_loop (which served > no purpose, as far as I could see) and checking the flag in > block_job_enter.
The defer_to_main_loop API was originally written as a utility that could be called multiple times, not just during the final phase of the block job. In practice we only use it to complete the block job. I suggest integrating it more deeply into blockjob.c so that all jobs automatically invoke it once and only once. There should be a BlockJobDriver.main_loop_finalize() callback and the defer_to_main_loop shouldn't be callable outside blockjob.c to prevent misuse.
signature.asc
Description: PGP signature