forked from Minki/linux
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:
parent
63e315535a
commit
f0f57b2b14
@ -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/
|
||||||
|
@ -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)
|
|
@ -1,4 +1,4 @@
|
|||||||
TARGETS = breakpoints
|
TARGETS = breakpoints vm
|
||||||
|
|
||||||
all:
|
all:
|
||||||
for TARGET in $(TARGETS); do \
|
for TARGET in $(TARGETS); do \
|
||||||
|
14
tools/testing/selftests/vm/Makefile
Normal file
14
tools/testing/selftests/vm/Makefile
Normal 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
|
@ -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;
|
||||||
}
|
}
|
@ -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);
|
@ -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;
|
||||||
}
|
}
|
77
tools/testing/selftests/vm/run_vmtests
Normal file
77
tools/testing/selftests/vm/run_vmtests
Normal 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
|
Loading…
Reference in New Issue
Block a user