mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 13:14:02 +02:00
KVM: x86/hyperv: Get target FIFO in hv_tlb_flush_enqueue(), not caller
When handling Hyper-V PV TLB flushes, retrieve the to-be-used FIFO in hv_tlb_flush_enqueue() instead of having the caller pass in the FIFO. This will make it easier to fix a cross-vCPU race where KVM can access a vCPU's FIFO before it's fully initialized. No functional change intended. Link: https://patch.msgid.link/20260630225619.511632-2-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
This commit is contained in:
parent
7a642d8dcf
commit
d151ca6e12
|
|
@ -1935,16 +1935,18 @@ static int kvm_hv_get_tlb_flush_entries(struct kvm *kvm, struct kvm_hv_hcall *hc
|
|||
return kvm_hv_get_hc_data(kvm, hc, hc->rep_cnt, hc->rep_cnt, entries);
|
||||
}
|
||||
|
||||
static void hv_tlb_flush_enqueue(struct kvm_vcpu *vcpu,
|
||||
struct kvm_vcpu_hv_tlb_flush_fifo *tlb_flush_fifo,
|
||||
u64 *entries, int count)
|
||||
static void hv_tlb_flush_enqueue(struct kvm_vcpu *vcpu, u64 *entries, int count,
|
||||
bool is_guest_mode)
|
||||
{
|
||||
struct kvm_vcpu_hv_tlb_flush_fifo *tlb_flush_fifo;
|
||||
struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu);
|
||||
u64 flush_all_entry = KVM_HV_TLB_FLUSHALL_ENTRY;
|
||||
|
||||
if (!hv_vcpu)
|
||||
return;
|
||||
|
||||
tlb_flush_fifo = kvm_hv_get_tlb_flush_fifo(vcpu, is_guest_mode);
|
||||
|
||||
spin_lock(&tlb_flush_fifo->write_lock);
|
||||
|
||||
/*
|
||||
|
|
@ -2017,7 +2019,6 @@ static u64 kvm_hv_flush_tlb(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc)
|
|||
struct kvm *kvm = vcpu->kvm;
|
||||
struct hv_tlb_flush_ex flush_ex;
|
||||
struct hv_tlb_flush flush;
|
||||
struct kvm_vcpu_hv_tlb_flush_fifo *tlb_flush_fifo;
|
||||
/*
|
||||
* Normally, there can be no more than 'KVM_HV_TLB_FLUSH_FIFO_SIZE'
|
||||
* entries on the TLB flush fifo. The last entry, however, needs to be
|
||||
|
|
@ -2144,11 +2145,8 @@ static u64 kvm_hv_flush_tlb(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc)
|
|||
* analyze it here, flush TLB regardless of the specified address space.
|
||||
*/
|
||||
if (all_cpus && !is_guest_mode(vcpu)) {
|
||||
kvm_for_each_vcpu(i, v, kvm) {
|
||||
tlb_flush_fifo = kvm_hv_get_tlb_flush_fifo(v, false);
|
||||
hv_tlb_flush_enqueue(v, tlb_flush_fifo,
|
||||
tlb_flush_entries, hc->rep_cnt);
|
||||
}
|
||||
kvm_for_each_vcpu(i, v, kvm)
|
||||
hv_tlb_flush_enqueue(v, tlb_flush_entries, hc->rep_cnt, false);
|
||||
|
||||
kvm_make_all_cpus_request(kvm, KVM_REQ_HV_TLB_FLUSH);
|
||||
} else if (!is_guest_mode(vcpu)) {
|
||||
|
|
@ -2158,9 +2156,7 @@ static u64 kvm_hv_flush_tlb(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc)
|
|||
v = kvm_get_vcpu(kvm, i);
|
||||
if (!v)
|
||||
continue;
|
||||
tlb_flush_fifo = kvm_hv_get_tlb_flush_fifo(v, false);
|
||||
hv_tlb_flush_enqueue(v, tlb_flush_fifo,
|
||||
tlb_flush_entries, hc->rep_cnt);
|
||||
hv_tlb_flush_enqueue(v, tlb_flush_entries, hc->rep_cnt, false);
|
||||
}
|
||||
|
||||
kvm_make_vcpus_request_mask(kvm, KVM_REQ_HV_TLB_FLUSH, vcpu_mask);
|
||||
|
|
@ -2191,9 +2187,7 @@ static u64 kvm_hv_flush_tlb(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc)
|
|||
continue;
|
||||
|
||||
__set_bit(i, vcpu_mask);
|
||||
tlb_flush_fifo = kvm_hv_get_tlb_flush_fifo(v, true);
|
||||
hv_tlb_flush_enqueue(v, tlb_flush_fifo,
|
||||
tlb_flush_entries, hc->rep_cnt);
|
||||
hv_tlb_flush_enqueue(v, tlb_flush_entries, hc->rep_cnt, true);
|
||||
}
|
||||
|
||||
kvm_make_vcpus_request_mask(kvm, KVM_REQ_HV_TLB_FLUSH, vcpu_mask);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user