From 434a6210041dd447acae38b95561a2d990efa153 Mon Sep 17 00:00:00 2001 From: Louis Burda Date: Thu, 27 Oct 2022 23:35:21 +0200 Subject: Add online baseline measurement and pmc reset --- patch.diff | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'patch.diff') diff --git a/patch.diff b/patch.diff index 28fa115..aa166bc 100755 --- a/patch.diff +++ b/patch.diff @@ -50,6 +50,14 @@ index 30f244b64523..e0eeffd340e8 100644 ifdef CONFIG_HYPERV kvm-amd-y += svm/svm_onhyperv.o +diff --git a/arch/x86/kvm/cachepc b/arch/x86/kvm/cachepc +new file mode 120000 +index 000000000000..9119e44af1f0 +--- /dev/null ++++ b/arch/x86/kvm/cachepc +@@ -0,0 +1 @@ ++/home/louis/kvm-prime-count/cachepc +\ No newline at end of file diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index d871b8dee7b3..3b7720aebbc6 100644 --- a/arch/x86/kvm/mmu/mmu.c @@ -181,7 +189,7 @@ index 2e09d1b6249f..9b40e71564bf 100644 EXPORT_SYMBOL_GPL(kvm_slot_page_track_add_page); diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c -index cf0bf456d520..6687fad99e97 100644 +index cf0bf456d520..d6a4002fa550 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -2,6 +2,8 @@ @@ -193,7 +201,7 @@ index cf0bf456d520..6687fad99e97 100644 #include "irq.h" #include "mmu.h" #include "kvm_cache_regs.h" -@@ -3788,14 +3790,33 @@ static noinstr void svm_vcpu_enter_exit(struct kvm_vcpu *vcpu) +@@ -3788,14 +3790,37 @@ static noinstr void svm_vcpu_enter_exit(struct kvm_vcpu *vcpu) { struct vcpu_svm *svm = to_svm(vcpu); unsigned long vmcb_pa = svm->current_vmcb->pa; @@ -203,7 +211,8 @@ index cf0bf456d520..6687fad99e97 100644 if (sev_es_guest(vcpu->kvm)) { + memset(cachepc_msrmts, 0, -+ cachepc_msrmts_count * sizeof(uint16_t)); ++ cachepc_msrmts_count * sizeof(cpc_msrmt_t)); ++ cachepc_reset_pmc(CPC_L1MISS_PMC); + + cpu = get_cpu(); + local_irq_disable(); @@ -212,13 +221,16 @@ index cf0bf456d520..6687fad99e97 100644 __svm_sev_es_vcpu_run(vmcb_pa); + + cachepc_save_msrmts(cachepc_ds); ++ if (cachepc_baseline_measure) ++ cachepc_update_baseline(); + local_irq_enable(); + put_cpu(); } else { struct svm_cpu_data *sd = per_cpu(svm_data, vcpu->cpu); + memset(cachepc_msrmts, 0, -+ cachepc_msrmts_count * sizeof(uint16_t)); ++ cachepc_msrmts_count * sizeof(cpc_msrmt_t)); ++ cachepc_reset_pmc(CPC_L1MISS_PMC); + + cpu = get_cpu(); + local_irq_disable(); @@ -227,12 +239,14 @@ index cf0bf456d520..6687fad99e97 100644 /* * Use a single vmcb (vmcb01 because it's always valid) for * context switching guest state via VMLOAD/VMSAVE, that way -@@ -3807,6 +3828,10 @@ static noinstr void svm_vcpu_enter_exit(struct kvm_vcpu *vcpu) +@@ -3807,6 +3832,12 @@ static noinstr void svm_vcpu_enter_exit(struct kvm_vcpu *vcpu) vmsave(svm->vmcb01.pa); vmload(__sme_page_pa(sd->save_area)); + + cachepc_save_msrmts(cachepc_ds); ++ if (cachepc_baseline_measure) ++ cachepc_update_baseline(); + local_irq_enable(); + put_cpu(); } -- cgit v1.2.3-71-gd317