summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2023-02-07 07:38:12 -0600
committerLouis Burda <quent.burda@gmail.com>2023-02-07 07:39:04 -0600
commita2cdd64c6f915d969dfa21e23049ff4b3836b13d (patch)
treecfb335e21f99cd584d4821991d526d56cc431d00
parent546a50cb8bb80775c71e7469f2a2891ac1fa1b24 (diff)
downloadcachepc-a2cdd64c6f915d969dfa21e23049ff4b3836b13d.tar.gz
cachepc-a2cdd64c6f915d969dfa21e23049ff4b3836b13d.zip
Add combined testcase based on exit codes
-rwxr-xr-x.gitignore1
-rw-r--r--cachepc/cachepc.c1
-rw-r--r--cachepc/kvm.c76
m---------linux0
-rwxr-xr-xtest/all11
-rw-r--r--test/eviction.c17
-rw-r--r--test/kvm-eviction.c17
7 files changed, 39 insertions, 84 deletions
diff --git a/.gitignore b/.gitignore
index 1ace534..e33dfce 100755
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@ push.sh
.cache
linux-*
compile_commands.json
+logs
diff --git a/cachepc/cachepc.c b/cachepc/cachepc.c
index 232e17a..04b3645 100644
--- a/cachepc/cachepc.c
+++ b/cachepc/cachepc.c
@@ -162,6 +162,7 @@ cpc_save_msrmts(struct cpc_cl *head)
do {
if (cl->first) {
BUG_ON(cl->set >= L1_SETS);
+ BUG_ON(cl->line != 0);
if (cl->count > L1_ASSOC) {
CPC_ERR("OOB count %llu for set %u\n",
cl->count, cl->set);
diff --git a/cachepc/kvm.c b/cachepc/kvm.c
index 775e4cc..4fee476 100644
--- a/cachepc/kvm.c
+++ b/cachepc/kvm.c
@@ -124,10 +124,6 @@ static int cpc_apply_baseline_ioctl(void __user *arg_user);
static int cpc_reset_tracking_ioctl(void __user *arg_user);
static int cpc_track_mode_ioctl(void __user *arg_user);
-// static int cpc_track_page_ioctl(void __user *arg_user);
-// static int cpc_track_range_start_ioctl(void __user *arg_user);
-// static int cpc_track_range_end_ioctl(void __user *arg_user);
-// static int cpc_track_exec_cur_ioctl(void __user *arg_user);
static int cpc_req_pause_ioctl(void __user *arg_user);
@@ -220,14 +216,14 @@ cpc_single_eviction_test(void *p)
if (count != 1 || cpc_msrmts[target] != 1) {
CPC_ERR("Single eviction %i. test failed (%u vs %u)\n",
n, count, 1);
- if (arg) *arg = count;
+ if (arg) *arg = 1;
break;
}
}
if (n == TEST_REPEAT_MAX) {
CPC_INFO("Single eviction test ok (%u vs %u)\n", count, 1);
- if (arg) *arg = count;
+ if (arg) *arg = 0;
}
kfree(victim_ul);
@@ -546,66 +542,6 @@ cpc_track_mode_ioctl(void __user *arg_user)
return 0;
}
-// int
-// cpc_track_page_ioctl(void __user *arg_user)
-// {
-// struct cpc_track_config cfg;
-// struct kvm_vcpu *vcpu;
-//
-// if (!main_vm || !arg_user) return -EINVAL;
-//
-// if (copy_from_user(&cfg, arg_user, sizeof(cfg)))
-// return -EFAULT;
-//
-// if (cfg.mode < 0 || cfg.mode >= KVM_PAGE_TRACK_MAX)
-// return -EINVAL;
-//
-// BUG_ON(xa_empty(&main_vm->vcpu_array));
-// vcpu = xa_load(&main_vm->vcpu_array, 0);
-// if (!cpc_track_single(vcpu, cfg.gfn, cfg.mode))
-// return -EFAULT;
-//
-// return 0;
-// }
-//
-// int
-// cpc_track_range_start_ioctl(void __user *arg_user)
-// {
-// if (!arg_user) return -EINVAL;
-//
-// if (copy_from_user(&cpc_track_start_gfn, arg_user, sizeof(uint64_t)))
-// return -EFAULT;
-//
-// return 0;
-// }
-//
-// int
-// cpc_track_range_end_ioctl(void __user *arg_user)
-// {
-// if (!arg_user) return -EINVAL;
-//
-// if (copy_from_user(&cpc_track_end_gfn, arg_user, sizeof(uint64_t)))
-// return -EFAULT;
-//
-// return 0;
-// }
-//
-// int
-// cpc_track_exec_cur_ioctl(void __user *arg_user)
-// {
-// struct cpc_fault *fault;
-//
-// if (!arg_user) return -EINVAL;
-//
-// fault = list_first_entry(&cpc_faults, struct cpc_fault, list);
-// if (!fault) return -EFAULT;
-//
-// if (copy_to_user(arg_user, &fault->gfn, sizeof(uint64_t)))
-// return -EFAULT;
-//
-// return 0;
-// }
-
int
cpc_req_pause_ioctl(void __user *arg_user)
{
@@ -655,14 +591,6 @@ cpc_kvm_ioctl(struct file *file, unsigned int ioctl, unsigned long arg)
return cpc_batch_events_ioctl(arg_user);
case KVM_CPC_READ_BATCH:
return cpc_read_batch_ioctl(arg_user);
- // case KVM_CPC_TRACK_PAGE:
- // return cpc_track_page_ioctl(arg_user);
- // case KVM_CPC_TRACK_RANGE_START:
- // return cpc_track_range_start_ioctl(arg_user);
- // case KVM_CPC_TRACK_RANGE_END:
- // return cpc_track_range_end_ioctl(arg_user);
- // case KVM_CPC_TRACK_EXEC_CUR:
- // return cpc_track_exec_cur_ioctl(arg_user);
case KVM_CPC_VM_REQ_PAUSE:
return cpc_req_pause_ioctl(arg_user);
default:
diff --git a/linux b/linux
-Subproject 15554c668705bcbaa9da3fbf2a1efe45bb42adc
+Subproject aa27d3b55fb46c7eb44e8a61aaaaae2aa6eed63
diff --git a/test/all b/test/all
new file mode 100755
index 0000000..1c3abf2
--- /dev/null
+++ b/test/all
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+mkdir -p logs
+
+set -ex
+
+./test/eviction &> logs/eviction
+./test/kvm-eviction &> logs/kvm-eviction
+./test/kvm-pagestep &> logs/kvm-pagestep
+./test/kvm-step &> logs/kvm-step
+./test/kvm-targetstep &> logs/kvm-targetstep
diff --git a/test/eviction.c b/test/eviction.c
index fc11630..ca404b9 100644
--- a/test/eviction.c
+++ b/test/eviction.c
@@ -14,7 +14,7 @@ int
main(int argc, const char **argv)
{
uint8_t counts[L1_SETS];
- uint32_t set;
+ uint32_t arg, set;
int fd, ret;
fd = open("/dev/kvm", O_RDONLY);
@@ -22,18 +22,23 @@ main(int argc, const char **argv)
set = 48;
if (argc > 1) set = atoi(argv[1]);
- if (set >= L1_SETS)
- errx(1, "set out-of-bounds");
+ if (set >= L1_SETS) errx(1, "set out-of-bounds");
- ret = ioctl(fd, KVM_CPC_TEST_EVICTION, &set);
- if (ret == -1) err(1, "ioctl KVM_CPC_TEST_EVICTION");
+ ret = ioctl(fd, KVM_CPC_RESET, &arg);
+ if (ret == -1) err(1, "KVM_CPC_RESET");
+
+ arg = set;
+ ret = ioctl(fd, KVM_CPC_TEST_EVICTION, &arg);
+ if (ret == -1) err(1, "KVM_CPC_TEST_EVICTION");
ret = ioctl(fd, KVM_CPC_READ_COUNTS, counts);
- if (ret == -1) err(1, "ioctl KVM_CPC_READ_COUNTS");
+ if (ret == -1) err(1, "KVM_CPC_READ_COUNTS");
print_counts(counts);
printf("\n");
print_counts_raw(counts);
close(fd);
+
+ return arg;
}
diff --git a/test/kvm-eviction.c b/test/kvm-eviction.c
index 297c9da..ceb1abd 100644
--- a/test/kvm-eviction.c
+++ b/test/kvm-eviction.c
@@ -43,7 +43,7 @@ main(int argc, const char **argv)
uint8_t counts[2][SAMPLE_COUNT][L1_SETS];
uint8_t baseline[L1_SETS];
struct cpc_track_cfg cfg;
- int i, k, ret;
+ int i, k, ret, exitcode;
vmtype = "kvm";
if (argc > 1) vmtype = argv[1];
@@ -126,26 +126,35 @@ main(int argc, const char **argv)
}
/* check for measurment errors */
+ exitcode = 0;
for (i = 0; i < SAMPLE_COUNT; i++) {
for (k = 0; k < L1_SETS; k++) {
- if (counts[WITH][i][k] + baseline[k] > L1_ASSOC)
+ if (counts[WITH][i][k] + baseline[k] > L1_ASSOC) {
warnx("sample %i: With count OOB for set %i (=%i)",
i, k, counts[WITH][i][k] + baseline[k]);
+ exitcode = 1;
+ }
- if (counts[WITHOUT][i][k] + baseline[k] > L1_ASSOC)
+ if (counts[WITHOUT][i][k] + baseline[k] > L1_ASSOC) {
warnx("sample %i: Without count OOB for set %i (=%i)",
i, k, counts[WITHOUT][i][k] + baseline[k]);
+ exitcode = 1;
+ }
}
- if (!counts[WITH][i][TARGET_SET])
+ if (!counts[WITH][i][TARGET_SET]) {
warnx("sample %i: Missing eviction in target set %i (=%i,%i)",
i, TARGET_SET, counts[WITH][i][TARGET_SET],
counts[WITH][i][TARGET_SET] + baseline[TARGET_SET]);
+ exitcode = 1;
+ }
}
vm_deinit(&vms[WITH]);
vm_deinit(&vms[WITHOUT]);
kvm_setup_deinit();
+
+ return exitcode;
}