- support dirty restraint on vCPU - support SPR AMX in Qemu - fix compilation errors of sw64 Signed-off-by: yezengruan <yezengruan@huawei.com>
107 lines
3.6 KiB
Diff
107 lines
3.6 KiB
Diff
From c6f781e50e75fc2e6b819291b6c5ce6c212f018b Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Hyman=20Huang=28=E9=BB=84=E5=8B=87=29?=
|
|
<huangy81@chinatelecom.cn>
|
|
Date: Sun, 26 Jun 2022 01:38:30 +0800
|
|
Subject: [PATCH 1/3] accel/kvm/kvm-all: Refactor per-vcpu dirty ring reaping
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Add a non-required argument 'CPUState' to kvm_dirty_ring_reap so
|
|
that it can cover single vcpu dirty-ring-reaping scenario.
|
|
|
|
Signed-off-by: Hyman Huang(黄勇) <huangy81@chinatelecom.cn>
|
|
Reviewed-by: Peter Xu <peterx@redhat.com>
|
|
Message-Id: <c32001242875e83b0d9f78f396fe2dcd380ba9e8.1656177590.git.huangy81@chinatelecom.cn>
|
|
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
|
---
|
|
accel/kvm/kvm-all.c | 23 +++++++++++++----------
|
|
1 file changed, 13 insertions(+), 10 deletions(-)
|
|
|
|
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
|
|
index f2ce5cd45a..3bc6eb6294 100644
|
|
--- a/accel/kvm/kvm-all.c
|
|
+++ b/accel/kvm/kvm-all.c
|
|
@@ -773,17 +773,20 @@ static uint32_t kvm_dirty_ring_reap_one(KVMState *s, CPUState *cpu)
|
|
}
|
|
|
|
/* Must be with slots_lock held */
|
|
-static uint64_t kvm_dirty_ring_reap_locked(KVMState *s)
|
|
+static uint64_t kvm_dirty_ring_reap_locked(KVMState *s, CPUState* cpu)
|
|
{
|
|
int ret;
|
|
- CPUState *cpu;
|
|
uint64_t total = 0;
|
|
int64_t stamp;
|
|
|
|
stamp = get_clock();
|
|
|
|
- CPU_FOREACH(cpu) {
|
|
- total += kvm_dirty_ring_reap_one(s, cpu);
|
|
+ if (cpu) {
|
|
+ total = kvm_dirty_ring_reap_one(s, cpu);
|
|
+ } else {
|
|
+ CPU_FOREACH(cpu) {
|
|
+ total += kvm_dirty_ring_reap_one(s, cpu);
|
|
+ }
|
|
}
|
|
|
|
if (total) {
|
|
@@ -804,7 +807,7 @@ static uint64_t kvm_dirty_ring_reap_locked(KVMState *s)
|
|
* Currently for simplicity, we must hold BQL before calling this. We can
|
|
* consider to drop the BQL if we're clear with all the race conditions.
|
|
*/
|
|
-static uint64_t kvm_dirty_ring_reap(KVMState *s)
|
|
+static uint64_t kvm_dirty_ring_reap(KVMState *s, CPUState *cpu)
|
|
{
|
|
uint64_t total;
|
|
|
|
@@ -824,7 +827,7 @@ static uint64_t kvm_dirty_ring_reap(KVMState *s)
|
|
* reset below.
|
|
*/
|
|
kvm_slots_lock();
|
|
- total = kvm_dirty_ring_reap_locked(s);
|
|
+ total = kvm_dirty_ring_reap_locked(s, cpu);
|
|
kvm_slots_unlock();
|
|
|
|
return total;
|
|
@@ -871,7 +874,7 @@ static void kvm_dirty_ring_flush(void)
|
|
* vcpus out in a synchronous way.
|
|
*/
|
|
kvm_cpu_synchronize_kick_all();
|
|
- kvm_dirty_ring_reap(kvm_state);
|
|
+ kvm_dirty_ring_reap(kvm_state, NULL);
|
|
trace_kvm_dirty_ring_flush(1);
|
|
}
|
|
|
|
@@ -1415,7 +1418,7 @@ static void kvm_set_phys_mem(KVMMemoryListener *kml,
|
|
* Not easy. Let's cross the fingers until it's fixed.
|
|
*/
|
|
if (kvm_state->kvm_dirty_ring_size) {
|
|
- kvm_dirty_ring_reap_locked(kvm_state);
|
|
+ kvm_dirty_ring_reap_locked(kvm_state, NULL);
|
|
} else {
|
|
kvm_slot_get_dirty_log(kvm_state, mem);
|
|
}
|
|
@@ -1487,7 +1490,7 @@ static void *kvm_dirty_ring_reaper_thread(void *data)
|
|
r->reaper_state = KVM_DIRTY_RING_REAPER_REAPING;
|
|
|
|
qemu_mutex_lock_iothread();
|
|
- kvm_dirty_ring_reap(s);
|
|
+ kvm_dirty_ring_reap(s, NULL);
|
|
qemu_mutex_unlock_iothread();
|
|
|
|
r->reaper_iteration++;
|
|
@@ -2957,7 +2960,7 @@ int kvm_cpu_exec(CPUState *cpu)
|
|
*/
|
|
trace_kvm_dirty_ring_full(cpu->cpu_index);
|
|
qemu_mutex_lock_iothread();
|
|
- kvm_dirty_ring_reap(kvm_state);
|
|
+ kvm_dirty_ring_reap(kvm_state, NULL);
|
|
qemu_mutex_unlock_iothread();
|
|
ret = 0;
|
|
break;
|
|
--
|
|
2.27.0
|
|
|