summaryrefslogtreecommitdiff
path: root/testcase/hptest.c
diff options
context:
space:
mode:
Diffstat (limited to 'testcase/hptest.c')
-rw-r--r--testcase/hptest.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/testcase/hptest.c b/testcase/hptest.c
new file mode 100644
index 0000000..ab2f0a8
--- /dev/null
+++ b/testcase/hptest.c
@@ -0,0 +1,62 @@
+#include "../user/monitor_user.h"
+#include <fcntl.h>
+#include <stdio.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+#define HUGEPAGE_SIZE (1024 * 1024 * 1024) // Huge Page 大小为 1GB
+
+int main() {
+ int fd;
+ void *addr;
+ watch_arg w_arg = {0};
+
+ // 打开一个 hugetlbfs 文件
+ fd = open("/run/mrzcpd/huge_pages/hugepagefile", O_CREAT | O_RDWR, 0755);
+ if (fd < 0) {
+ perror("open");
+ return 1;
+ }
+
+ // 映射 Huge Page 内存
+ addr = mmap(0, HUGEPAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ if (addr == MAP_FAILED) {
+ perror("mmap");
+ close(fd);
+ return 1;
+ }
+
+ // 大页内存 int 类型变量, for ++
+ int *p = (int *)addr;
+ *p = 0;
+
+ w_arg = (watch_arg){
+ .task_id = getpid(),
+ .ptr = p,
+ .name = "hptest",
+ .length_byte = sizeof(int),
+ .threshold = 20,
+ .unsigned_flag = 0,
+ .greater_flag = 1,
+ .time_ns = 2000, // on hyper-v, 1us will block all system. 2us just fine, maybe 1us is too short for hyper-v
+ };
+ start_watch(w_arg);
+
+ for (int i = 0; i < 100; i++)
+ {
+ (*p)++;
+ printf("p = %d\n", *p);
+ sleep(1);
+ }
+
+ // 释放 Huge Page 内存
+ if (munmap(addr, HUGEPAGE_SIZE) == -1) {
+ perror("munmap");
+ close(fd);
+ return 1;
+ }
+
+ close(fd);
+
+ return 0;
+} \ No newline at end of file