[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 26/33] accel/kvm/kvm-all: Refactor per-vcpu dirty ring reaping
From: |
Dr. David Alan Gilbert (git) |
Subject: |
[PULL 26/33] accel/kvm/kvm-all: Refactor per-vcpu dirty ring reaping |
Date: |
Thu, 23 Jun 2022 10:28:03 +0100 |
From: Hyman Huang(黄勇) <huangy81@chinatelecom.cn>
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:
<bc37b83d5a189add887433728a0f632d35fb3e3e.1652931128.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 ba3210b1c1..672ed004ab 100644
--- a/accel/kvm/kvm-all.c
+++ b/accel/kvm/kvm-all.c
@@ -757,17 +757,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) {
@@ -788,7 +791,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;
@@ -808,7 +811,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;
@@ -855,7 +858,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);
}
@@ -1399,7 +1402,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);
}
@@ -1471,7 +1474,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++;
@@ -2967,7 +2970,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.36.1
- [PULL 17/33] migration: introduce new constructors for QEMUFile, (continued)
- [PULL 17/33] migration: introduce new constructors for QEMUFile, Dr. David Alan Gilbert (git), 2022/06/23
- [PULL 04/33] migration: Change zero_copy_send from migration parameter to migration capability, Dr. David Alan Gilbert (git), 2022/06/23
- [PULL 09/33] migration: rename 'pos' field in QEMUFile to 'bytes_processed', Dr. David Alan Gilbert (git), 2022/06/23
- [PULL 16/33] migration: hardcode assumption that QEMUFile is backed with QIOChannel, Dr. David Alan Gilbert (git), 2022/06/23
- [PULL 18/33] migration: remove unused QEMUFileGetFD typedef / qemu_get_fd method, Dr. David Alan Gilbert (git), 2022/06/23
- [PULL 13/33] migration: introduce a QIOChannel impl for BlockDriverState VMState, Dr. David Alan Gilbert (git), 2022/06/23
- [PULL 21/33] migration: remove the QEMUFileOps 'close' callback, Dr. David Alan Gilbert (git), 2022/06/23
- [PULL 20/33] migration: remove the QEMUFileOps 'set_blocking' callback, Dr. David Alan Gilbert (git), 2022/06/23
- [PULL 22/33] migration: remove the QEMUFileOps 'get_buffer' callback, Dr. David Alan Gilbert (git), 2022/06/23
- [PULL 25/33] migration: remove the QEMUFileOps abstraction, Dr. David Alan Gilbert (git), 2022/06/23
- [PULL 26/33] accel/kvm/kvm-all: Refactor per-vcpu dirty ring reaping,
Dr. David Alan Gilbert (git) <=
- [PULL 24/33] migration: remove the QEMUFileOps 'get_return_path' callback, Dr. David Alan Gilbert (git), 2022/06/23
- [PULL 23/33] migration: remove the QEMUFileOps 'writev_buffer' callback, Dr. David Alan Gilbert (git), 2022/06/23
- [PULL 29/33] softmmu/dirtylimit: Implement vCPU dirtyrate calculation periodically, Dr. David Alan Gilbert (git), 2022/06/23
- [PULL 32/33] softmmu/dirtylimit: Implement dirty page rate limit, Dr. David Alan Gilbert (git), 2022/06/23
- [PULL 30/33] accel/kvm/kvm-all: Introduce kvm_dirty_ring_size function, Dr. David Alan Gilbert (git), 2022/06/23
- [PULL 12/33] migration: rename qemu_file_update_transfer to qemu_file_acct_rate_limit, Dr. David Alan Gilbert (git), 2022/06/23
- [PULL 27/33] cpus: Introduce cpu_list_generation_id, Dr. David Alan Gilbert (git), 2022/06/23
- [PULL 33/33] tests: Add dirty page rate limit test, Dr. David Alan Gilbert (git), 2022/06/23
- [PULL 28/33] migration/dirtyrate: Refactor dirty page rate calculation, Dr. David Alan Gilbert (git), 2022/06/23
- [PULL 31/33] softmmu/dirtylimit: Implement virtual CPU throttle, Dr. David Alan Gilbert (git), 2022/06/23