Commit 640f8424 authored by Yury Norov (NVIDIA)'s avatar Yury Norov (NVIDIA) Committed by Huacai Chen
Browse files

LoongArch: KVM: Rework kvm_send_pv_ipi()



The function in fact traverses a "bitmap" stored in GPR regs A1 and A2,
but does it in a non-obvious way by creating a single-word bitmap twice.

This patch switches the function to create a single 2-word bitmap, and
also employs for_each_set_bit() macro, as it helps to drop most of the
housekeeping code.

While there, convert the function to return void to not confuse readers
with unchecked result.

Reviewed-by: default avatarBibo Mao <maobibo@loongson.cn>
Signed-off-by: default avatarYury Norov (NVIDIA) <yury.norov@gmail.com>
Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
parent 89be9a83
Loading
Loading
Loading
Loading
+12 −19
Original line number Diff line number Diff line
@@ -821,22 +821,18 @@ static int kvm_handle_lbt_disabled(struct kvm_vcpu *vcpu, int ecode)
	return RESUME_GUEST;
}

static int kvm_send_pv_ipi(struct kvm_vcpu *vcpu)
static void kvm_send_pv_ipi(struct kvm_vcpu *vcpu)
{
	unsigned int min, cpu, i;
	unsigned long ipi_bitmap;
	unsigned int min, cpu;
	struct kvm_vcpu *dest;
	DECLARE_BITMAP(ipi_bitmap, BITS_PER_LONG * 2) = {
		kvm_read_reg(vcpu, LOONGARCH_GPR_A1),
		kvm_read_reg(vcpu, LOONGARCH_GPR_A2)
	};

	min = kvm_read_reg(vcpu, LOONGARCH_GPR_A3);
	for (i = 0; i < 2; i++, min += BITS_PER_LONG) {
		ipi_bitmap = kvm_read_reg(vcpu, LOONGARCH_GPR_A1 + i);
		if (!ipi_bitmap)
			continue;

		cpu = find_first_bit((void *)&ipi_bitmap, BITS_PER_LONG);
		while (cpu < BITS_PER_LONG) {
	for_each_set_bit(cpu, ipi_bitmap, BITS_PER_LONG * 2) {
		dest = kvm_get_vcpu_by_cpuid(vcpu->kvm, cpu + min);
			cpu = find_next_bit((void *)&ipi_bitmap, BITS_PER_LONG, cpu + 1);
		if (!dest)
			continue;

@@ -846,9 +842,6 @@ static int kvm_send_pv_ipi(struct kvm_vcpu *vcpu)
	}
}

	return 0;
}

/*
 * Hypercall emulation always return to guest, Caller should check retval.
 */