Accelerators patches
- Unify x86/arm hw/xen/arch_hvm.h header
- Move non-system-specific 'accel/accel-ops.h' and 'accel-cpu-ops.h' to accel/
- Move KVM definitions qapi/accelerator.json
- Add @qom-type field to CpuInfoFast QAPI structure
- Display CPU model name in 'info cpus' HMP command
- Introduce @x-accel-stats QMP command
- Add 'info accel' on HMP
- Improve qemu_add_vm_change_state_handler*() docstring
- Extract TCG statistic related code to tcg-stats.c
- Implement AccelClass::get_[vcpu]_stats() handlers for TCG and HVF
- Do not dump NaN in TCG statistics
- Revert incomplete "accel/tcg: Unregister the RCU before exiting RR thread"
-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEE+qvnXhKRciHc/Wuy4+MsLN6twN4FAmh2r4UACgkQ4+MsLN6t
wN5i6xAAkOvwFh1GmsPUdz5RxzsWoIUDvyENg6E8Axwe5tSEMRFiPjabbTQJomQg
GZt75XIS24LZFZ+hvqrLSA+dFgXTgWv08ZE81EjwjmAMBlLCOPhCgeN6C1p8100Y
scSvRJbP9k9lpA5K7et/1X4AkK2cZyh+LGJgCjr2Al2mbERpPueDF8fxqeohFvXQ
nTSks4XlA0yQ06+9r49aQAiuXvgg9lDT1wIglD2HEV7vOVs/ud+yyL8+z5YMeFzx
pSIc6wDu4PqdA46w4MZs90uTy7S/PMvBiYDEiV3tKzg0MLttvFGlT58/YjVtguTP
mNkfwIEwQtDQzoxsFIJO7yBTlTRBs95V4aIVk3pB+Gb/bideRPIkeVQvgMSEBKj7
N0pEXWOxfB9iIWO6b1utYpQ4uxeDOU/8DPUCit1IBbNgKTaJkJb77fboYk7NaB0K
KEtObAk6jMatB/xr+vUFWc4sMk9wlm72w8wcQzgKZ0xV2U3d1/Y/9nS4GvI510ev
TRQ3mKj7N319uCeId1czF6W8rillCJ2u8ZK53u+Nfp7R3PbsRSMc6IDJ1UdDUlyR
HFcWHxbcbEGhe8SnFGab4Qd6fWChcn2EaEoAJJz+Rqv0k3zcwqccNM5waCABAjTE
0S22JIHePJKcpkMLGq3EOUAQuu+8Zsol7gPCLxSAMclVqPTl9ck=
=rAav
-----END PGP SIGNATURE-----
Merge tag 'accel-20250715' of https://github.com/philmd/qemu into staging
Accelerators patches
- Unify x86/arm hw/xen/arch_hvm.h header
- Move non-system-specific 'accel/accel-ops.h' and 'accel-cpu-ops.h' to accel/
- Move KVM definitions qapi/accelerator.json
- Add @qom-type field to CpuInfoFast QAPI structure
- Display CPU model name in 'info cpus' HMP command
- Introduce @x-accel-stats QMP command
- Add 'info accel' on HMP
- Improve qemu_add_vm_change_state_handler*() docstring
- Extract TCG statistic related code to tcg-stats.c
- Implement AccelClass::get_[vcpu]_stats() handlers for TCG and HVF
- Do not dump NaN in TCG statistics
- Revert incomplete "accel/tcg: Unregister the RCU before exiting RR thread"
# -----BEGIN PGP SIGNATURE-----
#
# iQIzBAABCAAdFiEE+qvnXhKRciHc/Wuy4+MsLN6twN4FAmh2r4UACgkQ4+MsLN6t
# wN5i6xAAkOvwFh1GmsPUdz5RxzsWoIUDvyENg6E8Axwe5tSEMRFiPjabbTQJomQg
# GZt75XIS24LZFZ+hvqrLSA+dFgXTgWv08ZE81EjwjmAMBlLCOPhCgeN6C1p8100Y
# scSvRJbP9k9lpA5K7et/1X4AkK2cZyh+LGJgCjr2Al2mbERpPueDF8fxqeohFvXQ
# nTSks4XlA0yQ06+9r49aQAiuXvgg9lDT1wIglD2HEV7vOVs/ud+yyL8+z5YMeFzx
# pSIc6wDu4PqdA46w4MZs90uTy7S/PMvBiYDEiV3tKzg0MLttvFGlT58/YjVtguTP
# mNkfwIEwQtDQzoxsFIJO7yBTlTRBs95V4aIVk3pB+Gb/bideRPIkeVQvgMSEBKj7
# N0pEXWOxfB9iIWO6b1utYpQ4uxeDOU/8DPUCit1IBbNgKTaJkJb77fboYk7NaB0K
# KEtObAk6jMatB/xr+vUFWc4sMk9wlm72w8wcQzgKZ0xV2U3d1/Y/9nS4GvI510ev
# TRQ3mKj7N319uCeId1czF6W8rillCJ2u8ZK53u+Nfp7R3PbsRSMc6IDJ1UdDUlyR
# HFcWHxbcbEGhe8SnFGab4Qd6fWChcn2EaEoAJJz+Rqv0k3zcwqccNM5waCABAjTE
# 0S22JIHePJKcpkMLGq3EOUAQuu+8Zsol7gPCLxSAMclVqPTl9ck=
# =rAav
# -----END PGP SIGNATURE-----
# gpg: Signature made Tue 15 Jul 2025 15:44:05 EDT
# gpg: using RSA key FAABE75E12917221DCFD6BB2E3E32C2CDEADC0DE
# gpg: Good signature from "Philippe Mathieu-Daudé (F4BUG) <f4bug@amsat.org>" [full]
# Primary key fingerprint: FAAB E75E 1291 7221 DCFD 6BB2 E3E3 2C2C DEAD C0DE
* tag 'accel-20250715' of https://github.com/philmd/qemu:
system/runstate: Document qemu_add_vm_change_state_handler_prio* in hdr
system/runstate: Document qemu_add_vm_change_state_handler()
accel/hvf: Implement AccelClass::get_vcpu_stats() handler
accel/tcg: Implement AccelClass::get_stats() handler
accel/tcg: Propagate AccelState to dump_accel_info()
accel/system: Add 'info accel' on human monitor
accel/system: Introduce @x-accel-stats QMP command
accel/tcg: Extract statistic related code to tcg-stats.c
Revert "accel/tcg: Unregister the RCU before exiting RR thread"
accel: Extract AccelClass definition to 'accel/accel-ops.h'
accel: Rename 'system/accel-ops.h' -> 'accel/accel-cpu-ops.h'
accel/tcg: Do not dump NaN statistics
hw/core/machine: Display CPU model name in 'info cpus' command
qapi/machine: Add @qom-type field to CpuInfoFast structure
qapi/accel: Move definitions related to accelerators in their own file
hw/arm/xen-pvh: Remove unnecessary 'hw/xen/arch_hvm.h' header
hw/xen/arch_hvm: Unify x86 and ARM variants
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Conflicts:
qapi/machine.json
Commit 0462da9d6b ("qapi: remove trivial "Returns:" sections")
removed trivial "Returns:". This caused a conflict with the move from
machine.json to accelerator.json.
This commit is contained in:
commit
f96b157ebb
47 changed files with 513 additions and 333 deletions
|
|
@ -1,92 +0,0 @@
|
|||
/*
|
||||
* Accelerator OPS, used for cpus.c module
|
||||
*
|
||||
* Copyright 2021 SUSE LLC
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
||||
* See the COPYING file in the top-level directory.
|
||||
*/
|
||||
|
||||
#ifndef ACCEL_OPS_H
|
||||
#define ACCEL_OPS_H
|
||||
|
||||
#include "qemu/accel.h"
|
||||
#include "exec/vaddr.h"
|
||||
#include "qom/object.h"
|
||||
|
||||
#define ACCEL_OPS_SUFFIX "-ops"
|
||||
#define TYPE_ACCEL_OPS "accel" ACCEL_OPS_SUFFIX
|
||||
#define ACCEL_OPS_NAME(name) (name "-" TYPE_ACCEL_OPS)
|
||||
|
||||
DECLARE_CLASS_CHECKERS(AccelOpsClass, ACCEL_OPS, TYPE_ACCEL_OPS)
|
||||
|
||||
/**
|
||||
* struct AccelOpsClass - accelerator interfaces
|
||||
*
|
||||
* This structure is used to abstract accelerator differences from the
|
||||
* core CPU code. Not all have to be implemented.
|
||||
*/
|
||||
struct AccelOpsClass {
|
||||
/*< private >*/
|
||||
ObjectClass parent_class;
|
||||
/*< public >*/
|
||||
|
||||
/* initialization function called when accel is chosen */
|
||||
void (*ops_init)(AccelClass *ac);
|
||||
|
||||
bool (*cpus_are_resettable)(void);
|
||||
void (*cpu_reset_hold)(CPUState *cpu);
|
||||
|
||||
void (*create_vcpu_thread)(CPUState *cpu); /* MANDATORY NON-NULL */
|
||||
void (*kick_vcpu_thread)(CPUState *cpu);
|
||||
bool (*cpu_thread_is_idle)(CPUState *cpu);
|
||||
|
||||
/**
|
||||
* synchronize_post_reset:
|
||||
* synchronize_post_init:
|
||||
* @cpu: The vCPU to synchronize.
|
||||
*
|
||||
* Request to synchronize QEMU vCPU registers to the hardware accelerator
|
||||
* (QEMU is the reference).
|
||||
*/
|
||||
void (*synchronize_post_reset)(CPUState *cpu);
|
||||
void (*synchronize_post_init)(CPUState *cpu);
|
||||
/**
|
||||
* synchronize_state:
|
||||
* synchronize_pre_loadvm:
|
||||
* @cpu: The vCPU to synchronize.
|
||||
*
|
||||
* Request to synchronize QEMU vCPU registers from the hardware accelerator
|
||||
* (the hardware accelerator is the reference).
|
||||
*/
|
||||
void (*synchronize_state)(CPUState *cpu);
|
||||
void (*synchronize_pre_loadvm)(CPUState *cpu);
|
||||
|
||||
/* handle_interrupt is mandatory. */
|
||||
void (*handle_interrupt)(CPUState *cpu, int mask);
|
||||
|
||||
/**
|
||||
* @get_virtual_clock: fetch virtual clock
|
||||
* @set_virtual_clock: set virtual clock
|
||||
*
|
||||
* These allow the timer subsystem to defer to the accelerator to
|
||||
* fetch time. The set function is needed if the accelerator wants
|
||||
* to track the changes to time as the timer is warped through
|
||||
* various timer events.
|
||||
*/
|
||||
int64_t (*get_virtual_clock)(void);
|
||||
void (*set_virtual_clock)(int64_t time);
|
||||
|
||||
int64_t (*get_elapsed_ticks)(void);
|
||||
|
||||
/* gdbstub hooks */
|
||||
bool (*supports_guest_debug)(void);
|
||||
int (*update_guest_debug)(CPUState *cpu);
|
||||
int (*insert_breakpoint)(CPUState *cpu, int type, vaddr addr, vaddr len);
|
||||
int (*remove_breakpoint)(CPUState *cpu, int type, vaddr addr, vaddr len);
|
||||
void (*remove_all_breakpoints)(CPUState *cpu);
|
||||
};
|
||||
|
||||
void generic_handle_interrupt(CPUState *cpu, int mask);
|
||||
|
||||
#endif /* ACCEL_OPS_H */
|
||||
|
|
@ -14,6 +14,7 @@
|
|||
#include "qemu/queue.h"
|
||||
#include "exec/vaddr.h"
|
||||
#include "qom/object.h"
|
||||
#include "accel/accel-ops.h"
|
||||
|
||||
#ifdef __aarch64__
|
||||
#include <Hypervisor/Hypervisor.h>
|
||||
|
|
@ -45,7 +46,7 @@ typedef struct hvf_vcpu_caps {
|
|||
} hvf_vcpu_caps;
|
||||
|
||||
struct HVFState {
|
||||
AccelState parent;
|
||||
AccelState parent_obj;
|
||||
|
||||
hvf_slot slots[32];
|
||||
int num_slots;
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
#include "qemu/accel.h"
|
||||
#include "qemu/queue.h"
|
||||
#include "system/kvm.h"
|
||||
#include "accel/accel-ops.h"
|
||||
#include "hw/boards.h"
|
||||
#include "hw/i386/topology.h"
|
||||
#include "io/channel-socket.h"
|
||||
|
|
|
|||
|
|
@ -14,11 +14,51 @@ void runstate_replay_enable(void);
|
|||
typedef void VMChangeStateHandler(void *opaque, bool running, RunState state);
|
||||
typedef int VMChangeStateHandlerWithRet(void *opaque, bool running, RunState state);
|
||||
|
||||
/**
|
||||
* qemu_add_vm_change_state_handler:
|
||||
* @cb: the callback to invoke
|
||||
* @opaque: user data passed to the callback
|
||||
*
|
||||
* Register a callback function that is invoked when the vm starts or stops
|
||||
* running.
|
||||
*
|
||||
* Returns: an entry to be freed using qemu_del_vm_change_state_handler()
|
||||
*/
|
||||
VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb,
|
||||
void *opaque);
|
||||
/**
|
||||
* qemu_add_vm_change_state_handler_prio:
|
||||
* @cb: the callback to invoke
|
||||
* @opaque: user data passed to the callback
|
||||
* @priority: low priorities execute first when the vm runs and the reverse is
|
||||
* true when the vm stops
|
||||
*
|
||||
* Register a callback function that is invoked when the vm starts or stops
|
||||
* running.
|
||||
*
|
||||
* Returns: an entry to be freed using qemu_del_vm_change_state_handler()
|
||||
*/
|
||||
VMChangeStateEntry *qemu_add_vm_change_state_handler_prio(
|
||||
VMChangeStateHandler *cb, void *opaque, int priority);
|
||||
VMChangeStateEntry *
|
||||
/**
|
||||
* qemu_add_vm_change_state_handler_prio_full:
|
||||
* @cb: the main callback to invoke
|
||||
* @prepare_cb: a callback to invoke before the main callback
|
||||
* @cb_ret: the main callback to invoke with return value
|
||||
* @opaque: user data passed to the callbacks
|
||||
* @priority: low priorities execute first when the vm runs and the reverse is
|
||||
* true when the vm stops
|
||||
*
|
||||
* Register a main callback function and an optional prepare callback function
|
||||
* that are invoked when the vm starts or stops running. The main callback and
|
||||
* the prepare callback are called in two separate phases: First all prepare
|
||||
* callbacks are called and only then all main callbacks are called. As its
|
||||
* name suggests, the prepare callback can be used to do some preparatory work
|
||||
* before invoking the main callback.
|
||||
*
|
||||
* Returns: an entry to be freed using qemu_del_vm_change_state_handler()
|
||||
*/
|
||||
qemu_add_vm_change_state_handler_prio_full(VMChangeStateHandler *cb,
|
||||
VMChangeStateHandler *prepare_cb,
|
||||
VMChangeStateHandlerWithRet *cb_ret,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue