From 16469e2094edab39279b9f6aaa97c84722baa812 Mon Sep 17 00:00:00 2001 From: Louis Burda Date: Thu, 27 Oct 2022 21:34:43 +0200 Subject: Add baseline measurement mode --- cachepc/cachepc.c | 13 +++++++++++++ cachepc/cachepc.h | 4 ++++ cachepc/kvm.c | 31 +++++++++++++++++++++++++++++++ cachepc/uapi.h | 1 + 4 files changed, 49 insertions(+) diff --git a/cachepc/cachepc.c b/cachepc/cachepc.c index fc948bb..11ddf95 100644 --- a/cachepc/cachepc.c +++ b/cachepc/cachepc.c @@ -10,6 +10,8 @@ #define REMOVE_PAGE_OFFSET(ptr) ((void *) (((uintptr_t) ptr) & PAGE_MASK)) +#define MIN(a, b) ((a) < (b) ? (a) : (b)) + static void cl_insert(cacheline *last_cl, cacheline *new_cl); static void *remove_cache_set(cache_ctx *ctx, void *ptr); static void *remove_cache_group_set(void *ptr); @@ -270,6 +272,17 @@ cachepc_print_msrmts(cacheline *head) } while (curr_cl != head); } +void +cachepc_update_baseline(void) +{ + size_t i; + + for (i = 0; i < cachepc_msrmts_count; i++) { + cachepc_baseline[i] = MIN(cachepc_baseline[i], + cachepc_msrmts[i]); + } +} + void __attribute__((optimize(1))) // prevent instruction reordering cachepc_prime_vcall(uintptr_t ret, cacheline *cl) { diff --git a/cachepc/cachepc.h b/cachepc/cachepc.h index 629b9ca..af38db3 100644 --- a/cachepc/cachepc.h +++ b/cachepc/cachepc.h @@ -99,6 +99,7 @@ void *cachepc_aligned_alloc(size_t alignment, size_t size); void cachepc_save_msrmts(cacheline *head); void cachepc_print_msrmts(cacheline *head); +void cachepc_update_baseline(void); void cachepc_prime_vcall(uintptr_t ret, cacheline *cl); void cachepc_probe_vcall(uintptr_t ret, cacheline *cl); @@ -121,6 +122,9 @@ static inline uint64_t cachepc_read_pmc(uint64_t event); extern uint16_t *cachepc_msrmts; extern size_t cachepc_msrmts_count; +extern uint16_t *cachepc_baseline; +extern bool cachepc_baseline_measure; + extern cache_ctx *cachepc_ctx; extern cacheline *cachepc_ds; diff --git a/cachepc/kvm.c b/cachepc/kvm.c index 0cc41e0..a72f512 100644 --- a/cachepc/kvm.c +++ b/cachepc/kvm.c @@ -15,6 +15,11 @@ size_t cachepc_msrmts_count = 0; EXPORT_SYMBOL(cachepc_msrmts); EXPORT_SYMBOL(cachepc_msrmts_count); +uint16_t *cachepc_baseline = NULL; +bool cachepc_baseline_measure = false; +EXPORT_SYMBOL(cachepc_baseline); +EXPORT_SYMBOL(cachepc_baseline_measure); + cache_ctx *cachepc_ctx = NULL; cacheline *cachepc_ds = NULL; EXPORT_SYMBOL(cachepc_ctx); @@ -362,6 +367,26 @@ cachepc_kvm_setup_pmc_ioctl(void __user *arg_user) return 0; } +int +cachepc_kvm_measure_baseline_ioctl(void __user *arg_user) +{ + bool state; + + if (!arg_user) return -EINVAL; + + if (copy_from_user(&state, arg_user, sizeof(state))) + return -EFAULT; + + cachepc_baseline_measure = state; + + if (!state) { + memset(cachepc_baseline, 0, + sizeof(uint16_t) * cachepc_msrmts_count); + } + + return 0; +} + int cachepc_kvm_track_page_ioctl(void __user *arg_user) { @@ -495,6 +520,8 @@ cachepc_kvm_ioctl(struct file *file, unsigned int ioctl, unsigned long arg) return cachepc_kvm_read_counts_ioctl(arg_user); case KVM_CPC_SETUP_PMC: return cachepc_kvm_setup_pmc_ioctl(arg_user); + case KVM_CPC_MEASURE_BASELINE: + return cachepc_kvm_measure_baseline_ioctl(arg_user); case KVM_CPC_TRACK_PAGE: return cachepc_kvm_track_page_ioctl(arg_user); case KVM_CPC_TRACK_ALL: @@ -550,6 +577,10 @@ cachepc_kvm_init(void) cachepc_msrmts = kzalloc(cachepc_msrmts_count * sizeof(uint16_t), GFP_KERNEL); BUG_ON(cachepc_msrmts == NULL); + cachepc_baseline_measure = false; + cachepc_baseline = kzalloc(cachepc_msrmts_count * sizeof(uint16_t), GFP_KERNEL); + BUG_ON(cachepc_baseline == NULL); + ret = smp_call_function_single(2, cachepc_kvm_setup_test, NULL, true); WARN_ON(ret != 0); } diff --git a/cachepc/uapi.h b/cachepc/uapi.h index b5ed18b..2519975 100644 --- a/cachepc/uapi.h +++ b/cachepc/uapi.h @@ -15,6 +15,7 @@ #define KVM_CPC_READ_PMC _IOWR(KVMIO, 0x23, __u32) #define KVM_CPC_READ_COUNTS _IOR(KVMIO, 0x24, __u64) #define KVM_CPC_SETUP_PMC _IO(KVMIO, 0x25) +#define KVM_CPC_MEASURE_BASELINE _IO(KVMIO, 0x26) #define KVM_CPC_TRACK_PAGE _IOWR(KVMIO, 0x30, struct cpc_track_config) #define KVM_CPC_TRACK_ALL _IOWR(KVMIO, 0x31, __u64) -- cgit v1.2.3-71-gd317