[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v8 00/74] per-CPU locks
From: |
Robert Foley |
Subject: |
[PATCH v8 00/74] per-CPU locks |
Date: |
Thu, 26 Mar 2020 15:30:42 -0400 |
V7: https://lists.gnu.org/archive/html/qemu-devel/2019-03/msg00786.html
This is a continuation of the series created by Emilio Cota.
We are picking up this patch set with the goal to apply
any fixes or updates needed to get this accepted.
Quoting an earlier patch in the series:
"For context, the goal of this series is to substitute the BQL for the
per-CPU locks in many places, notably the execution loop in cpus.c.
This leads to better scalability for MTTCG, since CPUs don't have
to acquire a contended global lock (the BQL) every time they
stop executing code.
See the last commit for some performance numbers."
Listed below are the changes for this version of the patch,
aside from the merge related changes.
Changes for V8:
- Fixed issue where in rr mode we could destroy the BQL twice.
Added new function cpu_mutex_destroy().
- Removed g_assert(qemu_mutex_iothread_locked())
from qemu_tcg_rr_all_cpu_threads_idle(). There is an existing
case where we call qemu_tcg_rr_all_cpu_threads_idle() without
the BQL held, so we cannot assert on the lock here.
- Found/fixed bug that had been hit in testing previously during
the last consideration of this patch.
We reproduced the issue hit in the qtest: bios-tables-test.
The issue was introduced by dropping the BQL, and found us
(very rarely) missing the condition variable wakeup in
qemu_tcg_rr_cpu_thread_fn().
- ppc: convert to cpu_halted
- Converted new code for cpu_halted and cpu_halted_set.
- hw/semihosting: convert to cpu_halted_set
- Added this patch as this code was new and needed converting.
- ppc/translate_init.inc.c
- Translated some new code here to use cpu_has_work_with_iothread_lock.
- ppc/sapr_hcall.c Translated new code to cpu_halted
- i386/hax-all.c - converted new code to cpu_interrupt_request and cpu_halted
- mips/kvm.c - converted new code to cpu_halted
- Some changes were related to files that moved, cpu.c and cpu.h
moved to hw/core/, and some changes needed to be put
there manually during the merge.
Emilio G. Cota (69):
cpu: convert queued work to a QSIMPLEQ
cpu: rename cpu->work_mutex to cpu->lock
cpu: introduce cpu_mutex_lock/unlock
cpu: make qemu_work_cond per-cpu
cpu: move run_on_cpu to cpus-common
cpu: introduce process_queued_cpu_work_locked
cpu: make per-CPU locks an alias of the BQL in TCG rr mode
tcg-runtime: define helper_cpu_halted_set
ppc: convert to helper_cpu_halted_set
cris: convert to helper_cpu_halted_set
hppa: convert to helper_cpu_halted_set
m68k: convert to helper_cpu_halted_set
alpha: convert to helper_cpu_halted_set
microblaze: convert to helper_cpu_halted_set
cpu: define cpu_halted helpers
tcg-runtime: convert to cpu_halted_set
arm: convert to cpu_halted
ppc: convert to cpu_halted
sh4: convert to cpu_halted
i386: convert to cpu_halted
lm32: convert to cpu_halted
m68k: convert to cpu_halted
mips: convert to cpu_halted
riscv: convert to cpu_halted
s390x: convert to cpu_halted
sparc: convert to cpu_halted
xtensa: convert to cpu_halted
gdbstub: convert to cpu_halted
openrisc: convert to cpu_halted
cpu-exec: convert to cpu_halted
cpu: convert to cpu_halted
cpu: define cpu_interrupt_request helpers
exec: use cpu_reset_interrupt
arm: convert to cpu_interrupt_request
i386: convert to cpu_interrupt_request
i386/kvm: convert to cpu_interrupt_request
i386/hax-all: convert to cpu_interrupt_request
i386/whpx-all: convert to cpu_interrupt_request
i386/hvf: convert to cpu_request_interrupt
ppc: convert to cpu_interrupt_request
sh4: convert to cpu_interrupt_request
cris: convert to cpu_interrupt_request
hppa: convert to cpu_interrupt_request
lm32: convert to cpu_interrupt_request
m68k: convert to cpu_interrupt_request
mips: convert to cpu_interrupt_request
nios: convert to cpu_interrupt_request
s390x: convert to cpu_interrupt_request
alpha: convert to cpu_interrupt_request
moxie: convert to cpu_interrupt_request
sparc: convert to cpu_interrupt_request
openrisc: convert to cpu_interrupt_request
unicore32: convert to cpu_interrupt_request
microblaze: convert to cpu_interrupt_request
accel/tcg: convert to cpu_interrupt_request
cpu: convert to interrupt_request
cpu: call .cpu_has_work with the CPU lock held
cpu: introduce cpu_has_work_with_iothread_lock
ppc: convert to cpu_has_work_with_iothread_lock
mips: convert to cpu_has_work_with_iothread_lock
s390x: convert to cpu_has_work_with_iothread_lock
riscv: convert to cpu_has_work_with_iothread_lock
sparc: convert to cpu_has_work_with_iothread_lock
xtensa: convert to cpu_has_work_with_iothread_lock
cpu: rename all_cpu_threads_idle to qemu_tcg_rr_all_cpu_threads_idle
cpu: protect CPU state with cpu->lock instead of the BQL
cpus-common: release BQL earlier in run_on_cpu
cpu: add async_run_on_cpu_no_bql
cputlb: queue async flush jobs without the BQL
Paolo Bonzini (4):
ppc: use cpu_reset_interrupt
i386: use cpu_reset_interrupt
s390x: use cpu_reset_interrupt
openrisc: use cpu_reset_interrupt
Robert Foley (1):
hw/semihosting: convert to cpu_halted_set
accel/tcg/cpu-exec.c | 40 ++-
accel/tcg/cputlb.c | 10 +-
accel/tcg/tcg-all.c | 12 +-
accel/tcg/tcg-runtime.c | 7 +
accel/tcg/tcg-runtime.h | 2 +
accel/tcg/translate-all.c | 2 +-
cpus-common.c | 129 +++++++---
cpus.c | 438 ++++++++++++++++++++++++++------
exec.c | 2 +-
gdbstub.c | 4 +-
hw/arm/omap1.c | 4 +-
hw/arm/pxa2xx_gpio.c | 2 +-
hw/arm/pxa2xx_pic.c | 2 +-
hw/core/cpu.c | 29 +--
hw/core/machine-qmp-cmds.c | 2 +-
hw/intc/s390_flic.c | 4 +-
hw/mips/cps.c | 2 +-
hw/misc/mips_itu.c | 4 +-
hw/openrisc/cputimer.c | 2 +-
hw/ppc/e500.c | 4 +-
hw/ppc/ppc.c | 12 +-
hw/ppc/ppce500_spin.c | 6 +-
hw/ppc/spapr_cpu_core.c | 4 +-
hw/ppc/spapr_hcall.c | 14 +-
hw/ppc/spapr_rtas.c | 8 +-
hw/semihosting/console.c | 4 +-
hw/sparc/leon3.c | 2 +-
hw/sparc/sun4m.c | 8 +-
hw/sparc64/sparc64.c | 8 +-
include/hw/core/cpu.h | 197 ++++++++++++--
stubs/Makefile.objs | 1 +
stubs/cpu-lock.c | 35 +++
target/alpha/cpu.c | 8 +-
target/alpha/translate.c | 6 +-
target/arm/arm-powerctl.c | 6 +-
target/arm/cpu.c | 8 +-
target/arm/helper.c | 16 +-
target/arm/machine.c | 2 +-
target/arm/op_helper.c | 2 +-
target/cris/cpu.c | 2 +-
target/cris/helper.c | 4 +-
target/cris/translate.c | 5 +-
target/hppa/cpu.c | 2 +-
target/hppa/translate.c | 3 +-
target/i386/cpu.c | 4 +-
target/i386/cpu.h | 2 +-
target/i386/hax-all.c | 42 +--
target/i386/helper.c | 8 +-
target/i386/hvf/hvf.c | 12 +-
target/i386/hvf/x86hvf.c | 37 +--
target/i386/kvm.c | 82 +++---
target/i386/misc_helper.c | 2 +-
target/i386/seg_helper.c | 13 +-
target/i386/svm_helper.c | 6 +-
target/i386/whpx-all.c | 57 +++--
target/lm32/cpu.c | 2 +-
target/lm32/op_helper.c | 4 +-
target/m68k/cpu.c | 2 +-
target/m68k/op_helper.c | 2 +-
target/m68k/translate.c | 9 +-
target/microblaze/cpu.c | 2 +-
target/microblaze/translate.c | 4 +-
target/mips/cp0_helper.c | 6 +-
target/mips/cpu.c | 11 +-
target/mips/kvm.c | 4 +-
target/mips/op_helper.c | 2 +-
target/mips/translate.c | 4 +-
target/moxie/cpu.c | 2 +-
target/nios2/cpu.c | 2 +-
target/openrisc/cpu.c | 4 +-
target/openrisc/sys_helper.c | 4 +-
target/ppc/excp_helper.c | 6 +-
target/ppc/helper_regs.h | 2 +-
target/ppc/kvm.c | 6 +-
target/ppc/translate.c | 6 +-
target/ppc/translate_init.inc.c | 41 +--
target/riscv/cpu.c | 5 +-
target/riscv/op_helper.c | 2 +-
target/s390x/cpu.c | 28 +-
target/s390x/excp_helper.c | 4 +-
target/s390x/kvm.c | 2 +-
target/s390x/sigp.c | 8 +-
target/sh4/cpu.c | 2 +-
target/sh4/helper.c | 2 +-
target/sh4/op_helper.c | 2 +-
target/sparc/cpu.c | 6 +-
target/sparc/helper.c | 2 +-
target/unicore32/cpu.c | 2 +-
target/unicore32/softmmu.c | 2 +-
target/xtensa/cpu.c | 6 +-
target/xtensa/exc_helper.c | 2 +-
target/xtensa/helper.c | 2 +-
92 files changed, 1067 insertions(+), 464 deletions(-)
create mode 100644 stubs/cpu-lock.c
--
2.17.1
- [PATCH v8 00/74] per-CPU locks,
Robert Foley <=
- [PATCH v8 01/74] cpu: convert queued work to a QSIMPLEQ, Robert Foley, 2020/03/26
- [PATCH v8 02/74] cpu: rename cpu->work_mutex to cpu->lock, Robert Foley, 2020/03/26
- [PATCH v8 03/74] cpu: introduce cpu_mutex_lock/unlock, Robert Foley, 2020/03/26
- [PATCH v8 05/74] cpu: move run_on_cpu to cpus-common, Robert Foley, 2020/03/26
- [PATCH v8 04/74] cpu: make qemu_work_cond per-cpu, Robert Foley, 2020/03/26
- [PATCH v8 06/74] cpu: introduce process_queued_cpu_work_locked, Robert Foley, 2020/03/26
- [PATCH v8 08/74] tcg-runtime: define helper_cpu_halted_set, Robert Foley, 2020/03/26
- [PATCH v8 09/74] ppc: convert to helper_cpu_halted_set, Robert Foley, 2020/03/26
- [PATCH v8 07/74] cpu: make per-CPU locks an alias of the BQL in TCG rr mode, Robert Foley, 2020/03/26
- [PATCH v8 10/74] cris: convert to helper_cpu_halted_set, Robert Foley, 2020/03/26