hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/tools/testing/selftests/vm/map_hugetlb.c
....@@ -23,6 +23,14 @@
2323 #define MAP_HUGETLB 0x40000 /* arch specific */
2424 #endif
2525
26
+#ifndef MAP_HUGE_SHIFT
27
+#define MAP_HUGE_SHIFT 26
28
+#endif
29
+
30
+#ifndef MAP_HUGE_MASK
31
+#define MAP_HUGE_MASK 0x3f
32
+#endif
33
+
2634 /* Only ia64 requires this */
2735 #ifdef __ia64__
2836 #define ADDR (void *)(0x8000000000000000UL)
....@@ -37,20 +45,20 @@
3745 printf("First hex is %x\n", *((unsigned int *)addr));
3846 }
3947
40
-static void write_bytes(char *addr)
48
+static void write_bytes(char *addr, size_t length)
4149 {
4250 unsigned long i;
4351
44
- for (i = 0; i < LENGTH; i++)
52
+ for (i = 0; i < length; i++)
4553 *(addr + i) = (char)i;
4654 }
4755
48
-static int read_bytes(char *addr)
56
+static int read_bytes(char *addr, size_t length)
4957 {
5058 unsigned long i;
5159
5260 check_bytes(addr);
53
- for (i = 0; i < LENGTH; i++)
61
+ for (i = 0; i < length; i++)
5462 if (*(addr + i) != (char)i) {
5563 printf("Mismatch at %lu\n", i);
5664 return 1;
....@@ -58,12 +66,29 @@
5866 return 0;
5967 }
6068
61
-int main(void)
69
+int main(int argc, char **argv)
6270 {
6371 void *addr;
6472 int ret;
73
+ size_t length = LENGTH;
74
+ int flags = FLAGS;
75
+ int shift = 0;
6576
66
- addr = mmap(ADDR, LENGTH, PROTECTION, FLAGS, -1, 0);
77
+ if (argc > 1)
78
+ length = atol(argv[1]) << 20;
79
+ if (argc > 2) {
80
+ shift = atoi(argv[2]);
81
+ if (shift)
82
+ flags |= (shift & MAP_HUGE_MASK) << MAP_HUGE_SHIFT;
83
+ }
84
+
85
+ if (shift)
86
+ printf("%u kB hugepages\n", 1 << (shift - 10));
87
+ else
88
+ printf("Default size hugepages\n");
89
+ printf("Mapping %lu Mbytes\n", (unsigned long)length >> 20);
90
+
91
+ addr = mmap(ADDR, length, PROTECTION, flags, -1, 0);
6792 if (addr == MAP_FAILED) {
6893 perror("mmap");
6994 exit(1);
....@@ -71,11 +96,11 @@
7196
7297 printf("Returned address is %p\n", addr);
7398 check_bytes(addr);
74
- write_bytes(addr);
75
- ret = read_bytes(addr);
99
+ write_bytes(addr, length);
100
+ ret = read_bytes(addr, length);
76101
77102 /* munmap() length of MAP_HUGETLB memory must be hugepage aligned */
78
- if (munmap(addr, LENGTH)) {
103
+ if (munmap(addr, length)) {
79104 perror("munmap");
80105 exit(1);
81106 }