[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] cpus: run work items for all vCPUs if single-th
From: |
Emilio G. Cota |
Subject: |
Re: [Qemu-devel] [PATCH] cpus: run work items for all vCPUs if single-threaded |
Date: |
Wed, 14 Nov 2018 14:42:08 -0500 |
User-agent: |
Mutt/1.9.4 (2018-02-28) |
On Wed, Nov 14, 2018 at 12:44:00 +0100, Paolo Bonzini wrote:
> This avoids the following deadlock:
>
> 1) a thread calls run_on_cpu for CPU 2 from a timer, and single_tcg_halt_cond
> is signaled
>
> 2) CPU 1 is running and exits. It finds no work item and enters CPU 2
>
> 3) because the I/O thread is stuck in run_on_cpu, the round-robin kick
> timer never triggers, and CPU 2 never runs the work item
>
> 4) run_on_cpu never completes
I'm having trouble understanding (2)->(3).
When the vCPU thread enters CPU 2, shouldn't it detect that work is
pending? As in:
/* assume cpu == cpu2 in the example above */
while (cpu && !cpu->queued_work_first && !cpu->exit_request) {
Both cpu->queued_work_first and cpu->exit_request will be set for cpu2.
I can see though how with an additional CPU the deadlock
could happen. For example, the I/O thread does run_on_cpu(cpu3),
which kicks cpu1 (i.e. the tcg_current_rr_cpu) and cpu3, but not cpu2.
Then cpu1 exits, and cpu2 starts executing; unless cpu2 exits on its
own volition, it will run forever.
Thanks,
Emilio