mm: move hugepage test examples to tools/testing/selftests/vm

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>
This commit is contained in:
Dave Young 2012-03-28 14:42:56 -07:00 committed by Linus Torvalds
parent 63e315535a
commit f0f57b2b14
8 changed files with 112 additions and 24 deletions

View File

@ -1,3 +1,3 @@
obj-m := DocBook/ accounting/ auxdisplay/ connector/ \ obj-m := DocBook/ accounting/ auxdisplay/ connector/ \
filesystems/ filesystems/configfs/ ia64/ laptops/ networking/ \ filesystems/ filesystems/configfs/ ia64/ laptops/ networking/ \
pcmcia/ spi/ timers/ vm/ watchdog/src/ pcmcia/ spi/ timers/ watchdog/src/

View File

@ -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)

View File

@ -1,4 +1,4 @@
TARGETS = breakpoints TARGETS = breakpoints vm
all: all:
for TARGET in $(TARGETS); do \ for TARGET in $(TARGETS); do \

View File

@ -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

View File

@ -22,7 +22,7 @@
#include <sys/mman.h> #include <sys/mman.h>
#include <fcntl.h> #include <fcntl.h>
#define FILE_NAME "/mnt/hugepagefile" #define FILE_NAME "huge/hugepagefile"
#define LENGTH (256UL*1024*1024) #define LENGTH (256UL*1024*1024)
#define PROTECTION (PROT_READ | PROT_WRITE) #define PROTECTION (PROT_READ | PROT_WRITE)
@ -48,7 +48,7 @@ static void write_bytes(char *addr)
*(addr + i) = (char)i; *(addr + i) = (char)i;
} }
static void read_bytes(char *addr) static int read_bytes(char *addr)
{ {
unsigned long i; unsigned long i;
@ -56,14 +56,15 @@ static void read_bytes(char *addr)
for (i = 0; i < LENGTH; i++) for (i = 0; i < LENGTH; i++)
if (*(addr + i) != (char)i) { if (*(addr + i) != (char)i) {
printf("Mismatch at %lu\n", i); printf("Mismatch at %lu\n", i);
break; return 1;
} }
return 0;
} }
int main(void) int main(void)
{ {
void *addr; void *addr;
int fd; int fd, ret;
fd = open(FILE_NAME, O_CREAT | O_RDWR, 0755); fd = open(FILE_NAME, O_CREAT | O_RDWR, 0755);
if (fd < 0) { if (fd < 0) {
@ -81,11 +82,11 @@ int main(void)
printf("Returned address is %p\n", addr); printf("Returned address is %p\n", addr);
check_bytes(addr); check_bytes(addr);
write_bytes(addr); write_bytes(addr);
read_bytes(addr); ret = read_bytes(addr);
munmap(addr, LENGTH); munmap(addr, LENGTH);
close(fd); close(fd);
unlink(FILE_NAME); unlink(FILE_NAME);
return 0; return ret;
} }

View File

@ -57,8 +57,8 @@ int main(void)
unsigned long i; unsigned long i;
char *shmaddr; char *shmaddr;
if ((shmid = shmget(2, LENGTH, shmid = shmget(2, LENGTH, SHM_HUGETLB | IPC_CREAT | SHM_R | SHM_W);
SHM_HUGETLB | IPC_CREAT | SHM_R | SHM_W)) < 0) { if (shmid < 0) {
perror("shmget"); perror("shmget");
exit(1); exit(1);
} }
@ -82,14 +82,16 @@ int main(void)
dprintf("Starting the Check..."); dprintf("Starting the Check...");
for (i = 0; i < LENGTH; i++) for (i = 0; i < LENGTH; i++)
if (shmaddr[i] != (char)i) if (shmaddr[i] != (char)i) {
printf("\nIndex %lu mismatched\n", i); printf("\nIndex %lu mismatched\n", i);
exit(3);
}
dprintf("Done.\n"); dprintf("Done.\n");
if (shmdt((const void *)shmaddr) != 0) { if (shmdt((const void *)shmaddr) != 0) {
perror("Detach failure"); perror("Detach failure");
shmctl(shmid, IPC_RMID, NULL); shmctl(shmid, IPC_RMID, NULL);
exit(3); exit(4);
} }
shmctl(shmid, IPC_RMID, NULL); shmctl(shmid, IPC_RMID, NULL);

View File

@ -44,7 +44,7 @@ static void write_bytes(char *addr)
*(addr + i) = (char)i; *(addr + i) = (char)i;
} }
static void read_bytes(char *addr) static int read_bytes(char *addr)
{ {
unsigned long i; unsigned long i;
@ -52,13 +52,15 @@ static void read_bytes(char *addr)
for (i = 0; i < LENGTH; i++) for (i = 0; i < LENGTH; i++)
if (*(addr + i) != (char)i) { if (*(addr + i) != (char)i) {
printf("Mismatch at %lu\n", i); printf("Mismatch at %lu\n", i);
break; return 1;
} }
return 0;
} }
int main(void) int main(void)
{ {
void *addr; void *addr;
int ret;
addr = mmap(ADDR, LENGTH, PROTECTION, FLAGS, 0, 0); addr = mmap(ADDR, LENGTH, PROTECTION, FLAGS, 0, 0);
if (addr == MAP_FAILED) { if (addr == MAP_FAILED) {
@ -69,9 +71,9 @@ int main(void)
printf("Returned address is %p\n", addr); printf("Returned address is %p\n", addr);
check_bytes(addr); check_bytes(addr);
write_bytes(addr); write_bytes(addr);
read_bytes(addr); ret = read_bytes(addr);
munmap(addr, LENGTH); munmap(addr, LENGTH);
return 0; return ret;
} }

View File

@ -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