mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 05:04:02 +02:00
KVM: x86/hyperv: Check for NULL vCPU Hyper-V object in kvm_hv_get_tlb_flush_fifo()
Check for a NULL Hyper-V object in kvm_hv_get_tlb_flush_fifo() instead of relying on the caller to do so. This will allow fixing a cross-vCPU race where KVM can access a vCPU's FIFO before it's fully initialized, without having to jump through too many cognitive hoops to reason about the correctness of the logic. Ignoring changes in ordering that only affect the aforementioned race, no functional change intended. Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com> Link: https://patch.msgid.link/20260630225619.511632-3-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
This commit is contained in:
parent
d151ca6e12
commit
b6de8bfdab
|
|
@ -1939,13 +1939,11 @@ 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);
|
||||
if (!tlb_flush_fifo)
|
||||
return;
|
||||
|
||||
spin_lock(&tlb_flush_fifo->write_lock);
|
||||
|
||||
|
|
@ -1972,15 +1970,16 @@ static void hv_tlb_flush_enqueue(struct kvm_vcpu *vcpu, u64 *entries, int count,
|
|||
int kvm_hv_vcpu_flush_tlb(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct kvm_vcpu_hv_tlb_flush_fifo *tlb_flush_fifo;
|
||||
struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu);
|
||||
u64 entries[KVM_HV_TLB_FLUSH_FIFO_SIZE];
|
||||
int i, j, count;
|
||||
gva_t gva;
|
||||
|
||||
if (!tdp_enabled || !hv_vcpu)
|
||||
if (!tdp_enabled)
|
||||
return -EINVAL;
|
||||
|
||||
tlb_flush_fifo = kvm_hv_get_tlb_flush_fifo(vcpu, is_guest_mode(vcpu));
|
||||
if (!tlb_flush_fifo)
|
||||
return -EINVAL;
|
||||
|
||||
count = kfifo_out(&tlb_flush_fifo->entries, entries, KVM_HV_TLB_FLUSH_FIFO_SIZE);
|
||||
|
||||
|
|
|
|||
|
|
@ -202,6 +202,9 @@ static inline struct kvm_vcpu_hv_tlb_flush_fifo *kvm_hv_get_tlb_flush_fifo(struc
|
|||
int i = is_guest_mode ? HV_L2_TLB_FLUSH_FIFO :
|
||||
HV_L1_TLB_FLUSH_FIFO;
|
||||
|
||||
if (!hv_vcpu)
|
||||
return NULL;
|
||||
|
||||
return &hv_vcpu->tlb_flush_fifo[i];
|
||||
}
|
||||
|
||||
|
|
@ -209,10 +212,12 @@ static inline void kvm_hv_vcpu_purge_flush_tlb(struct kvm_vcpu *vcpu)
|
|||
{
|
||||
struct kvm_vcpu_hv_tlb_flush_fifo *tlb_flush_fifo;
|
||||
|
||||
if (!to_hv_vcpu(vcpu) || !kvm_check_request(KVM_REQ_HV_TLB_FLUSH, vcpu))
|
||||
if (!kvm_check_request(KVM_REQ_HV_TLB_FLUSH, vcpu))
|
||||
return;
|
||||
|
||||
tlb_flush_fifo = kvm_hv_get_tlb_flush_fifo(vcpu, is_guest_mode(vcpu));
|
||||
if (!tlb_flush_fifo)
|
||||
return;
|
||||
|
||||
kfifo_reset_out(&tlb_flush_fifo->entries);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user