Skip to content

Commit

Permalink
selftests/powerpc: Test the THP bug we fixed in the previous commit
Browse files Browse the repository at this point in the history
Signed-off-by: Michael Ellerman <[email protected]>
Reviewed-by: Aneesh Kumar K.V <[email protected]>
Signed-off-by: Benjamin Herrenschmidt <[email protected]>
  • Loading branch information
mpe authored and ozbenh committed Jun 6, 2014
1 parent 09567e7 commit d34b661
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 1 deletion.
2 changes: 1 addition & 1 deletion tools/testing/selftests/powerpc/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ CFLAGS := -Wall -O2 -flto -Wall -Werror -DGIT_VERSION='"$(GIT_VERSION)"' -I$(CUR

export CC CFLAGS

TARGETS = pmu copyloops
TARGETS = pmu copyloops mm

endif

Expand Down
18 changes: 18 additions & 0 deletions tools/testing/selftests/powerpc/mm/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
noarg:
$(MAKE) -C ../

PROGS := hugetlb_vs_thp_test

all: $(PROGS)

$(PROGS): ../harness.c

run_tests: all
@-for PROG in $(PROGS); do \
./$$PROG; \
done;

clean:
rm -f $(PROGS)

.PHONY: all run_tests clean
72 changes: 72 additions & 0 deletions tools/testing/selftests/powerpc/mm/hugetlb_vs_thp_test.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>

#include "utils.h"

/* This must match the huge page & THP size */
#define SIZE (16 * 1024 * 1024)

static int test_body(void)
{
void *addr;
char *p;

addr = (void *)0xa0000000;

p = mmap(addr, SIZE, PROT_READ | PROT_WRITE,
MAP_HUGETLB | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (p != MAP_FAILED) {
/*
* Typically the mmap will fail because no huge pages are
* allocated on the system. But if there are huge pages
* allocated the mmap will succeed. That's fine too, we just
* munmap here before continuing.
*/
munmap(addr, SIZE);
}

p = mmap(addr, SIZE, PROT_READ | PROT_WRITE,
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (p == MAP_FAILED) {
printf("Mapping failed @ %p\n", addr);
perror("mmap");
return 1;
}

/*
* Either a user or kernel access is sufficient to trigger the bug.
* A kernel access is easier to spot & debug, as it will trigger the
* softlockup or RCU stall detectors, and when the system is kicked
* into xmon we get a backtrace in the kernel.
*
* A good option is:
* getcwd(p, SIZE);
*
* For the purposes of this testcase it's preferable to spin in
* userspace, so the harness can kill us if we get stuck. That way we
* see a test failure rather than a dead system.
*/
*p = 0xf;

munmap(addr, SIZE);

return 0;
}

static int test_main(void)
{
int i;

/* 10,000 because it's a "bunch", and completes reasonably quickly */
for (i = 0; i < 10000; i++)
if (test_body())
return 1;

return 0;
}

int main(void)
{
return test_harness(test_main, "hugetlb_vs_thp");
}

0 comments on commit d34b661

Please sign in to comment.