[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC PATCH 1/3] cpus: protect queued_work_* with work_m
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [RFC PATCH 1/3] cpus: protect queued_work_* with work_mutex. |
Date: |
Fri, 10 Jul 2015 17:34:24 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.0.1 |
On 10/07/2015 17:32, Frederic Konrad wrote:
>>>
>
> I think something like that can work because we don't have two
> flush_queued_work at the same time on the same CPU?
Yes, this works; there is only one consumer.
Holding locks within a callback can be very painful, especially if there
is a chance that the callback will take a very coarse lock such as big
QEMU lock. It can cause AB-BA deadlocks.
Paolo
> static void flush_queued_work(CPUState *cpu)
> {
> struct qemu_work_item *wi;
>
> if (cpu->queued_work_first == NULL) {
> return;
> }
>
> qemu_mutex_lock(&cpu->work_mutex);
> while ((wi = cpu->queued_work_first)) {
> cpu->queued_work_first = wi->next;
> qemu_mutex_unlock(&cpu->work_mutex);
> wi->func(wi->data);
> qemu_mutex_lock(&cpu->work_mutex);
> wi->done = true;
> if (wi->free) {
> g_free(wi);
> }
> }
> cpu->queued_work_last = NULL;
> qemu_mutex_unlock(&cpu->work_mutex);
>
> qemu_cond_broadcast(&qemu_work_cond);
> }
[Qemu-devel] [RFC PATCH 2/3] cpus: add a tcg_executing flag., fred . konrad, 2015/07/10
[Qemu-devel] [RFC PATCH 3/3] cpus: introduce async_run_safe_work_on_cpu., fred . konrad, 2015/07/10