Commit 03b11982 authored by Paolo Bonzini's avatar Paolo Bonzini
Browse files

Merge tag 'loongarch-kvm-6.17' of...

Merge tag 'loongarch-kvm-6.17' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson into HEAD

LoongArch KVM changes for v6.17

1. Simplify some KVM routines.
2. Enhance in-kernel irqchip emulation.
3. Add stat information with kernel irqchip.
4. Add tracepoints for CPUCFG and CSR emulation exits.
parents 314b40b3 36d09b96
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -50,12 +50,6 @@ struct kvm_vm_stat {
	struct kvm_vm_stat_generic generic;
	u64 pages;
	u64 hugepages;
	u64 ipi_read_exits;
	u64 ipi_write_exits;
	u64 eiointc_read_exits;
	u64 eiointc_write_exits;
	u64 pch_pic_read_exits;
	u64 pch_pic_write_exits;
};

struct kvm_vcpu_stat {
@@ -65,6 +59,12 @@ struct kvm_vcpu_stat {
	u64 cpucfg_exits;
	u64 signal_exits;
	u64 hypercall_exits;
	u64 ipi_read_exits;
	u64 ipi_write_exits;
	u64 eiointc_read_exits;
	u64 eiointc_write_exits;
	u64 pch_pic_read_exits;
	u64 pch_pic_write_exits;
};

#define KVM_MEM_HUGEPAGE_CAPABLE	(1UL << 0)
+14 −19
Original line number Diff line number Diff line
@@ -289,9 +289,11 @@ static int kvm_trap_handle_gspr(struct kvm_vcpu *vcpu)
	er = EMULATE_FAIL;
	switch (((inst.word >> 24) & 0xff)) {
	case 0x0: /* CPUCFG GSPR */
		trace_kvm_exit_cpucfg(vcpu, KVM_TRACE_EXIT_CPUCFG);
		er = kvm_emu_cpucfg(vcpu, inst);
		break;
	case 0x4: /* CSR{RD,WR,XCHG} GSPR */
		trace_kvm_exit_csr(vcpu, KVM_TRACE_EXIT_CSR);
		er = kvm_handle_csr(vcpu, inst);
		break;
	case 0x6: /* Cache, Idle and IOCSR GSPR */
@@ -821,22 +823,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 +844,6 @@ static int kvm_send_pv_ipi(struct kvm_vcpu *vcpu)
	}
}

	return 0;
}

/*
 * Hypercall emulation always return to guest, Caller should check retval.
 */
+82 −471

File changed.

Preview size limit exceeded, changes collapsed.

+4 −24
Original line number Diff line number Diff line
@@ -268,36 +268,16 @@ static int kvm_ipi_read(struct kvm_vcpu *vcpu,
			struct kvm_io_device *dev,
			gpa_t addr, int len, void *val)
{
	int ret;
	struct loongarch_ipi *ipi;

	ipi = vcpu->kvm->arch.ipi;
	if (!ipi) {
		kvm_err("%s: ipi irqchip not valid!\n", __func__);
		return -EINVAL;
	}
	ipi->kvm->stat.ipi_read_exits++;
	ret = loongarch_ipi_readl(vcpu, addr, len, val);

	return ret;
	vcpu->stat.ipi_read_exits++;
	return loongarch_ipi_readl(vcpu, addr, len, val);
}

static int kvm_ipi_write(struct kvm_vcpu *vcpu,
			struct kvm_io_device *dev,
			gpa_t addr, int len, const void *val)
{
	int ret;
	struct loongarch_ipi *ipi;

	ipi = vcpu->kvm->arch.ipi;
	if (!ipi) {
		kvm_err("%s: ipi irqchip not valid!\n", __func__);
		return -EINVAL;
	}
	ipi->kvm->stat.ipi_write_exits++;
	ret = loongarch_ipi_writel(vcpu, addr, len, val);

	return ret;
	vcpu->stat.ipi_write_exits++;
	return loongarch_ipi_writel(vcpu, addr, len, val);
}

static const struct kvm_io_device_ops kvm_ipi_ops = {
+2 −2
Original line number Diff line number Diff line
@@ -196,7 +196,7 @@ static int kvm_pch_pic_read(struct kvm_vcpu *vcpu,
	}

	/* statistics of pch pic reading */
	vcpu->kvm->stat.pch_pic_read_exits++;
	vcpu->stat.pch_pic_read_exits++;
	ret = loongarch_pch_pic_read(s, addr, len, val);

	return ret;
@@ -303,7 +303,7 @@ static int kvm_pch_pic_write(struct kvm_vcpu *vcpu,
	}

	/* statistics of pch pic writing */
	vcpu->kvm->stat.pch_pic_write_exits++;
	vcpu->stat.pch_pic_write_exits++;
	ret = loongarch_pch_pic_write(s, addr, len, val);

	return ret;
Loading