|
From: | Paolo Bonzini |
Subject: | Re: [PATCH v4 03/10] kvm: dirty-ring: Fix race with vcpu creation |
Date: | Tue, 4 Apr 2023 15:32:38 +0200 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.9.0 |
On 2/16/23 17:18, huangy81@chinatelecom.cn wrote:
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index 9b26582655..47483cdfa0 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -685,6 +685,15 @@ static uint32_t kvm_dirty_ring_reap_one(KVMState *s, CPUState *cpu) uint32_t ring_size = s->kvm_dirty_ring_size; uint32_t count = 0, fetch = cpu->kvm_fetch_index;+ /*+ * It's possible that we race with vcpu creation code where the vcpu is + * put onto the vcpus list but not yet initialized the dirty ring + * structures. If so, skip it. + */ + if (!cpu->created) { + return 0; + } +
Is there a lock that protects cpu->created? If you don't want to use a lock you need to use qatomic_load_acquire together with diff --git a/softmmu/cpus.c b/softmmu/cpus.c index fed20ffb5dd2..15b64e7f4592 100644 --- a/softmmu/cpus.c +++ b/softmmu/cpus.c @@ -525,7 +525,7 @@ void qemu_cond_timedwait_iothread(QemuCond *cond, int ms) /* signal CPU creation */ void cpu_thread_signal_created(CPUState *cpu) { - cpu->created = true; + qatomic_store_release(&cpu->created, true); qemu_cond_signal(&qemu_cpu_cond); }
Paolo
[Prev in Thread] | Current Thread | [Next in Thread] |