Re: [PATCH v3 09/12] KVM: x86: hyper-v: Deactivate APICv only when AutoEOI feature is in use
From: Paolo Bonzini
Date: Tue Aug 03 2021 - 05:11:26 EST
On 02/08/21 20:33, Maxim Levitsky wrote:
+ if (!auto_eoi_old && auto_eoi_new) {
+ if (atomic_inc_return(&hv->synic_auto_eoi_used) == 1)
+ kvm_request_apicv_update(vcpu->kvm, false,
+ APICV_INHIBIT_REASON_HYPERV);
+ } else if (!auto_eoi_new && auto_eoi_old) {
+ if (atomic_dec_return(&hv->synic_auto_eoi_used) == 0)
+ kvm_request_apicv_update(vcpu->kvm, true,
+ APICV_INHIBIT_REASON_HYPERV);
Hmm no, Reviewed-by rescinded. This is racy, you cannot use atomics.
The check for zero needs to happen within the lock.
The easiest way is to have a __kvm_request_apicv_update function that
leaves it to the caller to take the lock. Then synic_update_vector can do
if (!!auto_eoi_old == !!auto_eoi_new)
return;
mutex_lock(&kvm->apicv_update_lock);
bool was_active = hv->synic_auto_eoi_used;
if (auto_eoi_new)
hv->synic_auto_eoi_used++;
else
hv->synic_auto_eoi_used--;
if (!!hv->synic_auto_eoi_used != !!was_active)
__kvm_request_apicv_update(vcpu->kvm,
!!hv->synic_auto_eoi_used,
APICV_INHIBIT_REASON_HYPERV);
mutex_unlock(&kvm->apicv_update_lock);
Please add a note to synic_auto_eoi_used that it is protected by
apicv_update_lock.
Thanks,
Paolo