mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
linux-kselftest-4.4-rc1
This 12 patch update for 4.4-rc1 consists of a new pstore test and fixes to existing tests. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJWQMxXAAoJEAsCRMQNDUMcvQAQALUpci62eNC1PSiDV0qWQxPu L6WyQ/ccdzIvR5IGfLb9t/S8+0LHIro5JVgVwiUzjaPiEULWXNhu1zMzZLdxbN5L SwgIj+48dGAXfmwdHimRgAMQJteqW95Sz3vF7LFE+qTACje7a6rNtF0qBgZ9TLRB RiU6onK3ACKQzCOArWiHetupliTDdffIPdqth0Tod8q82uf/Jf03gxRApx9R7vS2 FsZrhxjyEKv59cFdSO1Ai/vfYxjdsYQXLocDXTxaOVv3FMT8XBeo9GNPX9GC1LhO V4nv86g3UnOgXPBHthx4dDaVc/781BofUk108ZoeBdEQ9oWdW8rElfqdfUmsb0PY 1tS1sOvBPa3ECt73kbm+xHaorZ+LQT5j8Q28AxKVXgbtdHlEsE50fdxoJS5Tfkwh q1N6Ri/MWSxkDgXcL6RtInaO73mDFQ2BBaa9TDP7QVLNl/imyAIsP84P6Z4lm02B tZJEGbZiJ60r3Fhbp6Tktw86CC8c3wuN4cOaO6SoIuSzi7XAXuOhb5js0vdXBHRr njI4gzm3oNMcpTII5ZX1++0fRqwuGainCaGXa4igvXuE1WxIOiDCMXYqmF/mr4Av 4b8EU922DferWVg224vhErE5rDFwxVE7FGPwr07M09/Ch+ht3CDkiOz5Lh4kTPYK oOi3E+k18mTyNA/Z3IAW =MM4D -----END PGP SIGNATURE----- Merge tag 'linux-kselftest-4.4-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest Pull kselftest updates from Shuah Khan: "This 12 patch update for 4.4-rc1 consists of a new pstore test and fixes to existing tests" * tag 'linux-kselftest-4.4-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest: selftests: breakpoint: Actually build it selftests: vm: Try harder to allocate huge pages selftests: Make scripts executable selftests: kprobe: Choose an always-defined function to probe selftests: memfd: Stop unnecessary rebuilds selftests: Add missing #include directives selftests/seccomp: Be more precise with syscall arguments. selftests/seccomp: build and pass on arm64 selftests: memfd_test: Revised STACK_SIZE to make it 16-byte aligned selftests/pstore: add pstore test scripts going with reboot selftests/pstore: add pstore test script for pre-reboot selftests: add .gitignore for efivarfs
This commit is contained in:
commit
6a177af775
22 changed files with 362 additions and 53 deletions
|
@ -14,6 +14,7 @@ TARGETS += mount
|
||||||
TARGETS += mqueue
|
TARGETS += mqueue
|
||||||
TARGETS += net
|
TARGETS += net
|
||||||
TARGETS += powerpc
|
TARGETS += powerpc
|
||||||
|
TARGETS += pstore
|
||||||
TARGETS += ptrace
|
TARGETS += ptrace
|
||||||
TARGETS += seccomp
|
TARGETS += seccomp
|
||||||
TARGETS += size
|
TARGETS += size
|
||||||
|
@ -66,6 +67,9 @@ clean_hotplug:
|
||||||
make -C $$TARGET clean; \
|
make -C $$TARGET clean; \
|
||||||
done;
|
done;
|
||||||
|
|
||||||
|
run_pstore_crash:
|
||||||
|
make -C pstore run_crash
|
||||||
|
|
||||||
INSTALL_PATH ?= install
|
INSTALL_PATH ?= install
|
||||||
INSTALL_PATH := $(abspath $(INSTALL_PATH))
|
INSTALL_PATH := $(abspath $(INSTALL_PATH))
|
||||||
ALL_SCRIPT := $(INSTALL_PATH)/run_kselftest.sh
|
ALL_SCRIPT := $(INSTALL_PATH)/run_kselftest.sh
|
||||||
|
|
|
@ -6,7 +6,7 @@ ifeq ($(ARCH),x86)
|
||||||
TEST_PROGS := breakpoint_test
|
TEST_PROGS := breakpoint_test
|
||||||
endif
|
endif
|
||||||
|
|
||||||
all:
|
all: $(TEST_PROGS)
|
||||||
|
|
||||||
include ../lib.mk
|
include ../lib.mk
|
||||||
|
|
||||||
|
|
2
tools/testing/selftests/efivarfs/.gitignore
vendored
Normal file
2
tools/testing/selftests/efivarfs/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
create-read
|
||||||
|
open-unlink
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
echo 0 > events/enable
|
echo 0 > events/enable
|
||||||
echo > kprobe_events
|
echo > kprobe_events
|
||||||
echo p:myevent do_fork > kprobe_events
|
echo p:myevent _do_fork > kprobe_events
|
||||||
grep myevent kprobe_events
|
grep myevent kprobe_events
|
||||||
test -d events/kprobes/myevent
|
test -d events/kprobes/myevent
|
||||||
echo > kprobe_events
|
echo > kprobe_events
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
echo 0 > events/enable
|
echo 0 > events/enable
|
||||||
echo > kprobe_events
|
echo > kprobe_events
|
||||||
echo p:myevent do_fork > kprobe_events
|
echo p:myevent _do_fork > kprobe_events
|
||||||
test -d events/kprobes/myevent
|
test -d events/kprobes/myevent
|
||||||
echo 1 > events/kprobes/myevent/enable
|
echo 1 > events/kprobes/myevent/enable
|
||||||
echo > kprobe_events && exit 1 # this must fail
|
echo > kprobe_events && exit 1 # this must fail
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
echo 0 > events/enable
|
echo 0 > events/enable
|
||||||
echo > kprobe_events
|
echo > kprobe_events
|
||||||
echo 'p:testprobe do_fork $stack $stack0 +0($stack)' > kprobe_events
|
echo 'p:testprobe _do_fork $stack $stack0 +0($stack)' > kprobe_events
|
||||||
grep testprobe kprobe_events
|
grep testprobe kprobe_events
|
||||||
test -d events/kprobes/testprobe
|
test -d events/kprobes/testprobe
|
||||||
echo 1 > events/kprobes/testprobe/enable
|
echo 1 > events/kprobes/testprobe/enable
|
||||||
|
|
|
@ -6,31 +6,31 @@ grep function available_tracers || exit_unsupported # this is configurable
|
||||||
|
|
||||||
# prepare
|
# prepare
|
||||||
echo nop > current_tracer
|
echo nop > current_tracer
|
||||||
echo do_fork > set_ftrace_filter
|
echo _do_fork > set_ftrace_filter
|
||||||
echo 0 > events/enable
|
echo 0 > events/enable
|
||||||
echo > kprobe_events
|
echo > kprobe_events
|
||||||
echo 'p:testprobe do_fork' > kprobe_events
|
echo 'p:testprobe _do_fork' > kprobe_events
|
||||||
|
|
||||||
# kprobe on / ftrace off
|
# kprobe on / ftrace off
|
||||||
echo 1 > events/kprobes/testprobe/enable
|
echo 1 > events/kprobes/testprobe/enable
|
||||||
echo > trace
|
echo > trace
|
||||||
( echo "forked")
|
( echo "forked")
|
||||||
grep testprobe trace
|
grep testprobe trace
|
||||||
! grep 'do_fork <-' trace
|
! grep '_do_fork <-' trace
|
||||||
|
|
||||||
# kprobe on / ftrace on
|
# kprobe on / ftrace on
|
||||||
echo function > current_tracer
|
echo function > current_tracer
|
||||||
echo > trace
|
echo > trace
|
||||||
( echo "forked")
|
( echo "forked")
|
||||||
grep testprobe trace
|
grep testprobe trace
|
||||||
grep 'do_fork <-' trace
|
grep '_do_fork <-' trace
|
||||||
|
|
||||||
# kprobe off / ftrace on
|
# kprobe off / ftrace on
|
||||||
echo 0 > events/kprobes/testprobe/enable
|
echo 0 > events/kprobes/testprobe/enable
|
||||||
echo > trace
|
echo > trace
|
||||||
( echo "forked")
|
( echo "forked")
|
||||||
! grep testprobe trace
|
! grep testprobe trace
|
||||||
grep 'do_fork <-' trace
|
grep '_do_fork <-' trace
|
||||||
|
|
||||||
# kprobe on / ftrace on
|
# kprobe on / ftrace on
|
||||||
echo 1 > events/kprobes/testprobe/enable
|
echo 1 > events/kprobes/testprobe/enable
|
||||||
|
@ -38,14 +38,14 @@ echo function > current_tracer
|
||||||
echo > trace
|
echo > trace
|
||||||
( echo "forked")
|
( echo "forked")
|
||||||
grep testprobe trace
|
grep testprobe trace
|
||||||
grep 'do_fork <-' trace
|
grep '_do_fork <-' trace
|
||||||
|
|
||||||
# kprobe on / ftrace off
|
# kprobe on / ftrace off
|
||||||
echo nop > current_tracer
|
echo nop > current_tracer
|
||||||
echo > trace
|
echo > trace
|
||||||
( echo "forked")
|
( echo "forked")
|
||||||
grep testprobe trace
|
grep testprobe trace
|
||||||
! grep 'do_fork <-' trace
|
! grep '_do_fork <-' trace
|
||||||
|
|
||||||
# cleanup
|
# cleanup
|
||||||
echo nop > current_tracer
|
echo nop > current_tracer
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
echo 0 > events/enable
|
echo 0 > events/enable
|
||||||
echo > kprobe_events
|
echo > kprobe_events
|
||||||
echo 'r:testprobe2 do_fork $retval' > kprobe_events
|
echo 'r:testprobe2 _do_fork $retval' > kprobe_events
|
||||||
grep testprobe2 kprobe_events
|
grep testprobe2 kprobe_events
|
||||||
test -d events/kprobes/testprobe2
|
test -d events/kprobes/testprobe2
|
||||||
echo 1 > events/kprobes/testprobe2/enable
|
echo 1 > events/kprobes/testprobe2/enable
|
||||||
|
|
|
@ -4,16 +4,16 @@ CFLAGS += -I../../../../include/uapi/
|
||||||
CFLAGS += -I../../../../include/
|
CFLAGS += -I../../../../include/
|
||||||
CFLAGS += -I../../../../usr/include/
|
CFLAGS += -I../../../../usr/include/
|
||||||
|
|
||||||
all:
|
|
||||||
$(CC) $(CFLAGS) memfd_test.c -o memfd_test
|
|
||||||
|
|
||||||
TEST_PROGS := memfd_test
|
TEST_PROGS := memfd_test
|
||||||
|
|
||||||
|
all: $(TEST_PROGS)
|
||||||
|
|
||||||
include ../lib.mk
|
include ../lib.mk
|
||||||
|
|
||||||
build_fuse:
|
build_fuse: fuse_mnt fuse_test
|
||||||
$(CC) $(CFLAGS) fuse_mnt.c `pkg-config fuse --cflags --libs` -o fuse_mnt
|
|
||||||
$(CC) $(CFLAGS) fuse_test.c -o fuse_test
|
fuse_mnt.o: CFLAGS += $(shell pkg-config fuse --cflags)
|
||||||
|
fuse_mnt: LDFLAGS += $(shell pkg-config fuse --libs)
|
||||||
|
|
||||||
run_fuse: build_fuse
|
run_fuse: build_fuse
|
||||||
@./run_fuse_test.sh || echo "fuse_test: [FAIL]"
|
@./run_fuse_test.sh || echo "fuse_test: [FAIL]"
|
||||||
|
|
|
@ -15,10 +15,11 @@
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#define MFD_DEF_SIZE 8192
|
#define MFD_DEF_SIZE 8192
|
||||||
#define STACK_SIZE 65535
|
#define STACK_SIZE 65536
|
||||||
|
|
||||||
static int sys_memfd_create(const char *name,
|
static int sys_memfd_create(const char *name,
|
||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
|
|
0
tools/testing/selftests/memfd/run_fuse_test.sh
Normal file → Executable file
0
tools/testing/selftests/memfd/run_fuse_test.sh
Normal file → Executable file
|
@ -31,6 +31,7 @@
|
||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <mqueue.h>
|
#include <mqueue.h>
|
||||||
|
#include <error.h>
|
||||||
|
|
||||||
static char *usage =
|
static char *usage =
|
||||||
"Usage:\n"
|
"Usage:\n"
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <mqueue.h>
|
#include <mqueue.h>
|
||||||
#include <popt.h>
|
#include <popt.h>
|
||||||
|
#include <error.h>
|
||||||
|
|
||||||
static char *usage =
|
static char *usage =
|
||||||
"Usage:\n"
|
"Usage:\n"
|
||||||
|
|
15
tools/testing/selftests/pstore/Makefile
Normal file
15
tools/testing/selftests/pstore/Makefile
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# Makefile for pstore selftests.
|
||||||
|
# Expects pstore backend is registered.
|
||||||
|
|
||||||
|
all:
|
||||||
|
|
||||||
|
TEST_PROGS := pstore_tests pstore_post_reboot_tests
|
||||||
|
TEST_FILES := common_tests pstore_crash_test
|
||||||
|
|
||||||
|
include ../lib.mk
|
||||||
|
|
||||||
|
run_crash:
|
||||||
|
@sh pstore_crash_test || { echo "pstore_crash_test: [FAIL]"; exit 1; }
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf logs/* *uuid
|
83
tools/testing/selftests/pstore/common_tests
Executable file
83
tools/testing/selftests/pstore/common_tests
Executable file
|
@ -0,0 +1,83 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# common_tests - Shell script commonly used by pstore test scripts
|
||||||
|
#
|
||||||
|
# Copyright (C) Hitachi Ltd., 2015
|
||||||
|
# Written by Hiraku Toyooka <hiraku.toyooka.gu@hitachi.com>
|
||||||
|
#
|
||||||
|
# Released under the terms of the GPL v2.
|
||||||
|
|
||||||
|
# Utilities
|
||||||
|
errexit() { # message
|
||||||
|
echo "Error: $1" 1>&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
absdir() { # file_path
|
||||||
|
(cd `dirname $1`; pwd)
|
||||||
|
}
|
||||||
|
|
||||||
|
show_result() { # result_value
|
||||||
|
if [ $1 -eq 0 ]; then
|
||||||
|
prlog "ok"
|
||||||
|
else
|
||||||
|
prlog "FAIL"
|
||||||
|
rc=1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check_files_exist() { # type of pstorefs file
|
||||||
|
if [ -e ${1}-${backend}-0 ]; then
|
||||||
|
prlog "ok"
|
||||||
|
for f in `ls ${1}-${backend}-*`; do
|
||||||
|
prlog -e "\t${f}"
|
||||||
|
done
|
||||||
|
else
|
||||||
|
prlog "FAIL"
|
||||||
|
rc=1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
operate_files() { # tested value, files, operation
|
||||||
|
if [ $1 -eq 0 ]; then
|
||||||
|
prlog
|
||||||
|
for f in $2; do
|
||||||
|
prlog -ne "\t${f} ... "
|
||||||
|
# execute operation
|
||||||
|
$3 $f
|
||||||
|
show_result $?
|
||||||
|
done
|
||||||
|
else
|
||||||
|
prlog " ... FAIL"
|
||||||
|
rc=1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parameters
|
||||||
|
TEST_STRING_PATTERN="Testing pstore: uuid="
|
||||||
|
UUID=`cat /proc/sys/kernel/random/uuid`
|
||||||
|
TOP_DIR=`absdir $0`
|
||||||
|
LOG_DIR=$TOP_DIR/logs/`date +%Y%m%d-%H%M%S`_${UUID}/
|
||||||
|
REBOOT_FLAG=$TOP_DIR/reboot_flag
|
||||||
|
|
||||||
|
# Preparing logs
|
||||||
|
LOG_FILE=$LOG_DIR/`basename $0`.log
|
||||||
|
mkdir -p $LOG_DIR || errexit "Failed to make a log directory: $LOG_DIR"
|
||||||
|
date > $LOG_FILE
|
||||||
|
prlog() { # messages
|
||||||
|
/bin/echo "$@" | tee -a $LOG_FILE
|
||||||
|
}
|
||||||
|
|
||||||
|
# Starting tests
|
||||||
|
rc=0
|
||||||
|
prlog "=== Pstore unit tests (`basename $0`) ==="
|
||||||
|
prlog "UUID="$UUID
|
||||||
|
|
||||||
|
prlog -n "Checking pstore backend is registered ... "
|
||||||
|
backend=`cat /sys/module/pstore/parameters/backend`
|
||||||
|
show_result $?
|
||||||
|
prlog -e "\tbackend=${backend}"
|
||||||
|
prlog -e "\tcmdline=`cat /proc/cmdline`"
|
||||||
|
if [ $rc -ne 0 ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
30
tools/testing/selftests/pstore/pstore_crash_test
Executable file
30
tools/testing/selftests/pstore/pstore_crash_test
Executable file
|
@ -0,0 +1,30 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# pstore_crash_test - Pstore test shell script which causes crash and reboot
|
||||||
|
#
|
||||||
|
# Copyright (C) Hitachi Ltd., 2015
|
||||||
|
# Written by Hiraku Toyooka <hiraku.toyooka.gu@hitachi.com>
|
||||||
|
#
|
||||||
|
# Released under the terms of the GPL v2.
|
||||||
|
|
||||||
|
# exit if pstore backend is not registered
|
||||||
|
. ./common_tests
|
||||||
|
|
||||||
|
prlog "Causing kernel crash ..."
|
||||||
|
|
||||||
|
# enable all functions triggered by sysrq
|
||||||
|
echo 1 > /proc/sys/kernel/sysrq
|
||||||
|
# setting to reboot in 3 seconds after panic
|
||||||
|
echo 3 > /proc/sys/kernel/panic
|
||||||
|
|
||||||
|
# save uuid file by different name because next test execution will replace it.
|
||||||
|
mv $TOP_DIR/uuid $TOP_DIR/prev_uuid
|
||||||
|
|
||||||
|
# create a file as reboot flag
|
||||||
|
touch $REBOOT_FLAG
|
||||||
|
sync
|
||||||
|
|
||||||
|
# cause crash
|
||||||
|
# Note: If you use kdump and want to see kmesg-* files after reboot, you should
|
||||||
|
# specify 'crash_kexec_post_notifiers' in 1st kernel's cmdline.
|
||||||
|
echo c > /proc/sysrq-trigger
|
77
tools/testing/selftests/pstore/pstore_post_reboot_tests
Executable file
77
tools/testing/selftests/pstore/pstore_post_reboot_tests
Executable file
|
@ -0,0 +1,77 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# pstore_post_reboot_tests - Check pstore's behavior after crash/reboot
|
||||||
|
#
|
||||||
|
# Copyright (C) Hitachi Ltd., 2015
|
||||||
|
# Written by Hiraku Toyooka <hiraku.toyooka.gu@hitachi.com>
|
||||||
|
#
|
||||||
|
# Released under the terms of the GPL v2.
|
||||||
|
|
||||||
|
. ./common_tests
|
||||||
|
|
||||||
|
if [ -e $REBOOT_FLAG ]; then
|
||||||
|
rm $REBOOT_FLAG
|
||||||
|
else
|
||||||
|
prlog "pstore_crash_test has not been executed yet. we skip further tests."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
prlog -n "Mounting pstore filesystem ... "
|
||||||
|
mount_info=`grep pstore /proc/mounts`
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
mount_point=`echo ${mount_info} | cut -d' ' -f2 | head -n1`
|
||||||
|
prlog "ok"
|
||||||
|
else
|
||||||
|
mount none /sys/fs/pstore -t pstore
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
mount_point=`grep pstore /proc/mounts | cut -d' ' -f2 | head -n1`
|
||||||
|
prlog "ok"
|
||||||
|
else
|
||||||
|
prlog "FAIL"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd ${mount_point}
|
||||||
|
|
||||||
|
prlog -n "Checking dmesg files exist in pstore filesystem ... "
|
||||||
|
check_files_exist dmesg
|
||||||
|
|
||||||
|
prlog -n "Checking console files exist in pstore filesystem ... "
|
||||||
|
check_files_exist console
|
||||||
|
|
||||||
|
prlog -n "Checking pmsg files exist in pstore filesystem ... "
|
||||||
|
check_files_exist pmsg
|
||||||
|
|
||||||
|
prlog -n "Checking dmesg files contain oops end marker"
|
||||||
|
grep_end_trace() {
|
||||||
|
grep -q "\---\[ end trace" $1
|
||||||
|
}
|
||||||
|
files=`ls dmesg-${backend}-*`
|
||||||
|
operate_files $? "$files" grep_end_trace
|
||||||
|
|
||||||
|
prlog -n "Checking console file contains oops end marker ... "
|
||||||
|
grep -q "\---\[ end trace" console-${backend}-0
|
||||||
|
show_result $?
|
||||||
|
|
||||||
|
prlog -n "Checking pmsg file properly keeps the content written before crash ... "
|
||||||
|
prev_uuid=`cat $TOP_DIR/prev_uuid`
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
nr_matched=`grep -c "$TEST_STRING_PATTERN" pmsg-${backend}-0`
|
||||||
|
if [ $nr_matched -eq 1 ]; then
|
||||||
|
grep -q "$TEST_STRING_PATTERN"$prev_uuid pmsg-${backend}-0
|
||||||
|
show_result $?
|
||||||
|
else
|
||||||
|
prlog "FAIL"
|
||||||
|
rc=1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
prlog "FAIL"
|
||||||
|
rc=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
prlog -n "Removing all files in pstore filesystem "
|
||||||
|
files=`ls *-${backend}-*`
|
||||||
|
operate_files $? "$files" rm
|
||||||
|
|
||||||
|
exit $rc
|
30
tools/testing/selftests/pstore/pstore_tests
Executable file
30
tools/testing/selftests/pstore/pstore_tests
Executable file
|
@ -0,0 +1,30 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# pstore_tests - Check pstore's behavior before crash/reboot
|
||||||
|
#
|
||||||
|
# Copyright (C) Hitachi Ltd., 2015
|
||||||
|
# Written by Hiraku Toyooka <hiraku.toyooka.gu@hitachi.com>
|
||||||
|
#
|
||||||
|
# Released under the terms of the GPL v2.
|
||||||
|
|
||||||
|
. ./common_tests
|
||||||
|
|
||||||
|
prlog -n "Checking pstore console is registered ... "
|
||||||
|
dmesg | grep -q "console \[pstore"
|
||||||
|
show_result $?
|
||||||
|
|
||||||
|
prlog -n "Checking /dev/pmsg0 exists ... "
|
||||||
|
test -e /dev/pmsg0
|
||||||
|
show_result $?
|
||||||
|
|
||||||
|
prlog -n "Writing unique string to /dev/pmsg0 ... "
|
||||||
|
if [ -e "/dev/pmsg0" ]; then
|
||||||
|
echo "${TEST_STRING_PATTERN}""$UUID" > /dev/pmsg0
|
||||||
|
show_result $?
|
||||||
|
echo "$UUID" > $TOP_DIR/uuid
|
||||||
|
else
|
||||||
|
prlog "FAIL"
|
||||||
|
rc=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit $rc
|
|
@ -19,15 +19,19 @@
|
||||||
#include <linux/prctl.h>
|
#include <linux/prctl.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/seccomp.h>
|
#include <linux/seccomp.h>
|
||||||
#include <poll.h>
|
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <semaphore.h>
|
#include <semaphore.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
#include <linux/elf.h>
|
#include <linux/elf.h>
|
||||||
#include <sys/uio.h>
|
#include <sys/uio.h>
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
#include <sys/fcntl.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/times.h>
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
@ -428,14 +432,16 @@ TEST_SIGNAL(KILL_one, SIGSYS)
|
||||||
|
|
||||||
TEST_SIGNAL(KILL_one_arg_one, SIGSYS)
|
TEST_SIGNAL(KILL_one_arg_one, SIGSYS)
|
||||||
{
|
{
|
||||||
|
void *fatal_address;
|
||||||
struct sock_filter filter[] = {
|
struct sock_filter filter[] = {
|
||||||
BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
|
BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
|
||||||
offsetof(struct seccomp_data, nr)),
|
offsetof(struct seccomp_data, nr)),
|
||||||
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
|
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_times, 1, 0),
|
||||||
BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
|
BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
|
||||||
/* Only both with lower 32-bit for now. */
|
/* Only both with lower 32-bit for now. */
|
||||||
BPF_STMT(BPF_LD|BPF_W|BPF_ABS, syscall_arg(0)),
|
BPF_STMT(BPF_LD|BPF_W|BPF_ABS, syscall_arg(0)),
|
||||||
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 0x0C0FFEE, 0, 1),
|
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K,
|
||||||
|
(unsigned long)&fatal_address, 0, 1),
|
||||||
BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
|
BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
|
||||||
BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
|
BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
|
||||||
};
|
};
|
||||||
|
@ -445,7 +451,8 @@ TEST_SIGNAL(KILL_one_arg_one, SIGSYS)
|
||||||
};
|
};
|
||||||
long ret;
|
long ret;
|
||||||
pid_t parent = getppid();
|
pid_t parent = getppid();
|
||||||
pid_t pid = getpid();
|
struct tms timebuf;
|
||||||
|
clock_t clock = times(&timebuf);
|
||||||
|
|
||||||
ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
|
ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
|
||||||
ASSERT_EQ(0, ret);
|
ASSERT_EQ(0, ret);
|
||||||
|
@ -454,17 +461,22 @@ TEST_SIGNAL(KILL_one_arg_one, SIGSYS)
|
||||||
ASSERT_EQ(0, ret);
|
ASSERT_EQ(0, ret);
|
||||||
|
|
||||||
EXPECT_EQ(parent, syscall(__NR_getppid));
|
EXPECT_EQ(parent, syscall(__NR_getppid));
|
||||||
EXPECT_EQ(pid, syscall(__NR_getpid));
|
EXPECT_LE(clock, syscall(__NR_times, &timebuf));
|
||||||
/* getpid() should never return. */
|
/* times() should never return. */
|
||||||
EXPECT_EQ(0, syscall(__NR_getpid, 0x0C0FFEE));
|
EXPECT_EQ(0, syscall(__NR_times, &fatal_address));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_SIGNAL(KILL_one_arg_six, SIGSYS)
|
TEST_SIGNAL(KILL_one_arg_six, SIGSYS)
|
||||||
{
|
{
|
||||||
|
#ifndef __NR_mmap2
|
||||||
|
int sysno = __NR_mmap;
|
||||||
|
#else
|
||||||
|
int sysno = __NR_mmap2;
|
||||||
|
#endif
|
||||||
struct sock_filter filter[] = {
|
struct sock_filter filter[] = {
|
||||||
BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
|
BPF_STMT(BPF_LD|BPF_W|BPF_ABS,
|
||||||
offsetof(struct seccomp_data, nr)),
|
offsetof(struct seccomp_data, nr)),
|
||||||
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_getpid, 1, 0),
|
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, sysno, 1, 0),
|
||||||
BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
|
BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
|
||||||
/* Only both with lower 32-bit for now. */
|
/* Only both with lower 32-bit for now. */
|
||||||
BPF_STMT(BPF_LD|BPF_W|BPF_ABS, syscall_arg(5)),
|
BPF_STMT(BPF_LD|BPF_W|BPF_ABS, syscall_arg(5)),
|
||||||
|
@ -478,7 +490,8 @@ TEST_SIGNAL(KILL_one_arg_six, SIGSYS)
|
||||||
};
|
};
|
||||||
long ret;
|
long ret;
|
||||||
pid_t parent = getppid();
|
pid_t parent = getppid();
|
||||||
pid_t pid = getpid();
|
int fd;
|
||||||
|
void *map1, *map2;
|
||||||
|
|
||||||
ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
|
ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
|
||||||
ASSERT_EQ(0, ret);
|
ASSERT_EQ(0, ret);
|
||||||
|
@ -486,10 +499,22 @@ TEST_SIGNAL(KILL_one_arg_six, SIGSYS)
|
||||||
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
|
ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog);
|
||||||
ASSERT_EQ(0, ret);
|
ASSERT_EQ(0, ret);
|
||||||
|
|
||||||
|
fd = open("/dev/zero", O_RDONLY);
|
||||||
|
ASSERT_NE(-1, fd);
|
||||||
|
|
||||||
EXPECT_EQ(parent, syscall(__NR_getppid));
|
EXPECT_EQ(parent, syscall(__NR_getppid));
|
||||||
EXPECT_EQ(pid, syscall(__NR_getpid));
|
map1 = (void *)syscall(sysno,
|
||||||
/* getpid() should never return. */
|
NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, fd, PAGE_SIZE);
|
||||||
EXPECT_EQ(0, syscall(__NR_getpid, 1, 2, 3, 4, 5, 0x0C0FFEE));
|
EXPECT_NE(MAP_FAILED, map1);
|
||||||
|
/* mmap2() should never return. */
|
||||||
|
map2 = (void *)syscall(sysno,
|
||||||
|
NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, fd, 0x0C0FFEE);
|
||||||
|
EXPECT_EQ(MAP_FAILED, map2);
|
||||||
|
|
||||||
|
/* The test failed, so clean up the resources. */
|
||||||
|
munmap(map1, PAGE_SIZE);
|
||||||
|
munmap(map2, PAGE_SIZE);
|
||||||
|
close(fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO(wad) add 64-bit versus 32-bit arg tests. */
|
/* TODO(wad) add 64-bit versus 32-bit arg tests. */
|
||||||
|
@ -1247,8 +1272,8 @@ void change_syscall(struct __test_metadata *_metadata,
|
||||||
ret = ptrace(PTRACE_GETREGSET, tracee, NT_PRSTATUS, &iov);
|
ret = ptrace(PTRACE_GETREGSET, tracee, NT_PRSTATUS, &iov);
|
||||||
EXPECT_EQ(0, ret);
|
EXPECT_EQ(0, ret);
|
||||||
|
|
||||||
#if defined(__x86_64__) || defined(__i386__) || defined(__aarch64__) || \
|
#if defined(__x86_64__) || defined(__i386__) || defined(__powerpc__) || \
|
||||||
defined(__powerpc__) || defined(__s390__)
|
defined(__s390__)
|
||||||
{
|
{
|
||||||
regs.SYSCALL_NUM = syscall;
|
regs.SYSCALL_NUM = syscall;
|
||||||
}
|
}
|
||||||
|
@ -1262,6 +1287,18 @@ void change_syscall(struct __test_metadata *_metadata,
|
||||||
EXPECT_EQ(0, ret);
|
EXPECT_EQ(0, ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#elif defined(__aarch64__)
|
||||||
|
# ifndef NT_ARM_SYSTEM_CALL
|
||||||
|
# define NT_ARM_SYSTEM_CALL 0x404
|
||||||
|
# endif
|
||||||
|
{
|
||||||
|
iov.iov_base = &syscall;
|
||||||
|
iov.iov_len = sizeof(syscall);
|
||||||
|
ret = ptrace(PTRACE_SETREGSET, tracee, NT_ARM_SYSTEM_CALL,
|
||||||
|
&iov);
|
||||||
|
EXPECT_EQ(0, ret);
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
ASSERT_EQ(1, 0) {
|
ASSERT_EQ(1, 0) {
|
||||||
TH_LOG("How is the syscall changed on this architecture?");
|
TH_LOG("How is the syscall changed on this architecture?");
|
||||||
|
@ -1272,6 +1309,8 @@ void change_syscall(struct __test_metadata *_metadata,
|
||||||
if (syscall == -1)
|
if (syscall == -1)
|
||||||
regs.SYSCALL_RET = 1;
|
regs.SYSCALL_RET = 1;
|
||||||
|
|
||||||
|
iov.iov_base = ®s;
|
||||||
|
iov.iov_len = sizeof(regs);
|
||||||
ret = ptrace(PTRACE_SETREGSET, tracee, NT_PRSTATUS, &iov);
|
ret = ptrace(PTRACE_SETREGSET, tracee, NT_PRSTATUS, &iov);
|
||||||
EXPECT_EQ(0, ret);
|
EXPECT_EQ(0, ret);
|
||||||
}
|
}
|
||||||
|
@ -2005,20 +2044,25 @@ TEST(syscall_restart)
|
||||||
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 5, 0),
|
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_read, 5, 0),
|
||||||
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_exit, 4, 0),
|
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_exit, 4, 0),
|
||||||
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_rt_sigreturn, 3, 0),
|
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_rt_sigreturn, 3, 0),
|
||||||
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_poll, 4, 0),
|
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_nanosleep, 4, 0),
|
||||||
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_restart_syscall, 4, 0),
|
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_restart_syscall, 4, 0),
|
||||||
|
|
||||||
/* Allow __NR_write for easy logging. */
|
/* Allow __NR_write for easy logging. */
|
||||||
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_write, 0, 1),
|
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, __NR_write, 0, 1),
|
||||||
BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
|
BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW),
|
||||||
BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
|
BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL),
|
||||||
BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE|0x100), /* poll */
|
/* The nanosleep jump target. */
|
||||||
BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE|0x200), /* restart */
|
BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE|0x100),
|
||||||
|
/* The restart_syscall jump target. */
|
||||||
|
BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_TRACE|0x200),
|
||||||
};
|
};
|
||||||
struct sock_fprog prog = {
|
struct sock_fprog prog = {
|
||||||
.len = (unsigned short)ARRAY_SIZE(filter),
|
.len = (unsigned short)ARRAY_SIZE(filter),
|
||||||
.filter = filter,
|
.filter = filter,
|
||||||
};
|
};
|
||||||
|
#if defined(__arm__)
|
||||||
|
struct utsname utsbuf;
|
||||||
|
#endif
|
||||||
|
|
||||||
ASSERT_EQ(0, pipe(pipefd));
|
ASSERT_EQ(0, pipe(pipefd));
|
||||||
|
|
||||||
|
@ -2027,10 +2071,7 @@ TEST(syscall_restart)
|
||||||
if (child_pid == 0) {
|
if (child_pid == 0) {
|
||||||
/* Child uses EXPECT not ASSERT to deliver status correctly. */
|
/* Child uses EXPECT not ASSERT to deliver status correctly. */
|
||||||
char buf = ' ';
|
char buf = ' ';
|
||||||
struct pollfd fds = {
|
struct timespec timeout = { };
|
||||||
.fd = pipefd[0],
|
|
||||||
.events = POLLIN,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Attach parent as tracer and stop. */
|
/* Attach parent as tracer and stop. */
|
||||||
EXPECT_EQ(0, ptrace(PTRACE_TRACEME));
|
EXPECT_EQ(0, ptrace(PTRACE_TRACEME));
|
||||||
|
@ -2054,10 +2095,11 @@ TEST(syscall_restart)
|
||||||
TH_LOG("Failed to get sync data from read()");
|
TH_LOG("Failed to get sync data from read()");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Start poll to be interrupted. */
|
/* Start nanosleep to be interrupted. */
|
||||||
|
timeout.tv_sec = 1;
|
||||||
errno = 0;
|
errno = 0;
|
||||||
EXPECT_EQ(1, poll(&fds, 1, -1)) {
|
EXPECT_EQ(0, nanosleep(&timeout, NULL)) {
|
||||||
TH_LOG("Call to poll() failed (errno %d)", errno);
|
TH_LOG("Call to nanosleep() failed (errno %d)", errno);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read final sync from parent. */
|
/* Read final sync from parent. */
|
||||||
|
@ -2082,14 +2124,14 @@ TEST(syscall_restart)
|
||||||
ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
|
ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
|
||||||
ASSERT_EQ(1, write(pipefd[1], ".", 1));
|
ASSERT_EQ(1, write(pipefd[1], ".", 1));
|
||||||
|
|
||||||
/* Wait for poll() to start. */
|
/* Wait for nanosleep() to start. */
|
||||||
ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
|
ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
|
||||||
ASSERT_EQ(true, WIFSTOPPED(status));
|
ASSERT_EQ(true, WIFSTOPPED(status));
|
||||||
ASSERT_EQ(SIGTRAP, WSTOPSIG(status));
|
ASSERT_EQ(SIGTRAP, WSTOPSIG(status));
|
||||||
ASSERT_EQ(PTRACE_EVENT_SECCOMP, (status >> 16));
|
ASSERT_EQ(PTRACE_EVENT_SECCOMP, (status >> 16));
|
||||||
ASSERT_EQ(0, ptrace(PTRACE_GETEVENTMSG, child_pid, NULL, &msg));
|
ASSERT_EQ(0, ptrace(PTRACE_GETEVENTMSG, child_pid, NULL, &msg));
|
||||||
ASSERT_EQ(0x100, msg);
|
ASSERT_EQ(0x100, msg);
|
||||||
EXPECT_EQ(__NR_poll, get_syscall(_metadata, child_pid));
|
EXPECT_EQ(__NR_nanosleep, get_syscall(_metadata, child_pid));
|
||||||
|
|
||||||
/* Might as well check siginfo for sanity while we're here. */
|
/* Might as well check siginfo for sanity while we're here. */
|
||||||
ASSERT_EQ(0, ptrace(PTRACE_GETSIGINFO, child_pid, NULL, &info));
|
ASSERT_EQ(0, ptrace(PTRACE_GETSIGINFO, child_pid, NULL, &info));
|
||||||
|
@ -2100,7 +2142,7 @@ TEST(syscall_restart)
|
||||||
/* Verify signal delivery came from child (seccomp-triggered). */
|
/* Verify signal delivery came from child (seccomp-triggered). */
|
||||||
EXPECT_EQ(child_pid, info.si_pid);
|
EXPECT_EQ(child_pid, info.si_pid);
|
||||||
|
|
||||||
/* Interrupt poll with SIGSTOP (which we'll need to handle). */
|
/* Interrupt nanosleep with SIGSTOP (which we'll need to handle). */
|
||||||
ASSERT_EQ(0, kill(child_pid, SIGSTOP));
|
ASSERT_EQ(0, kill(child_pid, SIGSTOP));
|
||||||
ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
|
ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
|
||||||
ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
|
ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
|
||||||
|
@ -2110,7 +2152,7 @@ TEST(syscall_restart)
|
||||||
ASSERT_EQ(0, ptrace(PTRACE_GETSIGINFO, child_pid, NULL, &info));
|
ASSERT_EQ(0, ptrace(PTRACE_GETSIGINFO, child_pid, NULL, &info));
|
||||||
EXPECT_EQ(getpid(), info.si_pid);
|
EXPECT_EQ(getpid(), info.si_pid);
|
||||||
|
|
||||||
/* Restart poll with SIGCONT, which triggers restart_syscall. */
|
/* Restart nanosleep with SIGCONT, which triggers restart_syscall. */
|
||||||
ASSERT_EQ(0, kill(child_pid, SIGCONT));
|
ASSERT_EQ(0, kill(child_pid, SIGCONT));
|
||||||
ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
|
ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
|
||||||
ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
|
ASSERT_EQ(child_pid, waitpid(child_pid, &status, 0));
|
||||||
|
@ -2124,16 +2166,25 @@ TEST(syscall_restart)
|
||||||
ASSERT_EQ(SIGTRAP, WSTOPSIG(status));
|
ASSERT_EQ(SIGTRAP, WSTOPSIG(status));
|
||||||
ASSERT_EQ(PTRACE_EVENT_SECCOMP, (status >> 16));
|
ASSERT_EQ(PTRACE_EVENT_SECCOMP, (status >> 16));
|
||||||
ASSERT_EQ(0, ptrace(PTRACE_GETEVENTMSG, child_pid, NULL, &msg));
|
ASSERT_EQ(0, ptrace(PTRACE_GETEVENTMSG, child_pid, NULL, &msg));
|
||||||
|
|
||||||
ASSERT_EQ(0x200, msg);
|
ASSERT_EQ(0x200, msg);
|
||||||
ret = get_syscall(_metadata, child_pid);
|
ret = get_syscall(_metadata, child_pid);
|
||||||
#if defined(__arm__)
|
#if defined(__arm__)
|
||||||
/* FIXME: ARM does not expose true syscall in registers. */
|
/*
|
||||||
EXPECT_EQ(__NR_poll, ret);
|
* FIXME:
|
||||||
#else
|
* - native ARM registers do NOT expose true syscall.
|
||||||
EXPECT_EQ(__NR_restart_syscall, ret);
|
* - compat ARM registers on ARM64 DO expose true syscall.
|
||||||
|
*/
|
||||||
|
ASSERT_EQ(0, uname(&utsbuf));
|
||||||
|
if (strncmp(utsbuf.machine, "arm", 3) == 0) {
|
||||||
|
EXPECT_EQ(__NR_nanosleep, ret);
|
||||||
|
} else
|
||||||
#endif
|
#endif
|
||||||
|
{
|
||||||
|
EXPECT_EQ(__NR_restart_syscall, ret);
|
||||||
|
}
|
||||||
|
|
||||||
/* Write again to end poll. */
|
/* Write again to end test. */
|
||||||
ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
|
ASSERT_EQ(0, ptrace(PTRACE_CONT, child_pid, NULL, 0));
|
||||||
ASSERT_EQ(1, write(pipefd[1], "!", 1));
|
ASSERT_EQ(1, write(pipefd[1], "!", 1));
|
||||||
EXPECT_EQ(0, close(pipefd[1]));
|
EXPECT_EQ(0, close(pipefd[1]));
|
||||||
|
|
0
tools/testing/selftests/static_keys/test_static_keys.sh
Normal file → Executable file
0
tools/testing/selftests/static_keys/test_static_keys.sh
Normal file → Executable file
|
@ -19,6 +19,7 @@
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
|
@ -20,13 +20,26 @@ done < /proc/meminfo
|
||||||
if [ -n "$freepgs" ] && [ -n "$pgsize" ]; then
|
if [ -n "$freepgs" ] && [ -n "$pgsize" ]; then
|
||||||
nr_hugepgs=`cat /proc/sys/vm/nr_hugepages`
|
nr_hugepgs=`cat /proc/sys/vm/nr_hugepages`
|
||||||
needpgs=`expr $needmem / $pgsize`
|
needpgs=`expr $needmem / $pgsize`
|
||||||
if [ $freepgs -lt $needpgs ]; then
|
tries=2
|
||||||
|
while [ $tries -gt 0 ] && [ $freepgs -lt $needpgs ]; do
|
||||||
lackpgs=$(( $needpgs - $freepgs ))
|
lackpgs=$(( $needpgs - $freepgs ))
|
||||||
|
echo 3 > /proc/sys/vm/drop_caches
|
||||||
echo $(( $lackpgs + $nr_hugepgs )) > /proc/sys/vm/nr_hugepages
|
echo $(( $lackpgs + $nr_hugepgs )) > /proc/sys/vm/nr_hugepages
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
echo "Please run this test as root"
|
echo "Please run this test as root"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
while read name size unit; do
|
||||||
|
if [ "$name" = "HugePages_Free:" ]; then
|
||||||
|
freepgs=$size
|
||||||
|
fi
|
||||||
|
done < /proc/meminfo
|
||||||
|
tries=$((tries - 1))
|
||||||
|
done
|
||||||
|
if [ $freepgs -lt $needpgs ]; then
|
||||||
|
printf "Not enough huge pages available (%d < %d)\n" \
|
||||||
|
$freepgs $needpgs
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo "no hugetlbfs support in kernel?"
|
echo "no hugetlbfs support in kernel?"
|
||||||
|
|
Loading…
Add table
Reference in a new issue