219 lines
6.6 KiB
Diff
219 lines
6.6 KiB
Diff
|
|
From 9f7f9fdf2246c653673d07fccc07cdc6b03f8722 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Chenyi Qiang <chenyi.qiang@intel.com>
|
||
|
|
Date: Thu, 29 Sep 2022 15:20:13 +0800
|
||
|
|
Subject: [PATCH] kvm: expose struct KVMState
|
||
|
|
|
||
|
|
from mainline-v7.2.0-rc0
|
||
|
|
commit 5f8a6bce1f1080058ed29d716cae81ea805142ae
|
||
|
|
category: feature
|
||
|
|
feature: Notify VM Exit
|
||
|
|
bugzilla: https://gitee.com/openeuler/intel-qemu/issues/I6GWQE
|
||
|
|
|
||
|
|
Intel-SIG: commit 5f8a6bce1f10 ("kvm: expose struct KVMState")
|
||
|
|
|
||
|
|
------------------------------------------------------------------
|
||
|
|
|
||
|
|
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>
|
||
|
|
Signed-off-by: Jason Zeng <jason.zeng@intel.com>
|
||
|
|
---
|
||
|
|
accel/kvm/kvm-all.c | 74 --------------------------------------
|
||
|
|
include/sysemu/kvm_int.h | 76 ++++++++++++++++++++++++++++++++++++++++
|
||
|
|
2 files changed, 76 insertions(+), 74 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
|
||
|
|
index e5681a6cd0..91d93facf2 100644
|
||
|
|
--- a/accel/kvm/kvm-all.c
|
||
|
|
+++ b/accel/kvm/kvm-all.c
|
||
|
|
@@ -72,86 +72,12 @@
|
||
|
|
do { } while (0)
|
||
|
|
#endif
|
||
|
|
|
||
|
|
-#define KVM_MSI_HASHTAB_SIZE 256
|
||
|
|
-
|
||
|
|
struct KVMParkedVcpu {
|
||
|
|
unsigned long vcpu_id;
|
||
|
|
int kvm_fd;
|
||
|
|
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;
|
||
|
|
bool kvm_kernel_irqchip;
|
||
|
|
bool kvm_split_irqchip;
|
||
|
|
diff --git a/include/sysemu/kvm_int.h b/include/sysemu/kvm_int.h
|
||
|
|
index 1f5487d9b7..3b4adcdc10 100644
|
||
|
|
--- a/include/sysemu/kvm_int.h
|
||
|
|
+++ b/include/sysemu/kvm_int.h
|
||
|
|
@@ -10,6 +10,7 @@
|
||
|
|
#define QEMU_KVM_INT_H
|
||
|
|
|
||
|
|
#include "exec/memory.h"
|
||
|
|
+#include "qapi/qapi-types-common.h"
|
||
|
|
#include "qemu/accel.h"
|
||
|
|
#include "sysemu/kvm.h"
|
||
|
|
|
||
|
|
@@ -36,6 +37,81 @@ typedef struct KVMMemoryListener {
|
||
|
|
int as_id;
|
||
|
|
} 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,
|
||
|
|
AddressSpace *as, int as_id, const char *name);
|
||
|
|
|
||
|
|
--
|
||
|
|
2.27.0
|
||
|
|
|