Re: [PATCH v2 03/31] KVM: x86: hyper-v: Handle HVCALL_FLUSH_VIRTUAL_ADDRESS_LIST{,EX} calls gently

From: Sean Christopherson
Date: Thu Apr 07 2022 - 13:48:46 EST


On Thu, Apr 07, 2022, Sean Christopherson wrote:
> > @@ -1857,12 +1940,13 @@ static u64 kvm_hv_flush_tlb(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc)
> > struct hv_tlb_flush_ex flush_ex;
> > struct hv_tlb_flush flush;
> > DECLARE_BITMAP(vcpu_mask, KVM_MAX_VCPUS);
> > + u64 entries[KVM_HV_TLB_FLUSH_RING_SIZE - 2];
>
> What's up with the -2? And given the multitude of things going on in this code,
> I'd strongly prefer this be tlbflush_entries.
>
> Actually, if you do:
>
> u64 __tlbflush_entries[KVM_HV_TLB_FLUSH_RING_SIZE - 2];
> u64 *tlbflush_entries;

Looking at future patches, tlb_flush_entries is better for consistency (apply everywhere).

> and drop all_addr, the code to get entries can be
>
> if (hc->code == HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE ||
> hc->code == HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE_EX ||
> hc->rep_cnt > ARRAY_SIZE(tlbflush_entries)) {
> tlbfluish_entries = NULL;
> } else {
> if (kvm_hv_get_tlbflush_entries(kvm, hc, __tlbflush_entries,
> consumed_xmm_halves, data_offset))
> return HV_STATUS_INVALID_HYPERCALL_INPUT;
> tlbfluish_entries = __tlbflush_entries;

Heh, fluish, because TLB entries are somewhat fluid?

> }
>
> and the calls to queue flushes becomes
>
> hv_tlb_flush_ring_enqueue(v, tlbflush_entries, hc->rep_cnt);
>
> That way a bug will "just" be a NULL pointer dereference and not consumption of
> uninitialized data (though such a bug might be caught be caught by the compiler).