thread-pool: optimize scheduling of completion bottom half
authorPaolo Bonzini <pbonzini@redhat.com>
Sat, 14 May 2022 06:50:10 +0000 (08:50 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 25 May 2022 19:25:42 +0000 (21:25 +0200)
The completion bottom half was scheduled within the pool->lock
critical section.  That actually results in worse performance,
because the worker thread can run its own small critical section
and go to sleep before the bottom half starts running.

Note that this simple change does not produce an improvement without
changing the thread pool QemuSemaphore to a condition variable.

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Nicolas Saenz Julienne <nsaenzju@redhat.com>
Message-Id: <20220514065012.1149539-2-pbonzini@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
util/thread-pool.c

index 196835b4d358653eb0324fcf64d47841d27a1e5c..4979f30ca350c0bdfb2486ce1cc97420a13732dd 100644 (file)
@@ -127,9 +127,8 @@ static void *worker_thread(void *opaque)
         smp_wmb();
         req->state = THREAD_DONE;
 
-        qemu_mutex_lock(&pool->lock);
-
         qemu_bh_schedule(pool->completion_bh);
+        qemu_mutex_lock(&pool->lock);
     }
 
     pool->cur_threads--;