Sean Christopherson <seanjc@xxxxxxxxxx> writes: > Refactor the "extended" path of kvm_hv_flush_tlb() to reduce the nesting > depth for the non-fast sparse path, and to make the code more similar to > the extended path in kvm_hv_send_ipi(). > > No functional change intended. > > Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> > --- > arch/x86/kvm/hyperv.c | 40 +++++++++++++++++++++------------------- > 1 file changed, 21 insertions(+), 19 deletions(-) > > diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c > index cf18aa1712bf..e68931ed27f6 100644 > --- a/arch/x86/kvm/hyperv.c > +++ b/arch/x86/kvm/hyperv.c > @@ -1814,31 +1814,33 @@ static u64 kvm_hv_flush_tlb(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc, bool > if (hc->var_cnt != bitmap_weight((unsigned long *)&valid_bank_mask, 64)) > return HV_STATUS_INVALID_HYPERCALL_INPUT; > > - if (!hc->var_cnt && !all_cpus) > + if (all_cpus) > + goto do_flush; You could've probably done: if (all_cpus) { kvm_make_all_cpus_request(kvm, KVM_REQ_TLB_FLUSH_GUEST); goto ret_success; } to get rid on the second 'all_cpus' check (and maybe even 'do_flush' label with some extra work) below. > + > + if (!hc->var_cnt) > goto ret_success; > > - if (!all_cpus) { > - if (hc->fast) { > - if (hc->var_cnt > HV_HYPERCALL_MAX_XMM_REGISTERS - 1) > - return HV_STATUS_INVALID_HYPERCALL_INPUT; > - for (i = 0; i < hc->var_cnt; i += 2) { > - sparse_banks[i] = sse128_lo(hc->xmm[i / 2 + 1]); > - sparse_banks[i + 1] = sse128_hi(hc->xmm[i / 2 + 1]); > - } > - } else { > - if (hc->var_cnt > 64) > - return HV_STATUS_INVALID_HYPERCALL_INPUT; > - > - gpa = hc->ingpa + offsetof(struct hv_tlb_flush_ex, > - hv_vp_set.bank_contents); > - if (unlikely(kvm_read_guest(kvm, gpa, sparse_banks, > - hc->var_cnt * > - sizeof(sparse_banks[0])))) > - return HV_STATUS_INVALID_HYPERCALL_INPUT; > + if (hc->fast) { > + if (hc->var_cnt > HV_HYPERCALL_MAX_XMM_REGISTERS - 1) > + return HV_STATUS_INVALID_HYPERCALL_INPUT; > + for (i = 0; i < hc->var_cnt; i += 2) { > + sparse_banks[i] = sse128_lo(hc->xmm[i / 2 + 1]); > + sparse_banks[i + 1] = sse128_hi(hc->xmm[i / 2 + 1]); > } > + goto do_flush; > } > + > + if (hc->var_cnt > 64) > + return HV_STATUS_INVALID_HYPERCALL_INPUT; > + > + gpa = hc->ingpa + offsetof(struct hv_tlb_flush_ex, > + hv_vp_set.bank_contents); > + if (unlikely(kvm_read_guest(kvm, gpa, sparse_banks, > + hc->var_cnt * sizeof(sparse_banks[0])))) > + return HV_STATUS_INVALID_HYPERCALL_INPUT; > } > > +do_flush: > /* > * vcpu->arch.cr3 may not be up-to-date for running vCPUs so we can't > * analyze it here, flush TLB regardless of the specified address space. Reviewed-by: Vitaly Kuznetsov <vkuznets@xxxxxxxxxx> -- Vitaly