Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a812297c authored by Vitaly Kuznetsov's avatar Vitaly Kuznetsov Committed by Paolo Bonzini
Browse files

KVM: x86: hyperv: optimize 'all cpus' case in kvm_hv_flush_tlb()



We can use 'NULL' to represent 'all cpus' case in
kvm_make_vcpus_request_mask() and avoid building vCPU mask with
all vCPUs.

Suggested-by: default avatarRadim Krčmář <rkrcmar@redhat.com>
Signed-off-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
Reviewed-by: default avatarRoman Kagan <rkagan@virtuozzo.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 9170200e
Loading
Loading
Loading
Loading
+23 −19
Original line number Diff line number Diff line
@@ -1325,11 +1325,17 @@ 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;
@@ -1343,8 +1349,7 @@ static u64 kvm_hv_flush_tlb(struct kvm_vcpu *current_vcpu, u64 ingpa,
			 * 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);
			sbank = get_sparse_bank_no(valid_bank_mask, bank);

			if (sbank < 0)
				continue;
@@ -1352,7 +1357,6 @@ static u64 kvm_hv_flush_tlb(struct kvm_vcpu *current_vcpu, u64 ingpa,

		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
+2 −4
Original line number Diff line number Diff line
@@ -219,7 +219,7 @@ bool kvm_make_vcpus_request_mask(struct kvm *kvm, unsigned int req,
	me = get_cpu();

	kvm_for_each_vcpu(i, vcpu, kvm) {
		if (!test_bit(i, vcpu_bitmap))
		if (vcpu_bitmap && !test_bit(i, vcpu_bitmap))
			continue;

		kvm_make_request(req, vcpu);
@@ -243,12 +243,10 @@ bool kvm_make_all_cpus_request(struct kvm *kvm, unsigned int req)
{
	cpumask_var_t cpus;
	bool called;
	static unsigned long vcpu_bitmap[BITS_TO_LONGS(KVM_MAX_VCPUS)]
		= {[0 ... BITS_TO_LONGS(KVM_MAX_VCPUS)-1] = ULONG_MAX};

	zalloc_cpumask_var(&cpus, GFP_ATOMIC);

	called = kvm_make_vcpus_request_mask(kvm, req, vcpu_bitmap, cpus);
	called = kvm_make_vcpus_request_mask(kvm, req, NULL, cpus);

	free_cpumask_var(cpus);
	return called;