mm: move hugepage test examples to tools/testing/selftests/vm
Dave Young [Wed, 28 Mar 2012 21:42:56 +0000 (14:42 -0700)]
hugepage-mmap.c, hugepage-shm.c and map_hugetlb.c in Documentation/vm are
simple pass/fail tests, It's better to promote them to
tools/testing/selftests.

Thanks suggestion of Andrew Morton about this.  They all need firstly
setting up proper nr_hugepages and hugepage-mmap need to mount hugetlbfs.
So I add a shell script run_vmtests to do such work which will call the
three test programs and check the return value of them.

Changes to original code including below:
a. add run_vmtests script
b. return error when read_bytes mismatch with writed bytes.
c. coding style fixes: do not use assignment in if condition

[akpm@linux-foundation.org: build the targets before trying to execute them]
[akpm@linux-foundation.org: Documentation/vm/ no longer has a Makefile. Fixes "make clean"]
Signed-off-by: Dave Young <dyoung@redhat.com>
Cc: Wu Fengguang <fengguang.wu@intel.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: Pekka Enberg <penberg@cs.helsinki.fi>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Documentation/Makefile
Documentation/vm/Makefile [deleted file]
tools/testing/selftests/Makefile
tools/testing/selftests/vm/Makefile [new file with mode: 0644]
tools/testing/selftests/vm/hugepage-mmap.c [moved from Documentation/vm/hugepage-mmap.c with 93% similarity]
tools/testing/selftests/vm/hugepage-shm.c [moved from Documentation/vm/hugepage-shm.c with 94% similarity]
tools/testing/selftests/vm/map_hugetlb.c [moved from Documentation/vm/map_hugetlb.c with 94% similarity]
tools/testing/selftests/vm/run_vmtests [new file with mode: 0644]

index 9b4bc5c..30b656e 100644 (file)
@@ -1,3 +1,3 @@
 obj-m := DocBook/ accounting/ auxdisplay/ connector/ \
        filesystems/ filesystems/configfs/ ia64/ laptops/ networking/ \
-       pcmcia/ spi/ timers/ vm/ watchdog/src/
+       pcmcia/ spi/ timers/ watchdog/src/
diff --git a/Documentation/vm/Makefile b/Documentation/vm/Makefile
deleted file mode 100644 (file)
index e538864..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-# kbuild trick to avoid linker error. Can be omitted if a module is built.
-obj- := dummy.o
-
-# List of programs to build
-hostprogs-y := hugepage-mmap hugepage-shm map_hugetlb
-
-# Tell kbuild to always build the programs
-always := $(hostprogs-y)
index 9203cd7..28bc57e 100644 (file)
@@ -1,4 +1,4 @@
-TARGETS = breakpoints
+TARGETS = breakpoints vm
 
 all:
        for TARGET in $(TARGETS); do \
diff --git a/tools/testing/selftests/vm/Makefile b/tools/testing/selftests/vm/Makefile
new file mode 100644 (file)
index 0000000..b336b24
--- /dev/null
@@ -0,0 +1,14 @@
+# Makefile for vm selftests
+
+CC = $(CROSS_COMPILE)gcc
+CFLAGS = -Wall -Wextra
+
+all: hugepage-mmap hugepage-shm  map_hugetlb
+%: %.c
+       $(CC) $(CFLAGS) -o $@ $^
+
+run_tests: all
+       /bin/sh ./run_vmtests
+
+clean:
+       $(RM) hugepage-mmap hugepage-shm  map_hugetlb
similarity index 93%
rename from Documentation/vm/hugepage-mmap.c
rename to tools/testing/selftests/vm/hugepage-mmap.c
index db0dd9a..a10f310 100644 (file)
@@ -22,7 +22,7 @@
 #include <sys/mman.h>
 #include <fcntl.h>
 
-#define FILE_NAME "/mnt/hugepagefile"
+#define FILE_NAME "huge/hugepagefile"
 #define LENGTH (256UL*1024*1024)
 #define PROTECTION (PROT_READ | PROT_WRITE)
 
@@ -48,7 +48,7 @@ static void write_bytes(char *addr)
                *(addr + i) = (char)i;
 }
 
-static void read_bytes(char *addr)
+static int read_bytes(char *addr)
 {
        unsigned long i;
 
@@ -56,14 +56,15 @@ static void read_bytes(char *addr)
        for (i = 0; i < LENGTH; i++)
                if (*(addr + i) != (char)i) {
                        printf("Mismatch at %lu\n", i);
-                       break;
+                       return 1;
                }
+       return 0;
 }
 
 int main(void)
 {
        void *addr;
-       int fd;
+       int fd, ret;
 
        fd = open(FILE_NAME, O_CREAT | O_RDWR, 0755);
        if (fd < 0) {
@@ -81,11 +82,11 @@ int main(void)
        printf("Returned address is %p\n", addr);
        check_bytes(addr);
        write_bytes(addr);
-       read_bytes(addr);
+       ret = read_bytes(addr);
 
        munmap(addr, LENGTH);
        close(fd);
        unlink(FILE_NAME);
 
-       return 0;
+       return ret;
 }
similarity index 94%
rename from Documentation/vm/hugepage-shm.c
rename to tools/testing/selftests/vm/hugepage-shm.c
index 07956d8..0d0ef4f 100644 (file)
@@ -57,8 +57,8 @@ int main(void)
        unsigned long i;
        char *shmaddr;
 
-       if ((shmid = shmget(2, LENGTH,
-                           SHM_HUGETLB | IPC_CREAT | SHM_R | SHM_W)) < 0) {
+       shmid = shmget(2, LENGTH, SHM_HUGETLB | IPC_CREAT | SHM_R | SHM_W);
+       if (shmid < 0) {
                perror("shmget");
                exit(1);
        }
@@ -82,14 +82,16 @@ int main(void)
 
        dprintf("Starting the Check...");
        for (i = 0; i < LENGTH; i++)
-               if (shmaddr[i] != (char)i)
+               if (shmaddr[i] != (char)i) {
                        printf("\nIndex %lu mismatched\n", i);
+                       exit(3);
+               }
        dprintf("Done.\n");
 
        if (shmdt((const void *)shmaddr) != 0) {
                perror("Detach failure");
                shmctl(shmid, IPC_RMID, NULL);
-               exit(3);
+               exit(4);
        }
 
        shmctl(shmid, IPC_RMID, NULL);
similarity index 94%
rename from Documentation/vm/map_hugetlb.c
rename to tools/testing/selftests/vm/map_hugetlb.c
index eda1a6d..ac56639 100644 (file)
@@ -44,7 +44,7 @@ static void write_bytes(char *addr)
                *(addr + i) = (char)i;
 }
 
-static void read_bytes(char *addr)
+static int read_bytes(char *addr)
 {
        unsigned long i;
 
@@ -52,13 +52,15 @@ static void read_bytes(char *addr)
        for (i = 0; i < LENGTH; i++)
                if (*(addr + i) != (char)i) {
                        printf("Mismatch at %lu\n", i);
-                       break;
+                       return 1;
                }
+       return 0;
 }
 
 int main(void)
 {
        void *addr;
+       int ret;
 
        addr = mmap(ADDR, LENGTH, PROTECTION, FLAGS, 0, 0);
        if (addr == MAP_FAILED) {
@@ -69,9 +71,9 @@ int main(void)
        printf("Returned address is %p\n", addr);
        check_bytes(addr);
        write_bytes(addr);
-       read_bytes(addr);
+       ret = read_bytes(addr);
 
        munmap(addr, LENGTH);
 
-       return 0;
+       return ret;
 }
diff --git a/tools/testing/selftests/vm/run_vmtests b/tools/testing/selftests/vm/run_vmtests
new file mode 100644 (file)
index 0000000..8b40bd5
--- /dev/null
@@ -0,0 +1,77 @@
+#!/bin/bash
+#please run as root
+
+#we need 256M, below is the size in kB
+needmem=262144
+mnt=./huge
+
+#get pagesize and freepages from /proc/meminfo
+while read name size unit; do
+       if [ "$name" = "HugePages_Free:" ]; then
+               freepgs=$size
+       fi
+       if [ "$name" = "Hugepagesize:" ]; then
+               pgsize=$size
+       fi
+done < /proc/meminfo
+
+#set proper nr_hugepages
+if [ -n "$freepgs" ] && [ -n "$pgsize" ]; then
+       nr_hugepgs=`cat /proc/sys/vm/nr_hugepages`
+       needpgs=`expr $needmem / $pgsize`
+       if [ $freepgs -lt $needpgs ]; then
+               lackpgs=$(( $needpgs - $freepgs ))
+               echo $(( $lackpgs + $nr_hugepgs )) > /proc/sys/vm/nr_hugepages
+               if [ $? -ne 0 ]; then
+                       echo "Please run this test as root"
+                       exit 1
+               fi
+       fi
+else
+       echo "no hugetlbfs support in kernel?"
+       exit 1
+fi
+
+mkdir $mnt
+mount -t hugetlbfs none $mnt
+
+echo "--------------------"
+echo "runing hugepage-mmap"
+echo "--------------------"
+./hugepage-mmap
+if [ $? -ne 0 ]; then
+       echo "[FAIL]"
+else
+       echo "[PASS]"
+fi
+
+shmmax=`cat /proc/sys/kernel/shmmax`
+shmall=`cat /proc/sys/kernel/shmall`
+echo 268435456 > /proc/sys/kernel/shmmax
+echo 4194304 > /proc/sys/kernel/shmall
+echo "--------------------"
+echo "runing hugepage-shm"
+echo "--------------------"
+./hugepage-shm
+if [ $? -ne 0 ]; then
+       echo "[FAIL]"
+else
+       echo "[PASS]"
+fi
+echo $shmmax > /proc/sys/kernel/shmmax
+echo $shmall > /proc/sys/kernel/shmall
+
+echo "--------------------"
+echo "runing map_hugetlb"
+echo "--------------------"
+./map_hugetlb
+if [ $? -ne 0 ]; then
+       echo "[FAIL]"
+else
+       echo "[PASS]"
+fi
+
+#cleanup
+umount $mnt
+rm -rf $mnt
+echo $nr_hugepgs > /proc/sys/vm/nr_hugepages