|
@@ -1325,35 +1325,39 @@ static u64 kvm_hv_flush_tlb(struct kvm_vcpu *current_vcpu, u64 ingpa,
|
|
|
|
|
|
cpumask_clear(&hv_current->tlb_lush);
|
|
|
|
|
|
+ if (all_cpus) {
|
|
|
+ kvm_make_vcpus_request_mask(kvm,
|
|
|
+ KVM_REQ_TLB_FLUSH | KVM_REQUEST_NO_WAKEUP,
|
|
|
+ NULL, &hv_current->tlb_lush);
|
|
|
+ goto ret_success;
|
|
|
+ }
|
|
|
+
|
|
|
kvm_for_each_vcpu(i, vcpu, kvm) {
|
|
|
struct kvm_vcpu_hv *hv = &vcpu->arch.hyperv;
|
|
|
int bank = hv->vp_index / 64, sbank = 0;
|
|
|
|
|
|
- if (!all_cpus) {
|
|
|
- /* Banks >64 can't be represented */
|
|
|
- if (bank >= 64)
|
|
|
- continue;
|
|
|
-
|
|
|
- /* Non-ex hypercalls can only address first 64 vCPUs */
|
|
|
- if (!ex && bank)
|
|
|
- continue;
|
|
|
+ /* Banks >64 can't be represented */
|
|
|
+ if (bank >= 64)
|
|
|
+ continue;
|
|
|
|
|
|
- if (ex) {
|
|
|
- /*
|
|
|
- * Check is the bank of this vCPU is in sparse
|
|
|
- * set and get the sparse bank number.
|
|
|
- */
|
|
|
- sbank = get_sparse_bank_no(valid_bank_mask,
|
|
|
- bank);
|
|
|
+ /* Non-ex hypercalls can only address first 64 vCPUs */
|
|
|
+ if (!ex && bank)
|
|
|
+ continue;
|
|
|
|
|
|
- if (sbank < 0)
|
|
|
- continue;
|
|
|
- }
|
|
|
+ if (ex) {
|
|
|
+ /*
|
|
|
+ * Check is the bank of this vCPU is in sparse
|
|
|
+ * set and get the sparse bank number.
|
|
|
+ */
|
|
|
+ sbank = get_sparse_bank_no(valid_bank_mask, bank);
|
|
|
|
|
|
- if (!(sparse_banks[sbank] & BIT_ULL(hv->vp_index % 64)))
|
|
|
+ if (sbank < 0)
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
+ if (!(sparse_banks[sbank] & BIT_ULL(hv->vp_index % 64)))
|
|
|
+ continue;
|
|
|
+
|
|
|
/*
|
|
|
* 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
|