Skip to content

Commit

Permalink
riscv: KVM: add basic support for host vs guest profiling
Browse files Browse the repository at this point in the history
For the information collected on the host side, we need to
identify which data originates from the guest and record
these events separately, this can be achieved by having
KVM register perf callbacks.

Signed-off-by: Quan Zhou <zhouquan@iscas.ac.cn>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Link: https://lore.kernel.org/r/00342d535311eb0629b9ba4f1e457a48e2abee33.1728957131.git.zhouquan@iscas.ac.cn
Signed-off-by: Anup Patel <anup@brainfault.org>
  • Loading branch information
Quan Zhou authored and Anup Patel committed Oct 28, 2024
1 parent 5bb5ccb commit eded675
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 2 deletions.
10 changes: 10 additions & 0 deletions arch/riscv/include/asm/kvm_host.h
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,16 @@ struct kvm_vcpu_arch {
} sta;
};

/*
* Returns true if a Performance Monitoring Interrupt (PMI), a.k.a. perf event,
* arrived in guest context. For riscv, any event that arrives while a vCPU is
* loaded is considered to be "in guest".
*/
static inline bool kvm_arch_pmi_in_guest(struct kvm_vcpu *vcpu)
{
return IS_ENABLED(CONFIG_GUEST_PERF_EVENTS) && !!vcpu;
}

static inline void kvm_arch_sync_events(struct kvm *kvm) {}

#define KVM_RISCV_GSTAGE_TLB_MIN_ORDER 12
Expand Down
1 change: 1 addition & 0 deletions arch/riscv/kvm/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ config KVM
select KVM_XFER_TO_GUEST_WORK
select KVM_GENERIC_MMU_NOTIFIER
select SCHED_INFO
select GUEST_PERF_EVENTS if PERF_EVENTS
help
Support hosting virtualized guest machines.

Expand Down
12 changes: 10 additions & 2 deletions arch/riscv/kvm/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,12 @@ void kvm_arch_disable_virtualization_cpu(void)
csr_write(CSR_HIDELEG, 0);
}

static void kvm_riscv_teardown(void)
{
kvm_riscv_aia_exit();
kvm_unregister_perf_callbacks();
}

static int __init riscv_kvm_init(void)
{
int rc;
Expand Down Expand Up @@ -105,9 +111,11 @@ static int __init riscv_kvm_init(void)
kvm_info("AIA available with %d guest external interrupts\n",
kvm_riscv_aia_nr_hgei);

kvm_register_perf_callbacks(NULL);

rc = kvm_init(sizeof(struct kvm_vcpu), 0, THIS_MODULE);
if (rc) {
kvm_riscv_aia_exit();
kvm_riscv_teardown();
return rc;
}

Expand All @@ -117,7 +125,7 @@ module_init(riscv_kvm_init);

static void __exit riscv_kvm_exit(void)
{
kvm_riscv_aia_exit();
kvm_riscv_teardown();

kvm_exit();
}
Expand Down
7 changes: 7 additions & 0 deletions arch/riscv/kvm/vcpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,13 @@ bool kvm_arch_vcpu_in_kernel(struct kvm_vcpu *vcpu)
return (vcpu->arch.guest_context.sstatus & SR_SPP) ? true : false;
}

#ifdef CONFIG_GUEST_PERF_EVENTS
unsigned long kvm_arch_vcpu_get_ip(struct kvm_vcpu *vcpu)
{
return vcpu->arch.guest_context.sepc;
}
#endif

vm_fault_t kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf)
{
return VM_FAULT_SIGBUS;
Expand Down

0 comments on commit eded675

Please sign in to comment.