#include <unistd.h>
#include <time.h>
#include <inttypes.h>
+#include <sys/mman.h>
#ifndef SYS_prem_memguard_check
#define SYS_prem_memguard_check 793
* 61 - Memory budget overrun
* 62 - Timeout
* 63 - Error */
-#define RET_TIM_POS 0
-#define RET_MEM_POS 32
-#define RET_OVER_MEM_POS 61
-#define RET_OVER_TIM_POS 62
+#define MGRET_TIM_POS 0
+#define MGRET_MEM_POS 32
+#define MGRET_OVER_MEM_POS 61
+#define MGRET_OVER_TIM_POS 62
-#define RET_TIM_MASK 0xFFFFFFFFlu
-#define RET_MEM_MASK 0xFFFFFFlu
-#define RET_OVER_MEM_MASK 0x1lu
-#define RET_OVER_TIM_MASK 0x1lu
+#define MGRET_TIM_MASK 0xFFFFFFFFlu
+#define MGRET_MEM_MASK 0xFFFFFFlu
+#define MGRET_OVER_MEM_MASK 0x1lu
+#define MGRET_OVER_TIM_MASK 0x1lu
#define RANDOM_ARRAY_SIZE 16777216 // 16M * 8 = 128 MB array
uint64_t random_values[RANDOM_ARRAY_SIZE];
-volatile uint64_t sum;
-
enum prem_phase {
static inline void decode_retval(uint64_t retval, uint64_t * timval, uint64_t * cntval){
- *timval = (retval >> RET_TIM_POS) & RET_TIM_MASK;
- *cntval = (retval >> RET_MEM_POS) & RET_MEM_MASK;
+ *timval = (retval >> MGRET_TIM_POS) & MGRET_TIM_MASK;
+ *cntval = (retval >> MGRET_MEM_POS) & MGRET_MEM_MASK;
}
void compute_kernel(int time_ms){
}
long memory_kernel(long lines){
+ uint64_t sum = 0;
+
for(int i = 0; i < lines; i++){
sum += random_values[(i*8) % RANDOM_ARRAY_SIZE];
}
void random_memory_kernel(long lines) {
uint32_t index;
+ uint64_t sum = 0;
for(long i=0; i<lines; i++) {
index = (uint32_t)rand();
/* Memguard flags */
#define MGF_PERIODIC (1 << 0) /* Chooses between periodic or one-shot budget replenishment */
-#define MGF_RET_STATS (1 << 1) /* Return statistics since the last call (cache misses, time, ...?) */
-#define MGF_MASK_INT (1 << 2) /* Mask (disable) low priority interrupts until next memguard call */
+#define MGF_MASK_INT (1 << 1) /* Mask (disable) low priority interrupts until next memguard call */
long prem_memguard_check(unsigned long timeout,
unsigned long memory_budget,
return syscall(SYS_prem_memguard_check, timeout, memory_budget, flags);
}
+#define MGTEST(timeout_us, mem_budget, flags, code) \
+ do { \
+ long retval = prem_memguard_check(timeout_us, mem_budget, flags); \
+ code; \
+ retval = prem_memguard_check(0, 0, 0); \
+ printf("%-31s flags:%d m_ovr:%ld t_ovr:%ld mem:%d->%ld time:%d->%ld\n", \
+ #code, flags, \
+ (retval >> MGRET_OVER_MEM_POS) & 1, \
+ (retval >> MGRET_OVER_TIM_POS) & 1, \
+ mem_budget, (retval >> MGRET_MEM_POS) & MGRET_MEM_MASK, \
+ timeout_us, (retval >> MGRET_TIM_POS) & MGRET_TIM_MASK); \
+ } while (0)
+
int main(int argc, char *argv[])
{
cpu_set_t set;
int cpu = 0;
- long retval;
- uint64_t timval, cntval;
+
+ char bla[1];
+
+ for (int i = 0; i < RANDOM_ARRAY_SIZE; i++)
+ random_values[i] = i;
if (argc > 1)
cpu = atoi(argv[1]);
err(1, "sched_setaffinity");
printf("Pinned to CPU %d\n", cpu);
- printf("X1\n");
- fflush(stdout);
- //prem_memguard_check(950000, 1933440000, 1);
- retval = prem_memguard_check(100000, 1000, MGF_PERIODIC | MGF_MASK_INT);
- compute_kernel(1000);
- //prem_memguard_check(0, 0, 1);
-
- /* First result does not make sense */
- decode_retval(retval, &timval, &cntval);
- printf("tim: %lu cnt: %lu\n", timval, cntval);
-
- printf("X2\n");
- fflush(stdout);
- //prem_memguard_check(1050000, 2136960000, 1);
- retval = prem_memguard_check(1050000, 2136960000, 0);
- compute_kernel(1000);
- //prem_memguard_check(0, 0, 1);
-
- decode_retval(retval, &timval, &cntval);
- printf("tim: %lu cnt: %lu\n", timval, cntval);
-
- printf("X3\n");
- fflush(stdout);
- //prem_memguard_check(1000000, 500, 1);
- retval = prem_memguard_check(100000, 500, MGF_PERIODIC);
- memory_kernel(100000000);
- //prem_memguard_check(0, 0, 1);
-
- decode_retval(retval, &timval, &cntval);
- printf("tim: %lu cnt: %lu\n", timval, cntval);
-
- printf("X4\n");
- fflush(stdout);
- //prem_memguard_check(1000000, 1500, 1);
- retval = prem_memguard_check(1000000, 15000000, 0);
- memory_kernel(100000000);
- //prem_memguard_check(0, 0, 1);
-
- decode_retval(retval, &timval, &cntval);
- printf("tim: %lu cnt: %lu\n", timval, cntval);
-
- printf("X5\n");
- fflush(stdout);
- //prem_memguard_check(1000000, 10000, 1);
- retval = prem_memguard_check(1000000, 100000, 0);
- random_memory_kernel(100000000);
- //prem_memguard_check(0, 0, 1);
-
- decode_retval(retval, &timval, &cntval);
- printf("tim: %lu cnt: %lu\n", timval, cntval);
-
- printf("X6\n");
- fflush(stdout);
- //prem_memguard_check(1000000, 10000000, 1);
- retval = prem_memguard_check(1000000, 100000000, 0);
- random_memory_kernel(100000000);
-
- prem_memguard_check(0, 0, 0);
+ volatile long x;
+ MGTEST(100000, 1000, MGF_PERIODIC | MGF_MASK_INT, compute_kernel(1000));
+ MGTEST(1050000, 2136960000, 0, compute_kernel(1000));
+ MGTEST(100000, 500, MGF_PERIODIC, memory_kernel(100000000));
+
+ for (int i = 1; i <= 10; i++)
+ MGTEST(1000000, 500, 0, x=memory_kernel(1000000));
+
+ MGTEST(1000000, 500, 0, x=memory_kernel(100000000));
+ MGTEST(1000000, 100000, 0, random_memory_kernel(100000000));
+ MGTEST(1000000, 100000000, 0, random_memory_kernel(100000000));
return 0;
}