The purpose of this change is to set the groundwork so that an arch could move towards removing the BQL from the cpu_handle_interrupt/exception paths.
The BQL is a bottleneck in scaling to more cores. And this cpu_handle_interrupt/exception path is one of the key BQL users as measured by the QEMU sync profiling (qsp). We have chosen to break up the process of removing BQL from this path into two pieces: 1) Changes to the core/common functions of cpu_handle_interrupt/exception to drop the holding of the BQL. The holding of the BQL is pushed down to the per-arch implementation code. This set of changes is handled in this patch. This approach of pushing the BQL down to the per arch functions was suggested by Paolo Bonzini. For reference, here are two key posts in the discussion, explaining the reasoning/benefits of this approach. https://lists.gnu.org/archive/html/qemu-devel/2020-07/msg08731.html https://lists.gnu.org/archive/html/qemu-devel/2020-08/msg00044.html 2) Removing the BQL from the per-arch functions. Since the arch now has the code that grabs the BQL, each arch can change its use of the BQL for interrupts independently. We leave it up to the arch to make the change at the time that makes sense. It is worth mentioning that we are working on per-arch changes in line with 2), and plan to submit these. In other words, we plan to set the groundwork with this patch series and then will take advantage of it in later series. This patch series is based on the per-CPU locks patch: https://lists.gnu.org/archive/html/qemu-devel/2020-06/msg05314.html Robert Foley (21): accel/tcg: Change interrupt/exception handling to remove implied BQL target/alpha: add BQL to do_interrupt and cpu_exec_interrupt target/arm: add BQL to do_interrupt and cpu_exec_interrupt target/avr: add BQL to do_interrupt and cpu_exec_interrupt target/cris: add BQL to do_interrupt and cpu_exec_interrupt target/hppa: add BQL to do_interrupt and cpu_exec_interrupt target/i386: add BQL to do_interrupt and cpu_exec_interrupt target/lm32: add BQL to do_interrupt and cpu_exec_interrupt target/m68k: add BQL to do_interrupt and cpu_exec_interrupt target/microblaze: add BQL to do_interrupt and cpu_exec_interrupt target/mips: add BQL to do_interrupt and cpu_exec_interrupt target/nios2: add BQL to do_interrupt and cpu_exec_interrupt target/openrisc: add BQL to do_interrupt and cpu_exec_interrupt target/ppc: add BQL to do_interrupt and cpu_exec_interrupt target/riscv: add BQL to do_interrupt and cpu_exec_interrupt target/rx: add BQL to do_interrupt and cpu_exec_interrupt target/s390x: add BQL to do_interrupt and cpu_exec_interrupt target/sh4: add BQL to do_interrupt and cpu_exec_interrupt target/sparc: add BQL to do_interrupt and cpu_exec_interrupt target/unicore32: add BQL to do_interrupt and cpu_exec_interrupt target/xtensa: add BQL to do_interrupt and cpu_exec_interrupt accel/tcg/cpu-exec.c | 19 +++++++++++-------- target/alpha/helper.c | 15 +++++++++++++-- target/arm/cpu.c | 13 ++++++++++--- target/arm/helper.c | 17 ++++++++++++++++- target/avr/helper.c | 12 +++++++++++- target/cris/helper.c | 18 ++++++++++++++++++ target/hppa/int_helper.c | 25 +++++++++++++++++++------ target/i386/seg_helper.c | 7 +++++-- target/lm32/helper.c | 10 ++++++++++ target/m68k/op_helper.c | 5 +++++ target/microblaze/helper.c | 20 ++++++++++++++++++++ target/mips/helper.c | 10 ++++++++++ target/nios2/cpu.c | 3 +++ target/nios2/helper.c | 8 +++++++- target/openrisc/interrupt.c | 10 ++++++++++ target/ppc/excp_helper.c | 5 +++++ target/riscv/cpu_helper.c | 10 ++++++++++ target/rx/helper.c | 10 ++++++++++ target/s390x/excp_helper.c | 12 +++++++++++- target/sh4/helper.c | 13 +++++++++++-- target/sparc/cpu.c | 3 +++ target/sparc/int32_helper.c | 13 ++++++++++++- target/unicore32/helper.c | 3 +++ target/unicore32/softmmu.c | 7 +++++++ target/xtensa/exc_helper.c | 2 ++ 25 files changed, 242 insertions(+), 28 deletions(-) -- 2.17.1