]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blob - tools/testing/selftests/powerpc/mm/hugetlb_vs_thp_test.c
Merge tag 'vmwgfx-next-2014-07-04' of git://people.freedesktop.org/~thomash/linux...
[mirror_ubuntu-jammy-kernel.git] / tools / testing / selftests / powerpc / mm / hugetlb_vs_thp_test.c
1 #include <stdio.h>
2 #include <sys/mman.h>
3 #include <unistd.h>
4
5 #include "utils.h"
6
7 /* This must match the huge page & THP size */
8 #define SIZE (16 * 1024 * 1024)
9
10 static int test_body(void)
11 {
12 void *addr;
13 char *p;
14
15 addr = (void *)0xa0000000;
16
17 p = mmap(addr, SIZE, PROT_READ | PROT_WRITE,
18 MAP_HUGETLB | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
19 if (p != MAP_FAILED) {
20 /*
21 * Typically the mmap will fail because no huge pages are
22 * allocated on the system. But if there are huge pages
23 * allocated the mmap will succeed. That's fine too, we just
24 * munmap here before continuing.
25 */
26 munmap(addr, SIZE);
27 }
28
29 p = mmap(addr, SIZE, PROT_READ | PROT_WRITE,
30 MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
31 if (p == MAP_FAILED) {
32 printf("Mapping failed @ %p\n", addr);
33 perror("mmap");
34 return 1;
35 }
36
37 /*
38 * Either a user or kernel access is sufficient to trigger the bug.
39 * A kernel access is easier to spot & debug, as it will trigger the
40 * softlockup or RCU stall detectors, and when the system is kicked
41 * into xmon we get a backtrace in the kernel.
42 *
43 * A good option is:
44 * getcwd(p, SIZE);
45 *
46 * For the purposes of this testcase it's preferable to spin in
47 * userspace, so the harness can kill us if we get stuck. That way we
48 * see a test failure rather than a dead system.
49 */
50 *p = 0xf;
51
52 munmap(addr, SIZE);
53
54 return 0;
55 }
56
57 static int test_main(void)
58 {
59 int i;
60
61 /* 10,000 because it's a "bunch", and completes reasonably quickly */
62 for (i = 0; i < 10000; i++)
63 if (test_body())
64 return 1;
65
66 return 0;
67 }
68
69 int main(void)
70 {
71 return test_harness(test_main, "hugetlb_vs_thp");
72 }