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
					
				
			
		
					 8 changed files with 112 additions and 24 deletions
				
			
		| 
						 | 
				
			
			@ -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/
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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:
 | 
			
		||||
	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 <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;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										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…
	
	Add table
		Add a link
		
	
		Reference in a new issue