1 /* Run this as: for i in $(seq 0 5); do prem-test $i & done */
3 #define _GNU_SOURCE /* See feature_test_macros(7) */
12 #ifndef SYS_prem_memguard_check
13 #define SYS_prem_memguard_check 793
16 #define RANDOM_ARRAY_SIZE 16777216 // 16M * 8 = 128 MB array
18 uint64_t random_values[RANDOM_ARRAY_SIZE];
19 volatile uint64_t sum;
27 void compute_kernel(int time_ms){
29 uint64_t current_us, end_us;
30 clock_gettime(CLOCK_MONOTONIC, &ts);
31 end_us = ts.tv_sec * 1000000 + ts.tv_nsec / 1000 + time_ms * 1000;
33 clock_gettime(CLOCK_MONOTONIC, &ts);
34 current_us = ts.tv_sec * 1000000 + ts.tv_nsec / 1000;
35 } while (current_us < end_us);
38 long memory_kernel(long lines){
39 for(int i = 0; i < lines; i++){
40 sum += random_values[(i*8) % RANDOM_ARRAY_SIZE];
45 void random_memory_kernel(long lines) {
48 for(long i=0; i<lines; i++) {
49 index = (uint32_t)rand();
50 index = index % RANDOM_ARRAY_SIZE;
51 sum += random_values[index];
56 #define MGF_PERIODIC (1 << 0) /* Chooses between periodic or one-shot budget replenishment */
57 #define MGF_RET_STATS (1 << 1) /* Return statistics since the last call (cache misses, time, ...?) */
58 #define MGF_MASK_INT (1 << 2) /* Mask (disable) low priority interrupts until next memguard call */
60 long prem_memguard_check(unsigned long timeout,
61 unsigned long memory_budget,
64 return syscall(SYS_prem_memguard_check, timeout, memory_budget, flags);
67 int main(int argc, char *argv[])
75 /* Ensure that memory phase starts and ends on the same CPU */
78 if (sched_setaffinity(getpid(), sizeof(set), &set) < 0)
79 err(1, "sched_setaffinity");
80 printf("Pinned to CPU %d\n", cpu);
84 //prem_memguard_check(950000, 1933440000, 1);
85 prem_memguard_check(100000, 1000, MGF_PERIODIC);
87 //prem_memguard_check(0, 0, 1);
91 //prem_memguard_check(1050000, 2136960000, 1);
92 prem_memguard_check(1050000, 2136960000, 0);
94 //prem_memguard_check(0, 0, 1);
98 //prem_memguard_check(1000000, 500, 1);
99 prem_memguard_check(100000, 500, MGF_PERIODIC);
100 memory_kernel(100000000);
101 //prem_memguard_check(0, 0, 1);
105 //prem_memguard_check(1000000, 1500, 1);
106 prem_memguard_check(1000000, 15000000, 0);
107 memory_kernel(100000000);
108 //prem_memguard_check(0, 0, 1);
112 //prem_memguard_check(1000000, 10000, 1);
113 prem_memguard_check(1000000, 100000, 0);
114 random_memory_kernel(100000000);
115 //prem_memguard_check(0, 0, 1);
119 //prem_memguard_check(1000000, 10000000, 1);
120 prem_memguard_check(1000000, 100000000, 0);
121 random_memory_kernel(100000000);
123 prem_memguard_check(0, 0, 0);