kvm: expose struct KVMState
Expose struct KVMState out of kvm-all.c so that the field of struct KVMState can be accessed when defining target-specific accelerator properties. Signed-off-by: Chenyi Qiang <chenyi.qiang@intel.com> Message-Id: <20220929072014.20705-4-chenyi.qiang@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
3dba0a335c
commit
5f8a6bce1f
@ -77,86 +77,12 @@
|
|||||||
do { } while (0)
|
do { } while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define KVM_MSI_HASHTAB_SIZE 256
|
|
||||||
|
|
||||||
struct KVMParkedVcpu {
|
struct KVMParkedVcpu {
|
||||||
unsigned long vcpu_id;
|
unsigned long vcpu_id;
|
||||||
int kvm_fd;
|
int kvm_fd;
|
||||||
QLIST_ENTRY(KVMParkedVcpu) node;
|
QLIST_ENTRY(KVMParkedVcpu) node;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum KVMDirtyRingReaperState {
|
|
||||||
KVM_DIRTY_RING_REAPER_NONE = 0,
|
|
||||||
/* The reaper is sleeping */
|
|
||||||
KVM_DIRTY_RING_REAPER_WAIT,
|
|
||||||
/* The reaper is reaping for dirty pages */
|
|
||||||
KVM_DIRTY_RING_REAPER_REAPING,
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* KVM reaper instance, responsible for collecting the KVM dirty bits
|
|
||||||
* via the dirty ring.
|
|
||||||
*/
|
|
||||||
struct KVMDirtyRingReaper {
|
|
||||||
/* The reaper thread */
|
|
||||||
QemuThread reaper_thr;
|
|
||||||
volatile uint64_t reaper_iteration; /* iteration number of reaper thr */
|
|
||||||
volatile enum KVMDirtyRingReaperState reaper_state; /* reap thr state */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct KVMState
|
|
||||||
{
|
|
||||||
AccelState parent_obj;
|
|
||||||
|
|
||||||
int nr_slots;
|
|
||||||
int fd;
|
|
||||||
int vmfd;
|
|
||||||
int coalesced_mmio;
|
|
||||||
int coalesced_pio;
|
|
||||||
struct kvm_coalesced_mmio_ring *coalesced_mmio_ring;
|
|
||||||
bool coalesced_flush_in_progress;
|
|
||||||
int vcpu_events;
|
|
||||||
int robust_singlestep;
|
|
||||||
int debugregs;
|
|
||||||
#ifdef KVM_CAP_SET_GUEST_DEBUG
|
|
||||||
QTAILQ_HEAD(, kvm_sw_breakpoint) kvm_sw_breakpoints;
|
|
||||||
#endif
|
|
||||||
int max_nested_state_len;
|
|
||||||
int many_ioeventfds;
|
|
||||||
int intx_set_mask;
|
|
||||||
int kvm_shadow_mem;
|
|
||||||
bool kernel_irqchip_allowed;
|
|
||||||
bool kernel_irqchip_required;
|
|
||||||
OnOffAuto kernel_irqchip_split;
|
|
||||||
bool sync_mmu;
|
|
||||||
uint64_t manual_dirty_log_protect;
|
|
||||||
/* The man page (and posix) say ioctl numbers are signed int, but
|
|
||||||
* they're not. Linux, glibc and *BSD all treat ioctl numbers as
|
|
||||||
* unsigned, and treating them as signed here can break things */
|
|
||||||
unsigned irq_set_ioctl;
|
|
||||||
unsigned int sigmask_len;
|
|
||||||
GHashTable *gsimap;
|
|
||||||
#ifdef KVM_CAP_IRQ_ROUTING
|
|
||||||
struct kvm_irq_routing *irq_routes;
|
|
||||||
int nr_allocated_irq_routes;
|
|
||||||
unsigned long *used_gsi_bitmap;
|
|
||||||
unsigned int gsi_count;
|
|
||||||
QTAILQ_HEAD(, KVMMSIRoute) msi_hashtab[KVM_MSI_HASHTAB_SIZE];
|
|
||||||
#endif
|
|
||||||
KVMMemoryListener memory_listener;
|
|
||||||
QLIST_HEAD(, KVMParkedVcpu) kvm_parked_vcpus;
|
|
||||||
|
|
||||||
/* For "info mtree -f" to tell if an MR is registered in KVM */
|
|
||||||
int nr_as;
|
|
||||||
struct KVMAs {
|
|
||||||
KVMMemoryListener *ml;
|
|
||||||
AddressSpace *as;
|
|
||||||
} *as;
|
|
||||||
uint64_t kvm_dirty_ring_bytes; /* Size of the per-vcpu dirty ring */
|
|
||||||
uint32_t kvm_dirty_ring_size; /* Number of dirty GFNs per ring */
|
|
||||||
struct KVMDirtyRingReaper reaper;
|
|
||||||
};
|
|
||||||
|
|
||||||
KVMState *kvm_state;
|
KVMState *kvm_state;
|
||||||
bool kvm_kernel_irqchip;
|
bool kvm_kernel_irqchip;
|
||||||
bool kvm_split_irqchip;
|
bool kvm_split_irqchip;
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#define QEMU_KVM_INT_H
|
#define QEMU_KVM_INT_H
|
||||||
|
|
||||||
#include "exec/memory.h"
|
#include "exec/memory.h"
|
||||||
|
#include "qapi/qapi-types-common.h"
|
||||||
#include "qemu/accel.h"
|
#include "qemu/accel.h"
|
||||||
#include "sysemu/kvm.h"
|
#include "sysemu/kvm.h"
|
||||||
|
|
||||||
@ -36,6 +37,81 @@ typedef struct KVMMemoryListener {
|
|||||||
int as_id;
|
int as_id;
|
||||||
} KVMMemoryListener;
|
} KVMMemoryListener;
|
||||||
|
|
||||||
|
#define KVM_MSI_HASHTAB_SIZE 256
|
||||||
|
|
||||||
|
enum KVMDirtyRingReaperState {
|
||||||
|
KVM_DIRTY_RING_REAPER_NONE = 0,
|
||||||
|
/* The reaper is sleeping */
|
||||||
|
KVM_DIRTY_RING_REAPER_WAIT,
|
||||||
|
/* The reaper is reaping for dirty pages */
|
||||||
|
KVM_DIRTY_RING_REAPER_REAPING,
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* KVM reaper instance, responsible for collecting the KVM dirty bits
|
||||||
|
* via the dirty ring.
|
||||||
|
*/
|
||||||
|
struct KVMDirtyRingReaper {
|
||||||
|
/* The reaper thread */
|
||||||
|
QemuThread reaper_thr;
|
||||||
|
volatile uint64_t reaper_iteration; /* iteration number of reaper thr */
|
||||||
|
volatile enum KVMDirtyRingReaperState reaper_state; /* reap thr state */
|
||||||
|
};
|
||||||
|
struct KVMState
|
||||||
|
{
|
||||||
|
AccelState parent_obj;
|
||||||
|
|
||||||
|
int nr_slots;
|
||||||
|
int fd;
|
||||||
|
int vmfd;
|
||||||
|
int coalesced_mmio;
|
||||||
|
int coalesced_pio;
|
||||||
|
struct kvm_coalesced_mmio_ring *coalesced_mmio_ring;
|
||||||
|
bool coalesced_flush_in_progress;
|
||||||
|
int vcpu_events;
|
||||||
|
int robust_singlestep;
|
||||||
|
int debugregs;
|
||||||
|
#ifdef KVM_CAP_SET_GUEST_DEBUG
|
||||||
|
QTAILQ_HEAD(, kvm_sw_breakpoint) kvm_sw_breakpoints;
|
||||||
|
#endif
|
||||||
|
int max_nested_state_len;
|
||||||
|
int many_ioeventfds;
|
||||||
|
int intx_set_mask;
|
||||||
|
int kvm_shadow_mem;
|
||||||
|
bool kernel_irqchip_allowed;
|
||||||
|
bool kernel_irqchip_required;
|
||||||
|
OnOffAuto kernel_irqchip_split;
|
||||||
|
bool sync_mmu;
|
||||||
|
uint64_t manual_dirty_log_protect;
|
||||||
|
/* The man page (and posix) say ioctl numbers are signed int, but
|
||||||
|
* they're not. Linux, glibc and *BSD all treat ioctl numbers as
|
||||||
|
* unsigned, and treating them as signed here can break things */
|
||||||
|
unsigned irq_set_ioctl;
|
||||||
|
unsigned int sigmask_len;
|
||||||
|
GHashTable *gsimap;
|
||||||
|
#ifdef KVM_CAP_IRQ_ROUTING
|
||||||
|
struct kvm_irq_routing *irq_routes;
|
||||||
|
int nr_allocated_irq_routes;
|
||||||
|
unsigned long *used_gsi_bitmap;
|
||||||
|
unsigned int gsi_count;
|
||||||
|
QTAILQ_HEAD(, KVMMSIRoute) msi_hashtab[KVM_MSI_HASHTAB_SIZE];
|
||||||
|
#endif
|
||||||
|
KVMMemoryListener memory_listener;
|
||||||
|
QLIST_HEAD(, KVMParkedVcpu) kvm_parked_vcpus;
|
||||||
|
|
||||||
|
/* For "info mtree -f" to tell if an MR is registered in KVM */
|
||||||
|
int nr_as;
|
||||||
|
struct KVMAs {
|
||||||
|
KVMMemoryListener *ml;
|
||||||
|
AddressSpace *as;
|
||||||
|
} *as;
|
||||||
|
uint64_t kvm_dirty_ring_bytes; /* Size of the per-vcpu dirty ring */
|
||||||
|
uint32_t kvm_dirty_ring_size; /* Number of dirty GFNs per ring */
|
||||||
|
struct KVMDirtyRingReaper reaper;
|
||||||
|
NotifyVmexitOption notify_vmexit;
|
||||||
|
uint32_t notify_window;
|
||||||
|
};
|
||||||
|
|
||||||
void kvm_memory_listener_register(KVMState *s, KVMMemoryListener *kml,
|
void kvm_memory_listener_register(KVMState *s, KVMMemoryListener *kml,
|
||||||
AddressSpace *as, int as_id, const char *name);
|
AddressSpace *as, int as_id, const char *name);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user