diff options
author | Arthur She <arthur.she@linaro.org> | 2014-09-18 11:06:12 -0700 |
---|---|---|
committer | Arthur She <arthur.she@linaro.org> | 2014-09-18 11:06:12 -0700 |
commit | dbb5bc6a61eff1f9cd72c597b4d3a4b0d4411f04 (patch) | |
tree | 4b825dc642cb6eb9a060e54bf8d69288fbee4904 | |
parent | 095e64f00a2f694a8ec46f05665b16b269c69758 (diff) |
Update to 0db49b72bce26341274b74fd968501489a361ae3 from repo http://git.linaro.org/kernel/linux-linaro-tracking.git branch master0db49b72bce26341274b74fd968501489a361ae3
221 files changed, 0 insertions, 14487 deletions
diff --git a/Makefile b/Makefile deleted file mode 100644 index e66e710..0000000 --- a/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -TARGETS = breakpoints -TARGETS += cpu-hotplug -TARGETS += efivarfs -TARGETS += kcmp -TARGETS += memory-hotplug -TARGETS += mqueue -TARGETS += net -TARGETS += ptrace -TARGETS += timers -TARGETS += vm -TARGETS += powerpc -TARGETS += user -TARGETS += sysctl - -all: - for TARGET in $(TARGETS); do \ - make -C $$TARGET; \ - done; - -run_tests: all - for TARGET in $(TARGETS); do \ - make -C $$TARGET run_tests; \ - done; - -clean: - for TARGET in $(TARGETS); do \ - make -C $$TARGET clean; \ - done; diff --git a/README.txt b/README.txt deleted file mode 100644 index 5e2faf9..0000000 --- a/README.txt +++ /dev/null @@ -1,42 +0,0 @@ -Linux Kernel Selftests - -The kernel contains a set of "self tests" under the tools/testing/selftests/ -directory. These are intended to be small unit tests to exercise individual -code paths in the kernel. - -Running the selftests -===================== - -To build the tests: - - $ make -C tools/testing/selftests - - -To run the tests: - - $ make -C tools/testing/selftests run_tests - -- note that some tests will require root privileges. - - -To run only tests targetted for a single subsystem: - - $ make -C tools/testing/selftests TARGETS=cpu-hotplug run_tests - -See the top-level tools/testing/selftests/Makefile for the list of all possible -targets. - - -Contributing new tests -====================== - -In general, the rules for for selftests are - - * Do as much as you can if you're not root; - - * Don't take too long; - - * Don't break the build on any architecture, and - - * Don't cause the top-level "make run_tests" to fail if your feature is - unconfigured. diff --git a/breakpoints/Makefile b/breakpoints/Makefile deleted file mode 100644 index e18b42b..0000000 --- a/breakpoints/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -# Taken from perf makefile -uname_M := $(shell uname -m 2>/dev/null || echo not) -ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/i386/) -ifeq ($(ARCH),i386) - ARCH := x86 -endif -ifeq ($(ARCH),x86_64) - ARCH := x86 -endif - - -all: -ifeq ($(ARCH),x86) - gcc breakpoint_test.c -o breakpoint_test -else - echo "Not an x86 target, can't build breakpoints selftests" -endif - -run_tests: - @./breakpoint_test || echo "breakpoints selftests: [FAIL]" - -clean: - rm -fr breakpoint_test diff --git a/breakpoints/breakpoint_test.c b/breakpoints/breakpoint_test.c deleted file mode 100644 index a0743f3..0000000 --- a/breakpoints/breakpoint_test.c +++ /dev/null @@ -1,394 +0,0 @@ -/* - * Copyright (C) 2011 Red Hat, Inc., Frederic Weisbecker <fweisbec@redhat.com> - * - * Licensed under the terms of the GNU GPL License version 2 - * - * Selftests for breakpoints (and more generally the do_debug() path) in x86. - */ - - -#include <sys/ptrace.h> -#include <unistd.h> -#include <stddef.h> -#include <sys/user.h> -#include <stdio.h> -#include <stdlib.h> -#include <signal.h> -#include <sys/types.h> -#include <sys/wait.h> - - -/* Breakpoint access modes */ -enum { - BP_X = 1, - BP_RW = 2, - BP_W = 4, -}; - -static pid_t child_pid; - -/* - * Ensures the child and parent are always "talking" about - * the same test sequence. (ie: that we haven't forgotten - * to call check_trapped() somewhere). - */ -static int nr_tests; - -static void set_breakpoint_addr(void *addr, int n) -{ - int ret; - - ret = ptrace(PTRACE_POKEUSER, child_pid, - offsetof(struct user, u_debugreg[n]), addr); - if (ret) { - perror("Can't set breakpoint addr\n"); - exit(-1); - } -} - -static void toggle_breakpoint(int n, int type, int len, - int local, int global, int set) -{ - int ret; - - int xtype, xlen; - unsigned long vdr7, dr7; - - switch (type) { - case BP_X: - xtype = 0; - break; - case BP_W: - xtype = 1; - break; - case BP_RW: - xtype = 3; - break; - } - - switch (len) { - case 1: - xlen = 0; - break; - case 2: - xlen = 4; - break; - case 4: - xlen = 0xc; - break; - case 8: - xlen = 8; - break; - } - - dr7 = ptrace(PTRACE_PEEKUSER, child_pid, - offsetof(struct user, u_debugreg[7]), 0); - - vdr7 = (xlen | xtype) << 16; - vdr7 <<= 4 * n; - - if (local) { - vdr7 |= 1 << (2 * n); - vdr7 |= 1 << 8; - } - if (global) { - vdr7 |= 2 << (2 * n); - vdr7 |= 1 << 9; - } - - if (set) - dr7 |= vdr7; - else - dr7 &= ~vdr7; - - ret = ptrace(PTRACE_POKEUSER, child_pid, - offsetof(struct user, u_debugreg[7]), dr7); - if (ret) { - perror("Can't set dr7"); - exit(-1); - } -} - -/* Dummy variables to test read/write accesses */ -static unsigned long long dummy_var[4]; - -/* Dummy functions to test execution accesses */ -static void dummy_func(void) { } -static void dummy_func1(void) { } -static void dummy_func2(void) { } -static void dummy_func3(void) { } - -static void (*dummy_funcs[])(void) = { - dummy_func, - dummy_func1, - dummy_func2, - dummy_func3, -}; - -static int trapped; - -static void check_trapped(void) -{ - /* - * If we haven't trapped, wake up the parent - * so that it notices the failure. - */ - if (!trapped) - kill(getpid(), SIGUSR1); - trapped = 0; - - nr_tests++; -} - -static void write_var(int len) -{ - char *pcval; short *psval; int *pival; long long *plval; - int i; - - for (i = 0; i < 4; i++) { - switch (len) { - case 1: - pcval = (char *)&dummy_var[i]; - *pcval = 0xff; - break; - case 2: - psval = (short *)&dummy_var[i]; - *psval = 0xffff; - break; - case 4: - pival = (int *)&dummy_var[i]; - *pival = 0xffffffff; - break; - case 8: - plval = (long long *)&dummy_var[i]; - *plval = 0xffffffffffffffffLL; - break; - } - check_trapped(); - } -} - -static void read_var(int len) -{ - char cval; short sval; int ival; long long lval; - int i; - - for (i = 0; i < 4; i++) { - switch (len) { - case 1: - cval = *(char *)&dummy_var[i]; - break; - case 2: - sval = *(short *)&dummy_var[i]; - break; - case 4: - ival = *(int *)&dummy_var[i]; - break; - case 8: - lval = *(long long *)&dummy_var[i]; - break; - } - check_trapped(); - } -} - -/* - * Do the r/w/x accesses to trigger the breakpoints. And run - * the usual traps. - */ -static void trigger_tests(void) -{ - int len, local, global, i; - char val; - int ret; - - ret = ptrace(PTRACE_TRACEME, 0, NULL, 0); - if (ret) { - perror("Can't be traced?\n"); - return; - } - - /* Wake up father so that it sets up the first test */ - kill(getpid(), SIGUSR1); - - /* Test instruction breakpoints */ - for (local = 0; local < 2; local++) { - for (global = 0; global < 2; global++) { - if (!local && !global) - continue; - - for (i = 0; i < 4; i++) { - dummy_funcs[i](); - check_trapped(); - } - } - } - - /* Test write watchpoints */ - for (len = 1; len <= sizeof(long); len <<= 1) { - for (local = 0; local < 2; local++) { - for (global = 0; global < 2; global++) { - if (!local && !global) - continue; - write_var(len); - } - } - } - - /* Test read/write watchpoints (on read accesses) */ - for (len = 1; len <= sizeof(long); len <<= 1) { - for (local = 0; local < 2; local++) { - for (global = 0; global < 2; global++) { - if (!local && !global) - continue; - read_var(len); - } - } - } - - /* Icebp trap */ - asm(".byte 0xf1\n"); - check_trapped(); - - /* Int 3 trap */ - asm("int $3\n"); - check_trapped(); - - kill(getpid(), SIGUSR1); -} - -static void check_success(const char *msg) -{ - const char *msg2; - int child_nr_tests; - int status; - - /* Wait for the child to SIGTRAP */ - wait(&status); - - msg2 = "Failed"; - - if (WSTOPSIG(status) == SIGTRAP) { - child_nr_tests = ptrace(PTRACE_PEEKDATA, child_pid, - &nr_tests, 0); - if (child_nr_tests == nr_tests) - msg2 = "Ok"; - if (ptrace(PTRACE_POKEDATA, child_pid, &trapped, 1)) { - perror("Can't poke\n"); - exit(-1); - } - } - - nr_tests++; - - printf("%s [%s]\n", msg, msg2); -} - -static void launch_instruction_breakpoints(char *buf, int local, int global) -{ - int i; - - for (i = 0; i < 4; i++) { - set_breakpoint_addr(dummy_funcs[i], i); - toggle_breakpoint(i, BP_X, 1, local, global, 1); - ptrace(PTRACE_CONT, child_pid, NULL, 0); - sprintf(buf, "Test breakpoint %d with local: %d global: %d", - i, local, global); - check_success(buf); - toggle_breakpoint(i, BP_X, 1, local, global, 0); - } -} - -static void launch_watchpoints(char *buf, int mode, int len, - int local, int global) -{ - const char *mode_str; - int i; - - if (mode == BP_W) - mode_str = "write"; - else - mode_str = "read"; - - for (i = 0; i < 4; i++) { - set_breakpoint_addr(&dummy_var[i], i); - toggle_breakpoint(i, mode, len, local, global, 1); - ptrace(PTRACE_CONT, child_pid, NULL, 0); - sprintf(buf, "Test %s watchpoint %d with len: %d local: " - "%d global: %d", mode_str, i, len, local, global); - check_success(buf); - toggle_breakpoint(i, mode, len, local, global, 0); - } -} - -/* Set the breakpoints and check the child successfully trigger them */ -static void launch_tests(void) -{ - char buf[1024]; - int len, local, global, i; - - /* Instruction breakpoints */ - for (local = 0; local < 2; local++) { - for (global = 0; global < 2; global++) { - if (!local && !global) - continue; - launch_instruction_breakpoints(buf, local, global); - } - } - - /* Write watchpoint */ - for (len = 1; len <= sizeof(long); len <<= 1) { - for (local = 0; local < 2; local++) { - for (global = 0; global < 2; global++) { - if (!local && !global) - continue; - launch_watchpoints(buf, BP_W, len, - local, global); - } - } - } - - /* Read-Write watchpoint */ - for (len = 1; len <= sizeof(long); len <<= 1) { - for (local = 0; local < 2; local++) { - for (global = 0; global < 2; global++) { - if (!local && !global) - continue; - launch_watchpoints(buf, BP_RW, len, - local, global); - } - } - } - - /* Icebp traps */ - ptrace(PTRACE_CONT, child_pid, NULL, 0); - check_success("Test icebp"); - - /* Int 3 traps */ - ptrace(PTRACE_CONT, child_pid, NULL, 0); - check_success("Test int 3 trap"); - - ptrace(PTRACE_CONT, child_pid, NULL, 0); -} - -int main(int argc, char **argv) -{ - pid_t pid; - int ret; - - pid = fork(); - if (!pid) { - trigger_tests(); - return 0; - } - - child_pid = pid; - - wait(NULL); - - launch_tests(); - - wait(NULL); - - return 0; -} diff --git a/cpu-hotplug/Makefile b/cpu-hotplug/Makefile deleted file mode 100644 index 790c23a..0000000 --- a/cpu-hotplug/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -all: - -run_tests: - @/bin/bash ./on-off-test.sh || echo "cpu-hotplug selftests: [FAIL]" - -clean: diff --git a/cpu-hotplug/on-off-test.sh b/cpu-hotplug/on-off-test.sh deleted file mode 100644 index bdde7cf..0000000 --- a/cpu-hotplug/on-off-test.sh +++ /dev/null @@ -1,221 +0,0 @@ -#!/bin/bash - -SYSFS= - -prerequisite() -{ - msg="skip all tests:" - - if [ $UID != 0 ]; then - echo $msg must be run as root >&2 - exit 0 - fi - - SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'` - - if [ ! -d "$SYSFS" ]; then - echo $msg sysfs is not mounted >&2 - exit 0 - fi - - if ! ls $SYSFS/devices/system/cpu/cpu* > /dev/null 2>&1; then - echo $msg cpu hotplug is not supported >&2 - exit 0 - fi -} - -# -# list all hot-pluggable CPUs -# -hotpluggable_cpus() -{ - local state=${1:-.\*} - - for cpu in $SYSFS/devices/system/cpu/cpu*; do - if [ -f $cpu/online ] && grep -q $state $cpu/online; then - echo ${cpu##/*/cpu} - fi - done -} - -hotplaggable_offline_cpus() -{ - hotpluggable_cpus 0 -} - -hotpluggable_online_cpus() -{ - hotpluggable_cpus 1 -} - -cpu_is_online() -{ - grep -q 1 $SYSFS/devices/system/cpu/cpu$1/online -} - -cpu_is_offline() -{ - grep -q 0 $SYSFS/devices/system/cpu/cpu$1/online -} - -online_cpu() -{ - echo 1 > $SYSFS/devices/system/cpu/cpu$1/online -} - -offline_cpu() -{ - echo 0 > $SYSFS/devices/system/cpu/cpu$1/online -} - -online_cpu_expect_success() -{ - local cpu=$1 - - if ! online_cpu $cpu; then - echo $FUNCNAME $cpu: unexpected fail >&2 - elif ! cpu_is_online $cpu; then - echo $FUNCNAME $cpu: unexpected offline >&2 - fi -} - -online_cpu_expect_fail() -{ - local cpu=$1 - - if online_cpu $cpu 2> /dev/null; then - echo $FUNCNAME $cpu: unexpected success >&2 - elif ! cpu_is_offline $cpu; then - echo $FUNCNAME $cpu: unexpected online >&2 - fi -} - -offline_cpu_expect_success() -{ - local cpu=$1 - - if ! offline_cpu $cpu; then - echo $FUNCNAME $cpu: unexpected fail >&2 - elif ! cpu_is_offline $cpu; then - echo $FUNCNAME $cpu: unexpected offline >&2 - fi -} - -offline_cpu_expect_fail() -{ - local cpu=$1 - - if offline_cpu $cpu 2> /dev/null; then - echo $FUNCNAME $cpu: unexpected success >&2 - elif ! cpu_is_online $cpu; then - echo $FUNCNAME $cpu: unexpected offline >&2 - fi -} - -error=-12 -priority=0 - -while getopts e:hp: opt; do - case $opt in - e) - error=$OPTARG - ;; - h) - echo "Usage $0 [ -e errno ] [ -p notifier-priority ]" - exit - ;; - p) - priority=$OPTARG - ;; - esac -done - -if ! [ "$error" -ge -4095 -a "$error" -lt 0 ]; then - echo "error code must be -4095 <= errno < 0" >&2 - exit 1 -fi - -prerequisite - -# -# Online all hot-pluggable CPUs -# -for cpu in `hotplaggable_offline_cpus`; do - online_cpu_expect_success $cpu -done - -# -# Offline all hot-pluggable CPUs -# -for cpu in `hotpluggable_online_cpus`; do - offline_cpu_expect_success $cpu -done - -# -# Online all hot-pluggable CPUs again -# -for cpu in `hotplaggable_offline_cpus`; do - online_cpu_expect_success $cpu -done - -# -# Test with cpu notifier error injection -# - -DEBUGFS=`mount -t debugfs | head -1 | awk '{ print $3 }'` -NOTIFIER_ERR_INJECT_DIR=$DEBUGFS/notifier-error-inject/cpu - -prerequisite_extra() -{ - msg="skip extra tests:" - - /sbin/modprobe -q -r cpu-notifier-error-inject - /sbin/modprobe -q cpu-notifier-error-inject priority=$priority - - if [ ! -d "$DEBUGFS" ]; then - echo $msg debugfs is not mounted >&2 - exit 0 - fi - - if [ ! -d $NOTIFIER_ERR_INJECT_DIR ]; then - echo $msg cpu-notifier-error-inject module is not available >&2 - exit 0 - fi -} - -prerequisite_extra - -# -# Offline all hot-pluggable CPUs -# -echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/CPU_DOWN_PREPARE/error -for cpu in `hotpluggable_online_cpus`; do - offline_cpu_expect_success $cpu -done - -# -# Test CPU hot-add error handling (offline => online) -# -echo $error > $NOTIFIER_ERR_INJECT_DIR/actions/CPU_UP_PREPARE/error -for cpu in `hotplaggable_offline_cpus`; do - online_cpu_expect_fail $cpu -done - -# -# Online all hot-pluggable CPUs -# -echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/CPU_UP_PREPARE/error -for cpu in `hotplaggable_offline_cpus`; do - online_cpu_expect_success $cpu -done - -# -# Test CPU hot-remove error handling (online => offline) -# -echo $error > $NOTIFIER_ERR_INJECT_DIR/actions/CPU_DOWN_PREPARE/error -for cpu in `hotpluggable_online_cpus`; do - offline_cpu_expect_fail $cpu -done - -echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/CPU_DOWN_PREPARE/error -/sbin/modprobe -q -r cpu-notifier-error-inject diff --git a/efivarfs/Makefile b/efivarfs/Makefile deleted file mode 100644 index 29e8c6b..0000000 --- a/efivarfs/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -CC = $(CROSS_COMPILE)gcc -CFLAGS = -Wall - -test_objs = open-unlink create-read - -all: $(test_objs) - -run_tests: all - @/bin/bash ./efivarfs.sh || echo "efivarfs selftests: [FAIL]" - -clean: - rm -f $(test_objs) diff --git a/efivarfs/create-read.c b/efivarfs/create-read.c deleted file mode 100644 index 7feef18..0000000 --- a/efivarfs/create-read.c +++ /dev/null @@ -1,38 +0,0 @@ -#include <stdio.h> -#include <stdint.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <errno.h> -#include <string.h> - -int main(int argc, char **argv) -{ - const char *path; - char buf[4]; - int fd, rc; - - if (argc < 2) { - fprintf(stderr, "usage: %s <path>\n", argv[0]); - return EXIT_FAILURE; - } - - path = argv[1]; - - /* create a test variable */ - fd = open(path, O_RDWR | O_CREAT, 0600); - if (fd < 0) { - perror("open(O_WRONLY)"); - return EXIT_FAILURE; - } - - rc = read(fd, buf, sizeof(buf)); - if (rc != 0) { - fprintf(stderr, "Reading a new var should return EOF\n"); - return EXIT_FAILURE; - } - - return EXIT_SUCCESS; -} diff --git a/efivarfs/efivarfs.sh b/efivarfs/efivarfs.sh deleted file mode 100644 index 77edcdc..0000000 --- a/efivarfs/efivarfs.sh +++ /dev/null @@ -1,198 +0,0 @@ -#!/bin/bash - -efivarfs_mount=/sys/firmware/efi/efivars -test_guid=210be57c-9849-4fc7-a635-e6382d1aec27 - -check_prereqs() -{ - local msg="skip all tests:" - - if [ $UID != 0 ]; then - echo $msg must be run as root >&2 - exit 0 - fi - - if ! grep -q "^\S\+ $efivarfs_mount efivarfs" /proc/mounts; then - echo $msg efivarfs is not mounted on $efivarfs_mount >&2 - exit 0 - fi -} - -run_test() -{ - local test="$1" - - echo "--------------------" - echo "running $test" - echo "--------------------" - - if [ "$(type -t $test)" = 'function' ]; then - ( $test ) - else - ( ./$test ) - fi - - if [ $? -ne 0 ]; then - echo " [FAIL]" - rc=1 - else - echo " [PASS]" - fi -} - -test_create() -{ - local attrs='\x07\x00\x00\x00' - local file=$efivarfs_mount/$FUNCNAME-$test_guid - - printf "$attrs\x00" > $file - - if [ ! -e $file ]; then - echo "$file couldn't be created" >&2 - exit 1 - fi - - if [ $(stat -c %s $file) -ne 5 ]; then - echo "$file has invalid size" >&2 - exit 1 - fi -} - -test_create_empty() -{ - local file=$efivarfs_mount/$FUNCNAME-$test_guid - - : > $file - - if [ ! -e $file ]; then - echo "$file can not be created without writing" >&2 - exit 1 - fi -} - -test_create_read() -{ - local file=$efivarfs_mount/$FUNCNAME-$test_guid - ./create-read $file -} - -test_delete() -{ - local attrs='\x07\x00\x00\x00' - local file=$efivarfs_mount/$FUNCNAME-$test_guid - - printf "$attrs\x00" > $file - - if [ ! -e $file ]; then - echo "$file couldn't be created" >&2 - exit 1 - fi - - rm $file - - if [ -e $file ]; then - echo "$file couldn't be deleted" >&2 - exit 1 - fi - -} - -# test that we can remove a variable by issuing a write with only -# attributes specified -test_zero_size_delete() -{ - local attrs='\x07\x00\x00\x00' - local file=$efivarfs_mount/$FUNCNAME-$test_guid - - printf "$attrs\x00" > $file - - if [ ! -e $file ]; then - echo "$file does not exist" >&2 - exit 1 - fi - - printf "$attrs" > $file - - if [ -e $file ]; then - echo "$file should have been deleted" >&2 - exit 1 - fi -} - -test_open_unlink() -{ - local file=$efivarfs_mount/$FUNCNAME-$test_guid - ./open-unlink $file -} - -# test that we can create a range of filenames -test_valid_filenames() -{ - local attrs='\x07\x00\x00\x00' - local ret=0 - - local file_list="abc dump-type0-11-1-1362436005 1234 -" - for f in $file_list; do - local file=$efivarfs_mount/$f-$test_guid - - printf "$attrs\x00" > $file - - if [ ! -e $file ]; then - echo "$file could not be created" >&2 - ret=1 - else - rm $file - fi - done - - exit $ret -} - -test_invalid_filenames() -{ - local attrs='\x07\x00\x00\x00' - local ret=0 - - local file_list=" - -1234-1234-1234-123456789abc - foo - foo-bar - -foo- - foo-barbazba-foob-foob-foob-foobarbazfoo - foo------------------------------------- - -12345678-1234-1234-1234-123456789abc - a-12345678=1234-1234-1234-123456789abc - a-12345678-1234=1234-1234-123456789abc - a-12345678-1234-1234=1234-123456789abc - a-12345678-1234-1234-1234=123456789abc - 1112345678-1234-1234-1234-123456789abc" - - for f in $file_list; do - local file=$efivarfs_mount/$f - - printf "$attrs\x00" 2>/dev/null > $file - - if [ -e $file ]; then - echo "Creating $file should have failed" >&2 - rm $file - ret=1 - fi - done - - exit $ret -} - -check_prereqs - -rc=0 - -run_test test_create -run_test test_create_empty -run_test test_create_read -run_test test_delete -run_test test_zero_size_delete -run_test test_open_unlink -run_test test_valid_filenames -run_test test_invalid_filenames - -exit $rc diff --git a/efivarfs/open-unlink.c b/efivarfs/open-unlink.c deleted file mode 100644 index 8c07644..0000000 --- a/efivarfs/open-unlink.c +++ /dev/null @@ -1,63 +0,0 @@ -#include <stdio.h> -#include <stdint.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> - -int main(int argc, char **argv) -{ - const char *path; - char buf[5]; - int fd, rc; - - if (argc < 2) { - fprintf(stderr, "usage: %s <path>\n", argv[0]); - return EXIT_FAILURE; - } - - path = argv[1]; - - /* attributes: EFI_VARIABLE_NON_VOLATILE | - * EFI_VARIABLE_BOOTSERVICE_ACCESS | - * EFI_VARIABLE_RUNTIME_ACCESS - */ - *(uint32_t *)buf = 0x7; - buf[4] = 0; - - /* create a test variable */ - fd = open(path, O_WRONLY | O_CREAT); - if (fd < 0) { - perror("open(O_WRONLY)"); - return EXIT_FAILURE; - } - - rc = write(fd, buf, sizeof(buf)); - if (rc != sizeof(buf)) { - perror("write"); - return EXIT_FAILURE; - } - - close(fd); - - fd = open(path, O_RDONLY); - if (fd < 0) { - perror("open"); - return EXIT_FAILURE; - } - - if (unlink(path) < 0) { - perror("unlink"); - return EXIT_FAILURE; - } - - rc = read(fd, buf, sizeof(buf)); - if (rc > 0) { - fprintf(stderr, "reading from an unlinked variable " - "shouldn't be possible\n"); - return EXIT_FAILURE; - } - - return EXIT_SUCCESS; -} diff --git a/ipc/Makefile b/ipc/Makefile deleted file mode 100644 index 5386fd7..0000000 --- a/ipc/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -uname_M := $(shell uname -m 2>/dev/null || echo not) -ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/i386/) -ifeq ($(ARCH),i386) - ARCH := X86 - CFLAGS := -DCONFIG_X86_32 -D__i386__ -endif -ifeq ($(ARCH),x86_64) - ARCH := X86 - CFLAGS := -DCONFIG_X86_64 -D__x86_64__ -endif - -CFLAGS += -I../../../../usr/include/ - -all: -ifeq ($(ARCH),X86) - gcc $(CFLAGS) msgque.c -o msgque_test -else - echo "Not an x86 target, can't build msgque selftest" -endif - -run_tests: all - ./msgque_test - -clean: - rm -fr ./msgque_test diff --git a/ipc/msgque.c b/ipc/msgque.c deleted file mode 100644 index 552f081..0000000 --- a/ipc/msgque.c +++ /dev/null @@ -1,252 +0,0 @@ -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <errno.h> -#include <linux/msg.h> -#include <fcntl.h> - -#define MAX_MSG_SIZE 32 - -struct msg1 { - int msize; - long mtype; - char mtext[MAX_MSG_SIZE]; -}; - -#define TEST_STRING "Test sysv5 msg" -#define MSG_TYPE 1 - -#define ANOTHER_TEST_STRING "Yet another test sysv5 msg" -#define ANOTHER_MSG_TYPE 26538 - -struct msgque_data { - key_t key; - int msq_id; - int qbytes; - int qnum; - int mode; - struct msg1 *messages; -}; - -int restore_queue(struct msgque_data *msgque) -{ - int fd, ret, id, i; - char buf[32]; - - fd = open("/proc/sys/kernel/msg_next_id", O_WRONLY); - if (fd == -1) { - printf("Failed to open /proc/sys/kernel/msg_next_id\n"); - return -errno; - } - sprintf(buf, "%d", msgque->msq_id); - - ret = write(fd, buf, strlen(buf)); - if (ret != strlen(buf)) { - printf("Failed to write to /proc/sys/kernel/msg_next_id\n"); - return -errno; - } - - id = msgget(msgque->key, msgque->mode | IPC_CREAT | IPC_EXCL); - if (id == -1) { - printf("Failed to create queue\n"); - return -errno; - } - - if (id != msgque->msq_id) { - printf("Restored queue has wrong id (%d instead of %d)\n", - id, msgque->msq_id); - ret = -EFAULT; - goto destroy; - } - - for (i = 0; i < msgque->qnum; i++) { - if (msgsnd(msgque->msq_id, &msgque->messages[i].mtype, - msgque->messages[i].msize, IPC_NOWAIT) != 0) { - printf("msgsnd failed (%m)\n"); - ret = -errno; - goto destroy; - }; - } - return 0; - -destroy: - if (msgctl(id, IPC_RMID, 0)) - printf("Failed to destroy queue: %d\n", -errno); - return ret; -} - -int check_and_destroy_queue(struct msgque_data *msgque) -{ - struct msg1 message; - int cnt = 0, ret; - - while (1) { - ret = msgrcv(msgque->msq_id, &message.mtype, MAX_MSG_SIZE, - 0, IPC_NOWAIT); - if (ret < 0) { - if (errno == ENOMSG) - break; - printf("Failed to read IPC message: %m\n"); - ret = -errno; - goto err; - } - if (ret != msgque->messages[cnt].msize) { - printf("Wrong message size: %d (expected %d)\n", ret, - msgque->messages[cnt].msize); - ret = -EINVAL; - goto err; - } - if (message.mtype != msgque->messages[cnt].mtype) { - printf("Wrong message type\n"); - ret = -EINVAL; - goto err; - } - if (memcmp(message.mtext, msgque->messages[cnt].mtext, ret)) { - printf("Wrong message content\n"); - ret = -EINVAL; - goto err; - } - cnt++; - } - - if (cnt != msgque->qnum) { - printf("Wrong message number\n"); - ret = -EINVAL; - goto err; - } - - ret = 0; -err: - if (msgctl(msgque->msq_id, IPC_RMID, 0)) { - printf("Failed to destroy queue: %d\n", -errno); - return -errno; - } - return ret; -} - -int dump_queue(struct msgque_data *msgque) -{ - struct msqid64_ds ds; - int kern_id; - int i, ret; - - for (kern_id = 0; kern_id < 256; kern_id++) { - ret = msgctl(kern_id, MSG_STAT, &ds); - if (ret < 0) { - if (errno == -EINVAL) - continue; - printf("Failed to get stats for IPC queue with id %d\n", - kern_id); - return -errno; - } - - if (ret == msgque->msq_id) - break; - } - - msgque->messages = malloc(sizeof(struct msg1) * ds.msg_qnum); - if (msgque->messages == NULL) { - printf("Failed to get stats for IPC queue\n"); - return -ENOMEM; - } - - msgque->qnum = ds.msg_qnum; - msgque->mode = ds.msg_perm.mode; - msgque->qbytes = ds.msg_qbytes; - - for (i = 0; i < msgque->qnum; i++) { - ret = msgrcv(msgque->msq_id, &msgque->messages[i].mtype, - MAX_MSG_SIZE, i, IPC_NOWAIT | MSG_COPY); - if (ret < 0) { - printf("Failed to copy IPC message: %m (%d)\n", errno); - return -errno; - } - msgque->messages[i].msize = ret; - } - return 0; -} - -int fill_msgque(struct msgque_data *msgque) -{ - struct msg1 msgbuf; - - msgbuf.mtype = MSG_TYPE; - memcpy(msgbuf.mtext, TEST_STRING, sizeof(TEST_STRING)); - if (msgsnd(msgque->msq_id, &msgbuf.mtype, sizeof(TEST_STRING), - IPC_NOWAIT) != 0) { - printf("First message send failed (%m)\n"); - return -errno; - }; - - msgbuf.mtype = ANOTHER_MSG_TYPE; - memcpy(msgbuf.mtext, ANOTHER_TEST_STRING, sizeof(ANOTHER_TEST_STRING)); - if (msgsnd(msgque->msq_id, &msgbuf.mtype, sizeof(ANOTHER_TEST_STRING), - IPC_NOWAIT) != 0) { - printf("Second message send failed (%m)\n"); - return -errno; - }; - return 0; -} - -int main(int argc, char **argv) -{ - int msg, pid, err; - struct msgque_data msgque; - - if (getuid() != 0) { - printf("Please run the test as root - Exiting.\n"); - exit(1); - } - - msgque.key = ftok(argv[0], 822155650); - if (msgque.key == -1) { - printf("Can't make key\n"); - return -errno; - } - - msgque.msq_id = msgget(msgque.key, IPC_CREAT | IPC_EXCL | 0666); - if (msgque.msq_id == -1) { - err = -errno; - printf("Can't create queue\n"); - goto err_out; - } - - err = fill_msgque(&msgque); - if (err) { - printf("Failed to fill queue\n"); - goto err_destroy; - } - - err = dump_queue(&msgque); - if (err) { - printf("Failed to dump queue\n"); - goto err_destroy; - } - - err = check_and_destroy_queue(&msgque); - if (err) { - printf("Failed to check and destroy queue\n"); - goto err_out; - } - - err = restore_queue(&msgque); - if (err) { - printf("Failed to restore queue\n"); - goto err_destroy; - } - - err = check_and_destroy_queue(&msgque); - if (err) { - printf("Failed to test queue\n"); - goto err_out; - } - return 0; - -err_destroy: - if (msgctl(msgque.msq_id, IPC_RMID, 0)) { - printf("Failed to destroy queue: %d\n", -errno); - return -errno; - } -err_out: - return err; -} diff --git a/kcmp/.gitignore b/kcmp/.gitignore deleted file mode 100644 index 5a9b373..0000000 --- a/kcmp/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -kcmp_test -kcmp-test-file diff --git a/kcmp/Makefile b/kcmp/Makefile deleted file mode 100644 index d7d6bbe..0000000 --- a/kcmp/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -uname_M := $(shell uname -m 2>/dev/null || echo not) -ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/i386/) -ifeq ($(ARCH),i386) - ARCH := X86 - CFLAGS := -DCONFIG_X86_32 -D__i386__ -endif -ifeq ($(ARCH),x86_64) - ARCH := X86 - CFLAGS := -DCONFIG_X86_64 -D__x86_64__ -endif - -CFLAGS += -I../../../../arch/x86/include/generated/ -CFLAGS += -I../../../../include/ -CFLAGS += -I../../../../usr/include/ -CFLAGS += -I../../../../arch/x86/include/ - -all: -ifeq ($(ARCH),X86) - gcc $(CFLAGS) kcmp_test.c -o kcmp_test -else - echo "Not an x86 target, can't build kcmp selftest" -endif - -run_tests: all - @./kcmp_test || echo "kcmp_test: [FAIL]" - -clean: - $(RM) kcmp_test kcmp-test-file diff --git a/kcmp/kcmp_test.c b/kcmp/kcmp_test.c deleted file mode 100644 index fa4f1b3..0000000 --- a/kcmp/kcmp_test.c +++ /dev/null @@ -1,96 +0,0 @@ -#define _GNU_SOURCE - -#include <stdio.h> -#include <stdlib.h> -#include <signal.h> -#include <limits.h> -#include <unistd.h> -#include <errno.h> -#include <string.h> -#include <fcntl.h> - -#include <linux/unistd.h> -#include <linux/kcmp.h> - -#include <sys/syscall.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/wait.h> - -static long sys_kcmp(int pid1, int pid2, int type, int fd1, int fd2) -{ - return syscall(__NR_kcmp, pid1, pid2, type, fd1, fd2); -} - -int main(int argc, char **argv) -{ - const char kpath[] = "kcmp-test-file"; - int pid1, pid2; - int fd1, fd2; - int status; - - fd1 = open(kpath, O_RDWR | O_CREAT | O_TRUNC, 0644); - pid1 = getpid(); - - if (fd1 < 0) { - perror("Can't create file"); - exit(1); - } - - pid2 = fork(); - if (pid2 < 0) { - perror("fork failed"); - exit(1); - } - - if (!pid2) { - int pid2 = getpid(); - int ret; - - fd2 = open(kpath, O_RDWR, 0644); - if (fd2 < 0) { - perror("Can't open file"); - exit(1); - } - - /* An example of output and arguments */ - printf("pid1: %6d pid2: %6d FD: %2ld FILES: %2ld VM: %2ld " - "FS: %2ld SIGHAND: %2ld IO: %2ld SYSVSEM: %2ld " - "INV: %2ld\n", - pid1, pid2, - sys_kcmp(pid1, pid2, KCMP_FILE, fd1, fd2), - sys_kcmp(pid1, pid2, KCMP_FILES, 0, 0), - sys_kcmp(pid1, pid2, KCMP_VM, 0, 0), - sys_kcmp(pid1, pid2, KCMP_FS, 0, 0), - sys_kcmp(pid1, pid2, KCMP_SIGHAND, 0, 0), - sys_kcmp(pid1, pid2, KCMP_IO, 0, 0), - sys_kcmp(pid1, pid2, KCMP_SYSVSEM, 0, 0), - - /* This one should fail */ - sys_kcmp(pid1, pid2, KCMP_TYPES + 1, 0, 0)); - - /* This one should return same fd */ - ret = sys_kcmp(pid1, pid2, KCMP_FILE, fd1, fd1); - if (ret) { - printf("FAIL: 0 expected but %d returned (%s)\n", - ret, strerror(errno)); - ret = -1; - } else - printf("PASS: 0 returned as expected\n"); - - /* Compare with self */ - ret = sys_kcmp(pid1, pid1, KCMP_VM, 0, 0); - if (ret) { - printf("FAIL: 0 expected but %li returned (%s)\n", - ret, strerror(errno)); - ret = -1; - } else - printf("PASS: 0 returned as expected\n"); - - exit(ret); - } - - waitpid(pid2, &status, P_ALL); - - return 0; -} diff --git a/memory-hotplug/Makefile b/memory-hotplug/Makefile deleted file mode 100644 index 058c76f..0000000 --- a/memory-hotplug/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -all: - -run_tests: - @/bin/bash ./on-off-test.sh || echo "memory-hotplug selftests: [FAIL]" - -clean: diff --git a/memory-hotplug/on-off-test.sh b/memory-hotplug/on-off-test.sh deleted file mode 100644 index a2816f6..0000000 --- a/memory-hotplug/on-off-test.sh +++ /dev/null @@ -1,230 +0,0 @@ -#!/bin/bash - -SYSFS= - -prerequisite() -{ - msg="skip all tests:" - - if [ $UID != 0 ]; then - echo $msg must be run as root >&2 - exit 0 - fi - - SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'` - - if [ ! -d "$SYSFS" ]; then - echo $msg sysfs is not mounted >&2 - exit 0 - fi - - if ! ls $SYSFS/devices/system/memory/memory* > /dev/null 2>&1; then - echo $msg memory hotplug is not supported >&2 - exit 0 - fi -} - -# -# list all hot-pluggable memory -# -hotpluggable_memory() -{ - local state=${1:-.\*} - - for memory in $SYSFS/devices/system/memory/memory*; do - if grep -q 1 $memory/removable && - grep -q $state $memory/state; then - echo ${memory##/*/memory} - fi - done -} - -hotplaggable_offline_memory() -{ - hotpluggable_memory offline -} - -hotpluggable_online_memory() -{ - hotpluggable_memory online -} - -memory_is_online() -{ - grep -q online $SYSFS/devices/system/memory/memory$1/state -} - -memory_is_offline() -{ - grep -q offline $SYSFS/devices/system/memory/memory$1/state -} - -online_memory() -{ - echo online > $SYSFS/devices/system/memory/memory$1/state -} - -offline_memory() -{ - echo offline > $SYSFS/devices/system/memory/memory$1/state -} - -online_memory_expect_success() -{ - local memory=$1 - - if ! online_memory $memory; then - echo $FUNCNAME $memory: unexpected fail >&2 - elif ! memory_is_online $memory; then - echo $FUNCNAME $memory: unexpected offline >&2 - fi -} - -online_memory_expect_fail() -{ - local memory=$1 - - if online_memory $memory 2> /dev/null; then - echo $FUNCNAME $memory: unexpected success >&2 - elif ! memory_is_offline $memory; then - echo $FUNCNAME $memory: unexpected online >&2 - fi -} - -offline_memory_expect_success() -{ - local memory=$1 - - if ! offline_memory $memory; then - echo $FUNCNAME $memory: unexpected fail >&2 - elif ! memory_is_offline $memory; then - echo $FUNCNAME $memory: unexpected offline >&2 - fi -} - -offline_memory_expect_fail() -{ - local memory=$1 - - if offline_memory $memory 2> /dev/null; then - echo $FUNCNAME $memory: unexpected success >&2 - elif ! memory_is_online $memory; then - echo $FUNCNAME $memory: unexpected offline >&2 - fi -} - -error=-12 -priority=0 -ratio=10 - -while getopts e:hp:r: opt; do - case $opt in - e) - error=$OPTARG - ;; - h) - echo "Usage $0 [ -e errno ] [ -p notifier-priority ] [ -r percent-of-memory-to-offline ]" - exit - ;; - p) - priority=$OPTARG - ;; - r) - ratio=$OPTARG - ;; - esac -done - -if ! [ "$error" -ge -4095 -a "$error" -lt 0 ]; then - echo "error code must be -4095 <= errno < 0" >&2 - exit 1 -fi - -prerequisite - -# -# Online all hot-pluggable memory -# -for memory in `hotplaggable_offline_memory`; do - online_memory_expect_success $memory -done - -# -# Offline $ratio percent of hot-pluggable memory -# -for memory in `hotpluggable_online_memory`; do - if [ $((RANDOM % 100)) -lt $ratio ]; then - offline_memory_expect_success $memory - fi -done - -# -# Online all hot-pluggable memory again -# -for memory in `hotplaggable_offline_memory`; do - online_memory_expect_success $memory -done - -# -# Test with memory notifier error injection -# - -DEBUGFS=`mount -t debugfs | head -1 | awk '{ print $3 }'` -NOTIFIER_ERR_INJECT_DIR=$DEBUGFS/notifier-error-inject/memory - -prerequisite_extra() -{ - msg="skip extra tests:" - - /sbin/modprobe -q -r memory-notifier-error-inject - /sbin/modprobe -q memory-notifier-error-inject priority=$priority - - if [ ! -d "$DEBUGFS" ]; then - echo $msg debugfs is not mounted >&2 - exit 0 - fi - - if [ ! -d $NOTIFIER_ERR_INJECT_DIR ]; then - echo $msg memory-notifier-error-inject module is not available >&2 - exit 0 - fi -} - -prerequisite_extra - -# -# Offline $ratio percent of hot-pluggable memory -# -echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_OFFLINE/error -for memory in `hotpluggable_online_memory`; do - if [ $((RANDOM % 100)) -lt $ratio ]; then - offline_memory_expect_success $memory - fi -done - -# -# Test memory hot-add error handling (offline => online) -# -echo $error > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_ONLINE/error -for memory in `hotplaggable_offline_memory`; do - online_memory_expect_fail $memory -done - -# -# Online all hot-pluggable memory -# -echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_ONLINE/error -for memory in `hotplaggable_offline_memory`; do - online_memory_expect_success $memory -done - -# -# Test memory hot-remove error handling (online => offline) -# -echo $error > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_OFFLINE/error -for memory in `hotpluggable_online_memory`; do - offline_memory_expect_fail $memory -done - -echo 0 > $NOTIFIER_ERR_INJECT_DIR/actions/MEM_GOING_OFFLINE/error -/sbin/modprobe -q -r memory-notifier-error-inject diff --git a/mqueue/.gitignore b/mqueue/.gitignore deleted file mode 100644 index d8d4237..0000000 --- a/mqueue/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -mq_open_tests -mq_perf_tests diff --git a/mqueue/Makefile b/mqueue/Makefile deleted file mode 100644 index 218a122..0000000 --- a/mqueue/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -all: - gcc -O2 -lrt mq_open_tests.c -o mq_open_tests - gcc -O2 -lrt -lpthread -lpopt -o mq_perf_tests mq_perf_tests.c - -run_tests: - @./mq_open_tests /test1 || echo "mq_open_tests: [FAIL]" - @./mq_perf_tests || echo "mq_perf_tests: [FAIL]" - -clean: - rm -f mq_open_tests mq_perf_tests diff --git a/mqueue/mq_open_tests.c b/mqueue/mq_open_tests.c deleted file mode 100644 index 711cc29..0000000 --- a/mqueue/mq_open_tests.c +++ /dev/null @@ -1,492 +0,0 @@ -/* - * This application is Copyright 2012 Red Hat, Inc. - * Doug Ledford <dledford@redhat.com> - * - * mq_open_tests is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * mq_open_tests is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * For the full text of the license, see <http://www.gnu.org/licenses/>. - * - * mq_open_tests.c - * Tests the various situations that should either succeed or fail to - * open a posix message queue and then reports whether or not they - * did as they were supposed to. - * - */ -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <fcntl.h> -#include <string.h> -#include <limits.h> -#include <errno.h> -#include <sys/types.h> -#include <sys/time.h> -#include <sys/resource.h> -#include <sys/stat.h> -#include <mqueue.h> - -static char *usage = -"Usage:\n" -" %s path\n" -"\n" -" path Path name of the message queue to create\n" -"\n" -" Note: this program must be run as root in order to enable all tests\n" -"\n"; - -char *DEF_MSGS = "/proc/sys/fs/mqueue/msg_default"; -char *DEF_MSGSIZE = "/proc/sys/fs/mqueue/msgsize_default"; -char *MAX_MSGS = "/proc/sys/fs/mqueue/msg_max"; -char *MAX_MSGSIZE = "/proc/sys/fs/mqueue/msgsize_max"; - -int default_settings; -struct rlimit saved_limits, cur_limits; -int saved_def_msgs, saved_def_msgsize, saved_max_msgs, saved_max_msgsize; -int cur_def_msgs, cur_def_msgsize, cur_max_msgs, cur_max_msgsize; -FILE *def_msgs, *def_msgsize, *max_msgs, *max_msgsize; -char *queue_path; -mqd_t queue = -1; - -static inline void __set(FILE *stream, int value, char *err_msg); -void shutdown(int exit_val, char *err_cause, int line_no); -static inline int get(FILE *stream); -static inline void set(FILE *stream, int value); -static inline void getr(int type, struct rlimit *rlim); -static inline void setr(int type, struct rlimit *rlim); -void validate_current_settings(); -static inline void test_queue(struct mq_attr *attr, struct mq_attr *result); -static inline int test_queue_fail(struct mq_attr *attr, struct mq_attr *result); - -static inline void __set(FILE *stream, int value, char *err_msg) -{ - rewind(stream); - if (fprintf(stream, "%d", value) < 0) - perror(err_msg); -} - - -void shutdown(int exit_val, char *err_cause, int line_no) -{ - static int in_shutdown = 0; - - /* In case we get called recursively by a set() call below */ - if (in_shutdown++) - return; - - seteuid(0); - - if (queue != -1) - if (mq_close(queue)) - perror("mq_close() during shutdown"); - if (queue_path) - /* - * Be silent if this fails, if we cleaned up already it's - * expected to fail - */ - mq_unlink(queue_path); - if (default_settings) { - if (saved_def_msgs) - __set(def_msgs, saved_def_msgs, - "failed to restore saved_def_msgs"); - if (saved_def_msgsize) - __set(def_msgsize, saved_def_msgsize, - "failed to restore saved_def_msgsize"); - } - if (saved_max_msgs) - __set(max_msgs, saved_max_msgs, - "failed to restore saved_max_msgs"); - if (saved_max_msgsize) - __set(max_msgsize, saved_max_msgsize, - "failed to restore saved_max_msgsize"); - if (exit_val) - error(exit_val, errno, "%s at %d", err_cause, line_no); - exit(0); -} - -static inline int get(FILE *stream) -{ - int value; - rewind(stream); - if (fscanf(stream, "%d", &value) != 1) - shutdown(4, "Error reading /proc entry", __LINE__ - 1); - return value; -} - -static inline void set(FILE *stream, int value) -{ - int new_value; - - rewind(stream); - if (fprintf(stream, "%d", value) < 0) - return shutdown(5, "Failed writing to /proc file", - __LINE__ - 1); - new_value = get(stream); - if (new_value != value) - return shutdown(5, "We didn't get what we wrote to /proc back", - __LINE__ - 1); -} - -static inline void getr(int type, struct rlimit *rlim) -{ - if (getrlimit(type, rlim)) - shutdown(6, "getrlimit()", __LINE__ - 1); -} - -static inline void setr(int type, struct rlimit *rlim) -{ - if (setrlimit(type, rlim)) - shutdown(7, "setrlimit()", __LINE__ - 1); -} - -void validate_current_settings() -{ - int rlim_needed; - - if (cur_limits.rlim_cur < 4096) { - printf("Current rlimit value for POSIX message queue bytes is " - "unreasonably low,\nincreasing.\n\n"); - cur_limits.rlim_cur = 8192; - cur_limits.rlim_max = 16384; - setr(RLIMIT_MSGQUEUE, &cur_limits); - } - - if (default_settings) { - rlim_needed = (cur_def_msgs + 1) * (cur_def_msgsize + 1 + - 2 * sizeof(void *)); - if (rlim_needed > cur_limits.rlim_cur) { - printf("Temporarily lowering default queue parameters " - "to something that will work\n" - "with the current rlimit values.\n\n"); - set(def_msgs, 10); - cur_def_msgs = 10; - set(def_msgsize, 128); - cur_def_msgsize = 128; - } - } else { - rlim_needed = (cur_max_msgs + 1) * (cur_max_msgsize + 1 + - 2 * sizeof(void *)); - if (rlim_needed > cur_limits.rlim_cur) { - printf("Temporarily lowering maximum queue parameters " - "to something that will work\n" - "with the current rlimit values in case this is " - "a kernel that ties the default\n" - "queue parameters to the maximum queue " - "parameters.\n\n"); - set(max_msgs, 10); - cur_max_msgs = 10; - set(max_msgsize, 128); - cur_max_msgsize = 128; - } - } -} - -/* - * test_queue - Test opening a queue, shutdown if we fail. This should - * only be called in situations that should never fail. We clean up - * after ourselves and return the queue attributes in *result. - */ -static inline void test_queue(struct mq_attr *attr, struct mq_attr *result) -{ - int flags = O_RDWR | O_EXCL | O_CREAT; - int perms = DEFFILEMODE; - - if ((queue = mq_open(queue_path, flags, perms, attr)) == -1) - shutdown(1, "mq_open()", __LINE__); - if (mq_getattr(queue, result)) - shutdown(1, "mq_getattr()", __LINE__); - if (mq_close(queue)) - shutdown(1, "mq_close()", __LINE__); - queue = -1; - if (mq_unlink(queue_path)) - shutdown(1, "mq_unlink()", __LINE__); -} - -/* - * Same as test_queue above, but failure is not fatal. - * Returns: - * 0 - Failed to create a queue - * 1 - Created a queue, attributes in *result - */ -static inline int test_queue_fail(struct mq_attr *attr, struct mq_attr *result) -{ - int flags = O_RDWR | O_EXCL | O_CREAT; - int perms = DEFFILEMODE; - - if ((queue = mq_open(queue_path, flags, perms, attr)) == -1) - return 0; - if (mq_getattr(queue, result)) - shutdown(1, "mq_getattr()", __LINE__); - if (mq_close(queue)) - shutdown(1, "mq_close()", __LINE__); - queue = -1; - if (mq_unlink(queue_path)) - shutdown(1, "mq_unlink()", __LINE__); - return 1; -} - -int main(int argc, char *argv[]) -{ - struct mq_attr attr, result; - - if (argc != 2) { - fprintf(stderr, "Must pass a valid queue name\n\n"); - fprintf(stderr, usage, argv[0]); - exit(1); - } - - /* - * Although we can create a msg queue with a non-absolute path name, - * unlink will fail. So, if the name doesn't start with a /, add one - * when we save it. - */ - if (*argv[1] == '/') - queue_path = strdup(argv[1]); - else { - queue_path = malloc(strlen(argv[1]) + 2); - if (!queue_path) { - perror("malloc()"); - exit(1); - } - queue_path[0] = '/'; - queue_path[1] = 0; - strcat(queue_path, argv[1]); - } - - if (getuid() != 0) { - fprintf(stderr, "Not running as root, but almost all tests " - "require root in order to modify\nsystem settings. " - "Exiting.\n"); - exit(1); - } - - /* Find out what files there are for us to make tweaks in */ - def_msgs = fopen(DEF_MSGS, "r+"); - def_msgsize = fopen(DEF_MSGSIZE, "r+"); - max_msgs = fopen(MAX_MSGS, "r+"); - max_msgsize = fopen(MAX_MSGSIZE, "r+"); - - if (!max_msgs) - shutdown(2, "Failed to open msg_max", __LINE__); - if (!max_msgsize) - shutdown(2, "Failed to open msgsize_max", __LINE__); - if (def_msgs || def_msgsize) - default_settings = 1; - - /* Load up the current system values for everything we can */ - getr(RLIMIT_MSGQUEUE, &saved_limits); - cur_limits = saved_limits; - if (default_settings) { - saved_def_msgs = cur_def_msgs = get(def_msgs); - saved_def_msgsize = cur_def_msgsize = get(def_msgsize); - } - saved_max_msgs = cur_max_msgs = get(max_msgs); - saved_max_msgsize = cur_max_msgsize = get(max_msgsize); - - /* Tell the user our initial state */ - printf("\nInitial system state:\n"); - printf("\tUsing queue path:\t\t%s\n", queue_path); - printf("\tRLIMIT_MSGQUEUE(soft):\t\t%d\n", saved_limits.rlim_cur); - printf("\tRLIMIT_MSGQUEUE(hard):\t\t%d\n", saved_limits.rlim_max); - printf("\tMaximum Message Size:\t\t%d\n", saved_max_msgsize); - printf("\tMaximum Queue Size:\t\t%d\n", saved_max_msgs); - if (default_settings) { - printf("\tDefault Message Size:\t\t%d\n", saved_def_msgsize); - printf("\tDefault Queue Size:\t\t%d\n", saved_def_msgs); - } else { - printf("\tDefault Message Size:\t\tNot Supported\n"); - printf("\tDefault Queue Size:\t\tNot Supported\n"); - } - printf("\n"); - - validate_current_settings(); - - printf("Adjusted system state for testing:\n"); - printf("\tRLIMIT_MSGQUEUE(soft):\t\t%d\n", cur_limits.rlim_cur); - printf("\tRLIMIT_MSGQUEUE(hard):\t\t%d\n", cur_limits.rlim_max); - printf("\tMaximum Message Size:\t\t%d\n", cur_max_msgsize); - printf("\tMaximum Queue Size:\t\t%d\n", cur_max_msgs); - if (default_settings) { - printf("\tDefault Message Size:\t\t%d\n", cur_def_msgsize); - printf("\tDefault Queue Size:\t\t%d\n", cur_def_msgs); - } - - printf("\n\nTest series 1, behavior when no attr struct " - "passed to mq_open:\n"); - if (!default_settings) { - test_queue(NULL, &result); - printf("Given sane system settings, mq_open without an attr " - "struct succeeds:\tPASS\n"); - if (result.mq_maxmsg != cur_max_msgs || - result.mq_msgsize != cur_max_msgsize) { - printf("Kernel does not support setting the default " - "mq attributes,\nbut also doesn't tie the " - "defaults to the maximums:\t\t\tPASS\n"); - } else { - set(max_msgs, ++cur_max_msgs); - set(max_msgsize, ++cur_max_msgsize); - test_queue(NULL, &result); - if (result.mq_maxmsg == cur_max_msgs && - result.mq_msgsize == cur_max_msgsize) - printf("Kernel does not support setting the " - "default mq attributes and\n" - "also ties system wide defaults to " - "the system wide maximums:\t\t" - "FAIL\n"); - else - printf("Kernel does not support setting the " - "default mq attributes,\n" - "but also doesn't tie the defaults to " - "the maximums:\t\t\tPASS\n"); - } - } else { - printf("Kernel supports setting defaults separately from " - "maximums:\t\tPASS\n"); - /* - * While we are here, go ahead and test that the kernel - * properly follows the default settings - */ - test_queue(NULL, &result); - printf("Given sane values, mq_open without an attr struct " - "succeeds:\t\tPASS\n"); - if (result.mq_maxmsg != cur_def_msgs || - result.mq_msgsize != cur_def_msgsize) - printf("Kernel supports setting defaults, but does " - "not actually honor them:\tFAIL\n\n"); - else { - set(def_msgs, ++cur_def_msgs); - set(def_msgsize, ++cur_def_msgsize); - /* In case max was the same as the default */ - set(max_msgs, ++cur_max_msgs); - set(max_msgsize, ++cur_max_msgsize); - test_queue(NULL, &result); - if (result.mq_maxmsg != cur_def_msgs || - result.mq_msgsize != cur_def_msgsize) - printf("Kernel supports setting defaults, but " - "does not actually honor them:\t" - "FAIL\n"); - else - printf("Kernel properly honors default setting " - "knobs:\t\t\t\tPASS\n"); - } - set(def_msgs, cur_max_msgs + 1); - cur_def_msgs = cur_max_msgs + 1; - set(def_msgsize, cur_max_msgsize + 1); - cur_def_msgsize = cur_max_msgsize + 1; - if (cur_def_msgs * (cur_def_msgsize + 2 * sizeof(void *)) >= - cur_limits.rlim_cur) { - cur_limits.rlim_cur = (cur_def_msgs + 2) * - (cur_def_msgsize + 2 * sizeof(void *)); - cur_limits.rlim_max = 2 * cur_limits.rlim_cur; - setr(RLIMIT_MSGQUEUE, &cur_limits); - } - if (test_queue_fail(NULL, &result)) { - if (result.mq_maxmsg == cur_max_msgs && - result.mq_msgsize == cur_max_msgsize) - printf("Kernel properly limits default values " - "to lesser of default/max:\t\tPASS\n"); - else - printf("Kernel does not properly set default " - "queue parameters when\ndefaults > " - "max:\t\t\t\t\t\t\t\tFAIL\n"); - } else - printf("Kernel fails to open mq because defaults are " - "greater than maximums:\tFAIL\n"); - set(def_msgs, --cur_def_msgs); - set(def_msgsize, --cur_def_msgsize); - cur_limits.rlim_cur = cur_limits.rlim_max = cur_def_msgs * - cur_def_msgsize; - setr(RLIMIT_MSGQUEUE, &cur_limits); - if (test_queue_fail(NULL, &result)) - printf("Kernel creates queue even though defaults " - "would exceed\nrlimit setting:" - "\t\t\t\t\t\t\t\tFAIL\n"); - else - printf("Kernel properly fails to create queue when " - "defaults would\nexceed rlimit:" - "\t\t\t\t\t\t\t\tPASS\n"); - } - - /* - * Test #2 - open with an attr struct that exceeds rlimit - */ - printf("\n\nTest series 2, behavior when attr struct is " - "passed to mq_open:\n"); - cur_max_msgs = 32; - cur_max_msgsize = cur_limits.rlim_max >> 4; - set(max_msgs, cur_max_msgs); - set(max_msgsize, cur_max_msgsize); - attr.mq_maxmsg = cur_max_msgs; - attr.mq_msgsize = cur_max_msgsize; - if (test_queue_fail(&attr, &result)) - printf("Queue open in excess of rlimit max when euid = 0 " - "succeeded:\t\tFAIL\n"); - else - printf("Queue open in excess of rlimit max when euid = 0 " - "failed:\t\tPASS\n"); - attr.mq_maxmsg = cur_max_msgs + 1; - attr.mq_msgsize = 10; - if (test_queue_fail(&attr, &result)) - printf("Queue open with mq_maxmsg > limit when euid = 0 " - "succeeded:\t\tPASS\n"); - else - printf("Queue open with mq_maxmsg > limit when euid = 0 " - "failed:\t\tFAIL\n"); - attr.mq_maxmsg = 1; - attr.mq_msgsize = cur_max_msgsize + 1; - if (test_queue_fail(&attr, &result)) - printf("Queue open with mq_msgsize > limit when euid = 0 " - "succeeded:\t\tPASS\n"); - else - printf("Queue open with mq_msgsize > limit when euid = 0 " - "failed:\t\tFAIL\n"); - attr.mq_maxmsg = 65536; - attr.mq_msgsize = 65536; - if (test_queue_fail(&attr, &result)) - printf("Queue open with total size > 2GB when euid = 0 " - "succeeded:\t\tFAIL\n"); - else - printf("Queue open with total size > 2GB when euid = 0 " - "failed:\t\t\tPASS\n"); - seteuid(99); - attr.mq_maxmsg = cur_max_msgs; - attr.mq_msgsize = cur_max_msgsize; - if (test_queue_fail(&attr, &result)) - printf("Queue open in excess of rlimit max when euid = 99 " - "succeeded:\t\tFAIL\n"); - else - printf("Queue open in excess of rlimit max when euid = 99 " - "failed:\t\tPASS\n"); - attr.mq_maxmsg = cur_max_msgs + 1; - attr.mq_msgsize = 10; - if (test_queue_fail(&attr, &result)) - printf("Queue open with mq_maxmsg > limit when euid = 99 " - "succeeded:\t\tFAIL\n"); - else - printf("Queue open with mq_maxmsg > limit when euid = 99 " - "failed:\t\tPASS\n"); - attr.mq_maxmsg = 1; - attr.mq_msgsize = cur_max_msgsize + 1; - if (test_queue_fail(&attr, &result)) - printf("Queue open with mq_msgsize > limit when euid = 99 " - "succeeded:\t\tFAIL\n"); - else - printf("Queue open with mq_msgsize > limit when euid = 99 " - "failed:\t\tPASS\n"); - attr.mq_maxmsg = 65536; - attr.mq_msgsize = 65536; - if (test_queue_fail(&attr, &result)) - printf("Queue open with total size > 2GB when euid = 99 " - "succeeded:\t\tFAIL\n"); - else - printf("Queue open with total size > 2GB when euid = 99 " - "failed:\t\t\tPASS\n"); - - shutdown(0,"",0); -} diff --git a/mqueue/mq_perf_tests.c b/mqueue/mq_perf_tests.c deleted file mode 100644 index 2fadd4b..0000000 --- a/mqueue/mq_perf_tests.c +++ /dev/null @@ -1,741 +0,0 @@ -/* - * This application is Copyright 2012 Red Hat, Inc. - * Doug Ledford <dledford@redhat.com> - * - * mq_perf_tests is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * mq_perf_tests is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * For the full text of the license, see <http://www.gnu.org/licenses/>. - * - * mq_perf_tests.c - * Tests various types of message queue workloads, concentrating on those - * situations that invole large message sizes, large message queue depths, - * or both, and reports back useful metrics about kernel message queue - * performance. - * - */ -#define _GNU_SOURCE -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <fcntl.h> -#include <string.h> -#include <limits.h> -#include <errno.h> -#include <signal.h> -#include <pthread.h> -#include <sched.h> -#include <sys/types.h> -#include <sys/time.h> -#include <sys/resource.h> -#include <sys/stat.h> -#include <mqueue.h> -#include <popt.h> - -static char *usage = -"Usage:\n" -" %s [-c #[,#..] -f] path\n" -"\n" -" -c # Skip most tests and go straight to a high queue depth test\n" -" and then run that test continuously (useful for running at\n" -" the same time as some other workload to see how much the\n" -" cache thrashing caused by adding messages to a very deep\n" -" queue impacts the performance of other programs). The number\n" -" indicates which CPU core we should bind the process to during\n" -" the run. If you have more than one physical CPU, then you\n" -" will need one copy per physical CPU package, and you should\n" -" specify the CPU cores to pin ourself to via a comma separated\n" -" list of CPU values.\n" -" -f Only usable with continuous mode. Pin ourself to the CPUs\n" -" as requested, then instead of looping doing a high mq\n" -" workload, just busy loop. This will allow us to lock up a\n" -" single CPU just like we normally would, but without actually\n" -" thrashing the CPU cache. This is to make it easier to get\n" -" comparable numbers from some other workload running on the\n" -" other CPUs. One set of numbers with # CPUs locked up running\n" -" an mq workload, and another set of numbers with those same\n" -" CPUs locked away from the test workload, but not doing\n" -" anything to trash the cache like the mq workload might.\n" -" path Path name of the message queue to create\n" -"\n" -" Note: this program must be run as root in order to enable all tests\n" -"\n"; - -char *MAX_MSGS = "/proc/sys/fs/mqueue/msg_max"; -char *MAX_MSGSIZE = "/proc/sys/fs/mqueue/msgsize_max"; - -#define min(a, b) ((a) < (b) ? (a) : (b)) -#define MAX_CPUS 64 -char *cpu_option_string; -int cpus_to_pin[MAX_CPUS]; -int num_cpus_to_pin; -pthread_t cpu_threads[MAX_CPUS]; -pthread_t main_thread; -cpu_set_t *cpu_set; -int cpu_set_size; -int cpus_online; - -#define MSG_SIZE 16 -#define TEST1_LOOPS 10000000 -#define TEST2_LOOPS 100000 -int continuous_mode; -int continuous_mode_fake; - -struct rlimit saved_limits, cur_limits; -int saved_max_msgs, saved_max_msgsize; -int cur_max_msgs, cur_max_msgsize; -FILE *max_msgs, *max_msgsize; -int cur_nice; -char *queue_path = "/mq_perf_tests"; -mqd_t queue = -1; -struct mq_attr result; -int mq_prio_max; - -const struct poptOption options[] = { - { - .longName = "continuous", - .shortName = 'c', - .argInfo = POPT_ARG_STRING, - .arg = &cpu_option_string, - .val = 'c', - .descrip = "Run continuous tests at a high queue depth in " - "order to test the effects of cache thrashing on " - "other tasks on the system. This test is intended " - "to be run on one core of each physical CPU while " - "some other CPU intensive task is run on all the other " - "cores of that same physical CPU and the other task " - "is timed. It is assumed that the process of adding " - "messages to the message queue in a tight loop will " - "impact that other task to some degree. Once the " - "tests are performed in this way, you should then " - "re-run the tests using fake mode in order to check " - "the difference in time required to perform the CPU " - "intensive task", - .argDescrip = "cpu[,cpu]", - }, - { - .longName = "fake", - .shortName = 'f', - .argInfo = POPT_ARG_NONE, - .arg = &continuous_mode_fake, - .val = 0, - .descrip = "Tie up the CPUs that we would normally tie up in" - "continuous mode, but don't actually do any mq stuff, " - "just keep the CPU busy so it can't be used to process " - "system level tasks as this would free up resources on " - "the other CPU cores and skew the comparison between " - "the no-mqueue work and mqueue work tests", - .argDescrip = NULL, - }, - { - .longName = "path", - .shortName = 'p', - .argInfo = POPT_ARG_STRING | POPT_ARGFLAG_SHOW_DEFAULT, - .arg = &queue_path, - .val = 'p', - .descrip = "The name of the path to use in the mqueue " - "filesystem for our tests", - .argDescrip = "pathname", - }, - POPT_AUTOHELP - POPT_TABLEEND -}; - -static inline void __set(FILE *stream, int value, char *err_msg); -void shutdown(int exit_val, char *err_cause, int line_no); -void sig_action_SIGUSR1(int signum, siginfo_t *info, void *context); -void sig_action(int signum, siginfo_t *info, void *context); -static inline int get(FILE *stream); -static inline void set(FILE *stream, int value); -static inline int try_set(FILE *stream, int value); -static inline void getr(int type, struct rlimit *rlim); -static inline void setr(int type, struct rlimit *rlim); -static inline void open_queue(struct mq_attr *attr); -void increase_limits(void); - -static inline void __set(FILE *stream, int value, char *err_msg) -{ - rewind(stream); - if (fprintf(stream, "%d", value) < 0) - perror(err_msg); -} - - -void shutdown(int exit_val, char *err_cause, int line_no) -{ - static int in_shutdown = 0; - int errno_at_shutdown = errno; - int i; - - /* In case we get called by multiple threads or from an sighandler */ - if (in_shutdown++) - return; - - for (i = 0; i < num_cpus_to_pin; i++) - if (cpu_threads[i]) { - pthread_kill(cpu_threads[i], SIGUSR1); - pthread_join(cpu_threads[i], NULL); - } - - if (queue != -1) - if (mq_close(queue)) - perror("mq_close() during shutdown"); - if (queue_path) - /* - * Be silent if this fails, if we cleaned up already it's - * expected to fail - */ - mq_unlink(queue_path); - if (saved_max_msgs) - __set(max_msgs, saved_max_msgs, - "failed to restore saved_max_msgs"); - if (saved_max_msgsize) - __set(max_msgsize, saved_max_msgsize, - "failed to restore saved_max_msgsize"); - if (exit_val) - error(exit_val, errno_at_shutdown, "%s at %d", - err_cause, line_no); - exit(0); -} - -void sig_action_SIGUSR1(int signum, siginfo_t *info, void *context) -{ - if (pthread_self() != main_thread) - pthread_exit(0); - else { - fprintf(stderr, "Caught signal %d in SIGUSR1 handler, " - "exiting\n", signum); - shutdown(0, "", 0); - fprintf(stderr, "\n\nReturned from shutdown?!?!\n\n"); - exit(0); - } -} - -void sig_action(int signum, siginfo_t *info, void *context) -{ - if (pthread_self() != main_thread) - pthread_kill(main_thread, signum); - else { - fprintf(stderr, "Caught signal %d, exiting\n", signum); - shutdown(0, "", 0); - fprintf(stderr, "\n\nReturned from shutdown?!?!\n\n"); - exit(0); - } -} - -static inline int get(FILE *stream) -{ - int value; - rewind(stream); - if (fscanf(stream, "%d", &value) != 1) - shutdown(4, "Error reading /proc entry", __LINE__); - return value; -} - -static inline void set(FILE *stream, int value) -{ - int new_value; - - rewind(stream); - if (fprintf(stream, "%d", value) < 0) - return shutdown(5, "Failed writing to /proc file", __LINE__); - new_value = get(stream); - if (new_value != value) - return shutdown(5, "We didn't get what we wrote to /proc back", - __LINE__); -} - -static inline int try_set(FILE *stream, int value) -{ - int new_value; - - rewind(stream); - fprintf(stream, "%d", value); - new_value = get(stream); - return new_value == value; -} - -static inline void getr(int type, struct rlimit *rlim) -{ - if (getrlimit(type, rlim)) - shutdown(6, "getrlimit()", __LINE__); -} - -static inline void setr(int type, struct rlimit *rlim) -{ - if (setrlimit(type, rlim)) - shutdown(7, "setrlimit()", __LINE__); -} - -/** - * open_queue - open the global queue for testing - * @attr - An attr struct specifying the desired queue traits - * @result - An attr struct that lists the actual traits the queue has - * - * This open is not allowed to fail, failure will result in an orderly - * shutdown of the program. The global queue_path is used to set what - * queue to open, the queue descriptor is saved in the global queue - * variable. - */ -static inline void open_queue(struct mq_attr *attr) -{ - int flags = O_RDWR | O_EXCL | O_CREAT | O_NONBLOCK; - int perms = DEFFILEMODE; - - queue = mq_open(queue_path, flags, perms, attr); - if (queue == -1) - shutdown(1, "mq_open()", __LINE__); - if (mq_getattr(queue, &result)) - shutdown(1, "mq_getattr()", __LINE__); - printf("\n\tQueue %s created:\n", queue_path); - printf("\t\tmq_flags:\t\t\t%s\n", result.mq_flags & O_NONBLOCK ? - "O_NONBLOCK" : "(null)"); - printf("\t\tmq_maxmsg:\t\t\t%d\n", result.mq_maxmsg); - printf("\t\tmq_msgsize:\t\t\t%d\n", result.mq_msgsize); - printf("\t\tmq_curmsgs:\t\t\t%d\n", result.mq_curmsgs); -} - -void *fake_cont_thread(void *arg) -{ - int i; - - for (i = 0; i < num_cpus_to_pin; i++) - if (cpu_threads[i] == pthread_self()) - break; - printf("\tStarted fake continuous mode thread %d on CPU %d\n", i, - cpus_to_pin[i]); - while (1) - ; -} - -void *cont_thread(void *arg) -{ - char buff[MSG_SIZE]; - int i, priority; - - for (i = 0; i < num_cpus_to_pin; i++) - if (cpu_threads[i] == pthread_self()) - break; - printf("\tStarted continuous mode thread %d on CPU %d\n", i, - cpus_to_pin[i]); - while (1) { - while (mq_send(queue, buff, sizeof(buff), 0) == 0) - ; - mq_receive(queue, buff, sizeof(buff), &priority); - } -} - -#define drain_queue() \ - while (mq_receive(queue, buff, MSG_SIZE, &prio_in) == MSG_SIZE) - -#define do_untimed_send() \ - do { \ - if (mq_send(queue, buff, MSG_SIZE, prio_out)) \ - shutdown(3, "Test send failure", __LINE__); \ - } while (0) - -#define do_send_recv() \ - do { \ - clock_gettime(clock, &start); \ - if (mq_send(queue, buff, MSG_SIZE, prio_out)) \ - shutdown(3, "Test send failure", __LINE__); \ - clock_gettime(clock, &middle); \ - if (mq_receive(queue, buff, MSG_SIZE, &prio_in) != MSG_SIZE) \ - shutdown(3, "Test receive failure", __LINE__); \ - clock_gettime(clock, &end); \ - nsec = ((middle.tv_sec - start.tv_sec) * 1000000000) + \ - (middle.tv_nsec - start.tv_nsec); \ - send_total.tv_nsec += nsec; \ - if (send_total.tv_nsec >= 1000000000) { \ - send_total.tv_sec++; \ - send_total.tv_nsec -= 1000000000; \ - } \ - nsec = ((end.tv_sec - middle.tv_sec) * 1000000000) + \ - (end.tv_nsec - middle.tv_nsec); \ - recv_total.tv_nsec += nsec; \ - if (recv_total.tv_nsec >= 1000000000) { \ - recv_total.tv_sec++; \ - recv_total.tv_nsec -= 1000000000; \ - } \ - } while (0) - -struct test { - char *desc; - void (*func)(int *); -}; - -void const_prio(int *prio) -{ - return; -} - -void inc_prio(int *prio) -{ - if (++*prio == mq_prio_max) - *prio = 0; -} - -void dec_prio(int *prio) -{ - if (--*prio < 0) - *prio = mq_prio_max - 1; -} - -void random_prio(int *prio) -{ - *prio = random() % mq_prio_max; -} - -struct test test2[] = { - {"\n\tTest #2a: Time send/recv message, queue full, constant prio\n", - const_prio}, - {"\n\tTest #2b: Time send/recv message, queue full, increasing prio\n", - inc_prio}, - {"\n\tTest #2c: Time send/recv message, queue full, decreasing prio\n", - dec_prio}, - {"\n\tTest #2d: Time send/recv message, queue full, random prio\n", - random_prio}, - {NULL, NULL} -}; - -/** - * Tests to perform (all done with MSG_SIZE messages): - * - * 1) Time to add/remove message with 0 messages on queue - * 1a) with constant prio - * 2) Time to add/remove message when queue close to capacity: - * 2a) with constant prio - * 2b) with increasing prio - * 2c) with decreasing prio - * 2d) with random prio - * 3) Test limits of priorities honored (double check _SC_MQ_PRIO_MAX) - */ -void *perf_test_thread(void *arg) -{ - char buff[MSG_SIZE]; - int prio_out, prio_in; - int i; - clockid_t clock; - pthread_t *t; - struct timespec res, start, middle, end, send_total, recv_total; - unsigned long long nsec; - struct test *cur_test; - - t = &cpu_threads[0]; - printf("\n\tStarted mqueue performance test thread on CPU %d\n", - cpus_to_pin[0]); - mq_prio_max = sysconf(_SC_MQ_PRIO_MAX); - if (mq_prio_max == -1) - shutdown(2, "sysconf(_SC_MQ_PRIO_MAX)", __LINE__); - if (pthread_getcpuclockid(cpu_threads[0], &clock) != 0) - shutdown(2, "pthread_getcpuclockid", __LINE__); - - if (clock_getres(clock, &res)) - shutdown(2, "clock_getres()", __LINE__); - - printf("\t\tMax priorities:\t\t\t%d\n", mq_prio_max); - printf("\t\tClock resolution:\t\t%d nsec%s\n", res.tv_nsec, - res.tv_nsec > 1 ? "s" : ""); - - - - printf("\n\tTest #1: Time send/recv message, queue empty\n"); - printf("\t\t(%d iterations)\n", TEST1_LOOPS); - prio_out = 0; - send_total.tv_sec = 0; - send_total.tv_nsec = 0; - recv_total.tv_sec = 0; - recv_total.tv_nsec = 0; - for (i = 0; i < TEST1_LOOPS; i++) - do_send_recv(); - printf("\t\tSend msg:\t\t\t%d.%ds total time\n", - send_total.tv_sec, send_total.tv_nsec); - nsec = ((unsigned long long)send_total.tv_sec * 1000000000 + - send_total.tv_nsec) / TEST1_LOOPS; - printf("\t\t\t\t\t\t%d nsec/msg\n", nsec); - printf("\t\tRecv msg:\t\t\t%d.%ds total time\n", - recv_total.tv_sec, recv_total.tv_nsec); - nsec = ((unsigned long long)recv_total.tv_sec * 1000000000 + - recv_total.tv_nsec) / TEST1_LOOPS; - printf("\t\t\t\t\t\t%d nsec/msg\n", nsec); - - - for (cur_test = test2; cur_test->desc != NULL; cur_test++) { - printf(cur_test->desc); - printf("\t\t(%d iterations)\n", TEST2_LOOPS); - prio_out = 0; - send_total.tv_sec = 0; - send_total.tv_nsec = 0; - recv_total.tv_sec = 0; - recv_total.tv_nsec = 0; - printf("\t\tFilling queue..."); - fflush(stdout); - clock_gettime(clock, &start); - for (i = 0; i < result.mq_maxmsg - 1; i++) { - do_untimed_send(); - cur_test->func(&prio_out); - } - clock_gettime(clock, &end); - nsec = ((unsigned long long)(end.tv_sec - start.tv_sec) * - 1000000000) + (end.tv_nsec - start.tv_nsec); - printf("done.\t\t%lld.%llds\n", nsec / 1000000000, - nsec % 1000000000); - printf("\t\tTesting..."); - fflush(stdout); - for (i = 0; i < TEST2_LOOPS; i++) { - do_send_recv(); - cur_test->func(&prio_out); - } - printf("done.\n"); - printf("\t\tSend msg:\t\t\t%d.%ds total time\n", - send_total.tv_sec, send_total.tv_nsec); - nsec = ((unsigned long long)send_total.tv_sec * 1000000000 + - send_total.tv_nsec) / TEST2_LOOPS; - printf("\t\t\t\t\t\t%d nsec/msg\n", nsec); - printf("\t\tRecv msg:\t\t\t%d.%ds total time\n", - recv_total.tv_sec, recv_total.tv_nsec); - nsec = ((unsigned long long)recv_total.tv_sec * 1000000000 + - recv_total.tv_nsec) / TEST2_LOOPS; - printf("\t\t\t\t\t\t%d nsec/msg\n", nsec); - printf("\t\tDraining queue..."); - fflush(stdout); - clock_gettime(clock, &start); - drain_queue(); - clock_gettime(clock, &end); - nsec = ((unsigned long long)(end.tv_sec - start.tv_sec) * - 1000000000) + (end.tv_nsec - start.tv_nsec); - printf("done.\t\t%lld.%llds\n", nsec / 1000000000, - nsec % 1000000000); - } - return 0; -} - -void increase_limits(void) -{ - cur_limits.rlim_cur = RLIM_INFINITY; - cur_limits.rlim_max = RLIM_INFINITY; - setr(RLIMIT_MSGQUEUE, &cur_limits); - while (try_set(max_msgs, cur_max_msgs += 10)) - ; - cur_max_msgs = get(max_msgs); - while (try_set(max_msgsize, cur_max_msgsize += 1024)) - ; - cur_max_msgsize = get(max_msgsize); - if (setpriority(PRIO_PROCESS, 0, -20) != 0) - shutdown(2, "setpriority()", __LINE__); - cur_nice = -20; -} - -int main(int argc, char *argv[]) -{ - struct mq_attr attr; - char *option, *next_option; - int i, cpu; - struct sigaction sa; - poptContext popt_context; - char rc; - void *retval; - - main_thread = pthread_self(); - num_cpus_to_pin = 0; - - if (sysconf(_SC_NPROCESSORS_ONLN) == -1) { - perror("sysconf(_SC_NPROCESSORS_ONLN)"); - exit(1); - } - cpus_online = min(MAX_CPUS, sysconf(_SC_NPROCESSORS_ONLN)); - cpu_set = CPU_ALLOC(cpus_online); - if (cpu_set == NULL) { - perror("CPU_ALLOC()"); - exit(1); - } - cpu_set_size = CPU_ALLOC_SIZE(cpus_online); - CPU_ZERO_S(cpu_set_size, cpu_set); - - popt_context = poptGetContext(NULL, argc, (const char **)argv, - options, 0); - - while ((rc = poptGetNextOpt(popt_context)) > 0) { - switch (rc) { - case 'c': - continuous_mode = 1; - option = cpu_option_string; - do { - next_option = strchr(option, ','); - if (next_option) - *next_option = '\0'; - cpu = atoi(option); - if (cpu >= cpus_online) - fprintf(stderr, "CPU %d exceeds " - "cpus online, ignoring.\n", - cpu); - else - cpus_to_pin[num_cpus_to_pin++] = cpu; - if (next_option) - option = ++next_option; - } while (next_option && num_cpus_to_pin < MAX_CPUS); - /* Double check that they didn't give us the same CPU - * more than once */ - for (cpu = 0; cpu < num_cpus_to_pin; cpu++) { - if (CPU_ISSET_S(cpus_to_pin[cpu], cpu_set_size, - cpu_set)) { - fprintf(stderr, "Any given CPU may " - "only be given once.\n"); - exit(1); - } else - CPU_SET_S(cpus_to_pin[cpu], - cpu_set_size, cpu_set); - } - break; - case 'p': - /* - * Although we can create a msg queue with a - * non-absolute path name, unlink will fail. So, - * if the name doesn't start with a /, add one - * when we save it. - */ - option = queue_path; - if (*option != '/') { - queue_path = malloc(strlen(option) + 2); - if (!queue_path) { - perror("malloc()"); - exit(1); - } - queue_path[0] = '/'; - queue_path[1] = 0; - strcat(queue_path, option); - free(option); - } - break; - } - } - - if (continuous_mode && num_cpus_to_pin == 0) { - fprintf(stderr, "Must pass at least one CPU to continuous " - "mode.\n"); - poptPrintUsage(popt_context, stderr, 0); - exit(1); - } else if (!continuous_mode) { - num_cpus_to_pin = 1; - cpus_to_pin[0] = cpus_online - 1; - } - - if (getuid() != 0) { - fprintf(stderr, "Not running as root, but almost all tests " - "require root in order to modify\nsystem settings. " - "Exiting.\n"); - exit(1); - } - - max_msgs = fopen(MAX_MSGS, "r+"); - max_msgsize = fopen(MAX_MSGSIZE, "r+"); - if (!max_msgs) - shutdown(2, "Failed to open msg_max", __LINE__); - if (!max_msgsize) - shutdown(2, "Failed to open msgsize_max", __LINE__); - - /* Load up the current system values for everything we can */ - getr(RLIMIT_MSGQUEUE, &saved_limits); - cur_limits = saved_limits; - saved_max_msgs = cur_max_msgs = get(max_msgs); - saved_max_msgsize = cur_max_msgsize = get(max_msgsize); - errno = 0; - cur_nice = getpriority(PRIO_PROCESS, 0); - if (errno) - shutdown(2, "getpriority()", __LINE__); - - /* Tell the user our initial state */ - printf("\nInitial system state:\n"); - printf("\tUsing queue path:\t\t\t%s\n", queue_path); - printf("\tRLIMIT_MSGQUEUE(soft):\t\t\t%d\n", saved_limits.rlim_cur); - printf("\tRLIMIT_MSGQUEUE(hard):\t\t\t%d\n", saved_limits.rlim_max); - printf("\tMaximum Message Size:\t\t\t%d\n", saved_max_msgsize); - printf("\tMaximum Queue Size:\t\t\t%d\n", saved_max_msgs); - printf("\tNice value:\t\t\t\t%d\n", cur_nice); - printf("\n"); - - increase_limits(); - - printf("Adjusted system state for testing:\n"); - if (cur_limits.rlim_cur == RLIM_INFINITY) { - printf("\tRLIMIT_MSGQUEUE(soft):\t\t\t(unlimited)\n"); - printf("\tRLIMIT_MSGQUEUE(hard):\t\t\t(unlimited)\n"); - } else { - printf("\tRLIMIT_MSGQUEUE(soft):\t\t\t%d\n", - cur_limits.rlim_cur); - printf("\tRLIMIT_MSGQUEUE(hard):\t\t\t%d\n", - cur_limits.rlim_max); - } - printf("\tMaximum Message Size:\t\t\t%d\n", cur_max_msgsize); - printf("\tMaximum Queue Size:\t\t\t%d\n", cur_max_msgs); - printf("\tNice value:\t\t\t\t%d\n", cur_nice); - printf("\tContinuous mode:\t\t\t(%s)\n", continuous_mode ? - (continuous_mode_fake ? "fake mode" : "enabled") : - "disabled"); - printf("\tCPUs to pin:\t\t\t\t%d", cpus_to_pin[0]); - for (cpu = 1; cpu < num_cpus_to_pin; cpu++) - printf(",%d", cpus_to_pin[cpu]); - printf("\n"); - - sa.sa_sigaction = sig_action_SIGUSR1; - sigemptyset(&sa.sa_mask); - sigaddset(&sa.sa_mask, SIGHUP); - sigaddset(&sa.sa_mask, SIGINT); - sigaddset(&sa.sa_mask, SIGQUIT); - sigaddset(&sa.sa_mask, SIGTERM); - sa.sa_flags = SA_SIGINFO; - if (sigaction(SIGUSR1, &sa, NULL) == -1) - shutdown(1, "sigaction(SIGUSR1)", __LINE__); - sa.sa_sigaction = sig_action; - if (sigaction(SIGHUP, &sa, NULL) == -1) - shutdown(1, "sigaction(SIGHUP)", __LINE__); - if (sigaction(SIGINT, &sa, NULL) == -1) - shutdown(1, "sigaction(SIGINT)", __LINE__); - if (sigaction(SIGQUIT, &sa, NULL) == -1) - shutdown(1, "sigaction(SIGQUIT)", __LINE__); - if (sigaction(SIGTERM, &sa, NULL) == -1) - shutdown(1, "sigaction(SIGTERM)", __LINE__); - - if (!continuous_mode_fake) { - attr.mq_flags = O_NONBLOCK; - attr.mq_maxmsg = cur_max_msgs; - attr.mq_msgsize = MSG_SIZE; - open_queue(&attr); - } - for (i = 0; i < num_cpus_to_pin; i++) { - pthread_attr_t thread_attr; - void *thread_func; - - if (continuous_mode_fake) - thread_func = &fake_cont_thread; - else if (continuous_mode) - thread_func = &cont_thread; - else - thread_func = &perf_test_thread; - - CPU_ZERO_S(cpu_set_size, cpu_set); - CPU_SET_S(cpus_to_pin[i], cpu_set_size, cpu_set); - pthread_attr_init(&thread_attr); - pthread_attr_setaffinity_np(&thread_attr, cpu_set_size, - cpu_set); - if (pthread_create(&cpu_threads[i], &thread_attr, thread_func, - NULL)) - shutdown(1, "pthread_create()", __LINE__); - pthread_attr_destroy(&thread_attr); - } - - if (!continuous_mode) { - pthread_join(cpu_threads[0], &retval); - shutdown((long)retval, "perf_test_thread()", __LINE__); - } else { - while (1) - sleep(1); - } - shutdown(0, "", 0); -} diff --git a/net/.gitignore b/net/.gitignore deleted file mode 100644 index 0032662..0000000 --- a/net/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -socket -psock_fanout -psock_tpacket diff --git a/net/Makefile b/net/Makefile deleted file mode 100644 index c7493b8..0000000 --- a/net/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -# Makefile for net selftests - -CC = $(CROSS_COMPILE)gcc -CFLAGS = -Wall -O2 -g - -CFLAGS += -I../../../../usr/include/ - -NET_PROGS = socket psock_fanout psock_tpacket - -all: $(NET_PROGS) -%: %.c - $(CC) $(CFLAGS) -o $@ $^ - -run_tests: all - @/bin/sh ./run_netsocktests || echo "sockettests: [FAIL]" - @/bin/sh ./run_afpackettests || echo "afpackettests: [FAIL]" - @if /sbin/modprobe test_bpf ; then \ - /sbin/rmmod test_bpf; \ - echo "test_bpf: ok"; \ - else \ - echo "test_bpf: [FAIL]"; \ - exit 1; \ - fi -clean: - $(RM) $(NET_PROGS) diff --git a/net/psock_fanout.c b/net/psock_fanout.c deleted file mode 100644 index 57b9c2b..0000000 --- a/net/psock_fanout.c +++ /dev/null @@ -1,312 +0,0 @@ -/* - * Copyright 2013 Google Inc. - * Author: Willem de Bruijn (willemb@google.com) - * - * A basic test of packet socket fanout behavior. - * - * Control: - * - create fanout fails as expected with illegal flag combinations - * - join fanout fails as expected with diverging types or flags - * - * Datapath: - * Open a pair of packet sockets and a pair of INET sockets, send a known - * number of packets across the two INET sockets and count the number of - * packets enqueued onto the two packet sockets. - * - * The test currently runs for - * - PACKET_FANOUT_HASH - * - PACKET_FANOUT_HASH with PACKET_FANOUT_FLAG_ROLLOVER - * - PACKET_FANOUT_LB - * - PACKET_FANOUT_CPU - * - PACKET_FANOUT_ROLLOVER - * - * Todo: - * - functionality: PACKET_FANOUT_FLAG_DEFRAG - * - * License (GPLv2): - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#define _GNU_SOURCE /* for sched_setaffinity */ - -#include <arpa/inet.h> -#include <errno.h> -#include <fcntl.h> -#include <linux/filter.h> -#include <linux/if_packet.h> -#include <net/ethernet.h> -#include <netinet/ip.h> -#include <netinet/udp.h> -#include <poll.h> -#include <sched.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/mman.h> -#include <sys/socket.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <unistd.h> - -#include "psock_lib.h" - -#define RING_NUM_FRAMES 20 - -/* Open a socket in a given fanout mode. - * @return -1 if mode is bad, a valid socket otherwise */ -static int sock_fanout_open(uint16_t typeflags, int num_packets) -{ - int fd, val; - - fd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP)); - if (fd < 0) { - perror("socket packet"); - exit(1); - } - - /* fanout group ID is always 0: tests whether old groups are deleted */ - val = ((int) typeflags) << 16; - if (setsockopt(fd, SOL_PACKET, PACKET_FANOUT, &val, sizeof(val))) { - if (close(fd)) { - perror("close packet"); - exit(1); - } - return -1; - } - - pair_udp_setfilter(fd); - return fd; -} - -static char *sock_fanout_open_ring(int fd) -{ - struct tpacket_req req = { - .tp_block_size = getpagesize(), - .tp_frame_size = getpagesize(), - .tp_block_nr = RING_NUM_FRAMES, - .tp_frame_nr = RING_NUM_FRAMES, - }; - char *ring; - int val = TPACKET_V2; - - if (setsockopt(fd, SOL_PACKET, PACKET_VERSION, (void *) &val, - sizeof(val))) { - perror("packetsock ring setsockopt version"); - exit(1); - } - if (setsockopt(fd, SOL_PACKET, PACKET_RX_RING, (void *) &req, - sizeof(req))) { - perror("packetsock ring setsockopt"); - exit(1); - } - - ring = mmap(0, req.tp_block_size * req.tp_block_nr, - PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (!ring) { - fprintf(stderr, "packetsock ring mmap\n"); - exit(1); - } - - return ring; -} - -static int sock_fanout_read_ring(int fd, void *ring) -{ - struct tpacket2_hdr *header = ring; - int count = 0; - - while (header->tp_status & TP_STATUS_USER && count < RING_NUM_FRAMES) { - count++; - header = ring + (count * getpagesize()); - } - - return count; -} - -static int sock_fanout_read(int fds[], char *rings[], const int expect[]) -{ - int ret[2]; - - ret[0] = sock_fanout_read_ring(fds[0], rings[0]); - ret[1] = sock_fanout_read_ring(fds[1], rings[1]); - - fprintf(stderr, "info: count=%d,%d, expect=%d,%d\n", - ret[0], ret[1], expect[0], expect[1]); - - if ((!(ret[0] == expect[0] && ret[1] == expect[1])) && - (!(ret[0] == expect[1] && ret[1] == expect[0]))) { - fprintf(stderr, "ERROR: incorrect queue lengths\n"); - return 1; - } - - return 0; -} - -/* Test illegal mode + flag combination */ -static void test_control_single(void) -{ - fprintf(stderr, "test: control single socket\n"); - - if (sock_fanout_open(PACKET_FANOUT_ROLLOVER | - PACKET_FANOUT_FLAG_ROLLOVER, 0) != -1) { - fprintf(stderr, "ERROR: opened socket with dual rollover\n"); - exit(1); - } -} - -/* Test illegal group with different modes or flags */ -static void test_control_group(void) -{ - int fds[2]; - - fprintf(stderr, "test: control multiple sockets\n"); - - fds[0] = sock_fanout_open(PACKET_FANOUT_HASH, 20); - if (fds[0] == -1) { - fprintf(stderr, "ERROR: failed to open HASH socket\n"); - exit(1); - } - if (sock_fanout_open(PACKET_FANOUT_HASH | - PACKET_FANOUT_FLAG_DEFRAG, 10) != -1) { - fprintf(stderr, "ERROR: joined group with wrong flag defrag\n"); - exit(1); - } - if (sock_fanout_open(PACKET_FANOUT_HASH | - PACKET_FANOUT_FLAG_ROLLOVER, 10) != -1) { - fprintf(stderr, "ERROR: joined group with wrong flag ro\n"); - exit(1); - } - if (sock_fanout_open(PACKET_FANOUT_CPU, 10) != -1) { - fprintf(stderr, "ERROR: joined group with wrong mode\n"); - exit(1); - } - fds[1] = sock_fanout_open(PACKET_FANOUT_HASH, 20); - if (fds[1] == -1) { - fprintf(stderr, "ERROR: failed to join group\n"); - exit(1); - } - if (close(fds[1]) || close(fds[0])) { - fprintf(stderr, "ERROR: closing sockets\n"); - exit(1); - } -} - -static int test_datapath(uint16_t typeflags, int port_off, - const int expect1[], const int expect2[]) -{ - const int expect0[] = { 0, 0 }; - char *rings[2]; - int fds[2], fds_udp[2][2], ret; - - fprintf(stderr, "test: datapath 0x%hx\n", typeflags); - - fds[0] = sock_fanout_open(typeflags, 20); - fds[1] = sock_fanout_open(typeflags, 20); - if (fds[0] == -1 || fds[1] == -1) { - fprintf(stderr, "ERROR: failed open\n"); - exit(1); - } - rings[0] = sock_fanout_open_ring(fds[0]); - rings[1] = sock_fanout_open_ring(fds[1]); - pair_udp_open(fds_udp[0], PORT_BASE); - pair_udp_open(fds_udp[1], PORT_BASE + port_off); - sock_fanout_read(fds, rings, expect0); - - /* Send data, but not enough to overflow a queue */ - pair_udp_send(fds_udp[0], 15); - pair_udp_send(fds_udp[1], 5); - ret = sock_fanout_read(fds, rings, expect1); - - /* Send more data, overflow the queue */ - pair_udp_send(fds_udp[0], 15); - /* TODO: ensure consistent order between expect1 and expect2 */ - ret |= sock_fanout_read(fds, rings, expect2); - - if (munmap(rings[1], RING_NUM_FRAMES * getpagesize()) || - munmap(rings[0], RING_NUM_FRAMES * getpagesize())) { - fprintf(stderr, "close rings\n"); - exit(1); - } - if (close(fds_udp[1][1]) || close(fds_udp[1][0]) || - close(fds_udp[0][1]) || close(fds_udp[0][0]) || - close(fds[1]) || close(fds[0])) { - fprintf(stderr, "close datapath\n"); - exit(1); - } - - return ret; -} - -static int set_cpuaffinity(int cpuid) -{ - cpu_set_t mask; - - CPU_ZERO(&mask); - CPU_SET(cpuid, &mask); - if (sched_setaffinity(0, sizeof(mask), &mask)) { - if (errno != EINVAL) { - fprintf(stderr, "setaffinity %d\n", cpuid); - exit(1); - } - return 1; - } - - return 0; -} - -int main(int argc, char **argv) -{ - const int expect_hash[2][2] = { { 15, 5 }, { 20, 5 } }; - const int expect_hash_rb[2][2] = { { 15, 5 }, { 20, 15 } }; - const int expect_lb[2][2] = { { 10, 10 }, { 18, 17 } }; - const int expect_rb[2][2] = { { 20, 0 }, { 20, 15 } }; - const int expect_cpu0[2][2] = { { 20, 0 }, { 20, 0 } }; - const int expect_cpu1[2][2] = { { 0, 20 }, { 0, 20 } }; - int port_off = 2, tries = 5, ret; - - test_control_single(); - test_control_group(); - - /* find a set of ports that do not collide onto the same socket */ - ret = test_datapath(PACKET_FANOUT_HASH, port_off, - expect_hash[0], expect_hash[1]); - while (ret && tries--) { - fprintf(stderr, "info: trying alternate ports (%d)\n", tries); - ret = test_datapath(PACKET_FANOUT_HASH, ++port_off, - expect_hash[0], expect_hash[1]); - } - - ret |= test_datapath(PACKET_FANOUT_HASH | PACKET_FANOUT_FLAG_ROLLOVER, - port_off, expect_hash_rb[0], expect_hash_rb[1]); - ret |= test_datapath(PACKET_FANOUT_LB, - port_off, expect_lb[0], expect_lb[1]); - ret |= test_datapath(PACKET_FANOUT_ROLLOVER, - port_off, expect_rb[0], expect_rb[1]); - - set_cpuaffinity(0); - ret |= test_datapath(PACKET_FANOUT_CPU, port_off, - expect_cpu0[0], expect_cpu0[1]); - if (!set_cpuaffinity(1)) - /* TODO: test that choice alternates with previous */ - ret |= test_datapath(PACKET_FANOUT_CPU, port_off, - expect_cpu1[0], expect_cpu1[1]); - - if (ret) - return 1; - - printf("OK. All tests passed\n"); - return 0; -} diff --git a/net/psock_lib.h b/net/psock_lib.h deleted file mode 100644 index 37da54a..0000000 --- a/net/psock_lib.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright 2013 Google Inc. - * Author: Willem de Bruijn <willemb@google.com> - * Daniel Borkmann <dborkman@redhat.com> - * - * License (GPLv2): - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifndef PSOCK_LIB_H -#define PSOCK_LIB_H - -#include <sys/types.h> -#include <sys/socket.h> -#include <string.h> -#include <arpa/inet.h> -#include <unistd.h> - -#define DATA_LEN 100 -#define DATA_CHAR 'a' - -#define PORT_BASE 8000 - -#ifndef __maybe_unused -# define __maybe_unused __attribute__ ((__unused__)) -#endif - -static __maybe_unused void pair_udp_setfilter(int fd) -{ - struct sock_filter bpf_filter[] = { - { 0x80, 0, 0, 0x00000000 }, /* LD pktlen */ - { 0x35, 0, 5, DATA_LEN }, /* JGE DATA_LEN [f goto nomatch]*/ - { 0x30, 0, 0, 0x00000050 }, /* LD ip[80] */ - { 0x15, 0, 3, DATA_CHAR }, /* JEQ DATA_CHAR [f goto nomatch]*/ - { 0x30, 0, 0, 0x00000051 }, /* LD ip[81] */ - { 0x15, 0, 1, DATA_CHAR }, /* JEQ DATA_CHAR [f goto nomatch]*/ - { 0x06, 0, 0, 0x00000060 }, /* RET match */ - { 0x06, 0, 0, 0x00000000 }, /* RET no match */ - }; - struct sock_fprog bpf_prog; - - bpf_prog.filter = bpf_filter; - bpf_prog.len = sizeof(bpf_filter) / sizeof(struct sock_filter); - if (setsockopt(fd, SOL_SOCKET, SO_ATTACH_FILTER, &bpf_prog, - sizeof(bpf_prog))) { - perror("setsockopt SO_ATTACH_FILTER"); - exit(1); - } -} - -static __maybe_unused void pair_udp_open(int fds[], uint16_t port) -{ - struct sockaddr_in saddr, daddr; - - fds[0] = socket(PF_INET, SOCK_DGRAM, 0); - fds[1] = socket(PF_INET, SOCK_DGRAM, 0); - if (fds[0] == -1 || fds[1] == -1) { - fprintf(stderr, "ERROR: socket dgram\n"); - exit(1); - } - - memset(&saddr, 0, sizeof(saddr)); - saddr.sin_family = AF_INET; - saddr.sin_port = htons(port); - saddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - - memset(&daddr, 0, sizeof(daddr)); - daddr.sin_family = AF_INET; - daddr.sin_port = htons(port + 1); - daddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - - /* must bind both to get consistent hash result */ - if (bind(fds[1], (void *) &daddr, sizeof(daddr))) { - perror("bind"); - exit(1); - } - if (bind(fds[0], (void *) &saddr, sizeof(saddr))) { - perror("bind"); - exit(1); - } - if (connect(fds[0], (void *) &daddr, sizeof(daddr))) { - perror("connect"); - exit(1); - } -} - -static __maybe_unused void pair_udp_send(int fds[], int num) -{ - char buf[DATA_LEN], rbuf[DATA_LEN]; - - memset(buf, DATA_CHAR, sizeof(buf)); - while (num--) { - /* Should really handle EINTR and EAGAIN */ - if (write(fds[0], buf, sizeof(buf)) != sizeof(buf)) { - fprintf(stderr, "ERROR: send failed left=%d\n", num); - exit(1); - } - if (read(fds[1], rbuf, sizeof(rbuf)) != sizeof(rbuf)) { - fprintf(stderr, "ERROR: recv failed left=%d\n", num); - exit(1); - } - if (memcmp(buf, rbuf, sizeof(buf))) { - fprintf(stderr, "ERROR: data failed left=%d\n", num); - exit(1); - } - } -} - -static __maybe_unused void pair_udp_close(int fds[]) -{ - close(fds[0]); - close(fds[1]); -} - -#endif /* PSOCK_LIB_H */ diff --git a/net/psock_tpacket.c b/net/psock_tpacket.c deleted file mode 100644 index 24adf70..0000000 --- a/net/psock_tpacket.c +++ /dev/null @@ -1,805 +0,0 @@ -/* - * Copyright 2013 Red Hat, Inc. - * Author: Daniel Borkmann <dborkman@redhat.com> - * Chetan Loke <loke.chetan@gmail.com> (TPACKET_V3 usage example) - * - * A basic test of packet socket's TPACKET_V1/TPACKET_V2/TPACKET_V3 behavior. - * - * Control: - * Test the setup of the TPACKET socket with different patterns that are - * known to fail (TODO) resp. succeed (OK). - * - * Datapath: - * Open a pair of packet sockets and send resp. receive an a priori known - * packet pattern accross the sockets and check if it was received resp. - * sent correctly. Fanout in combination with RX_RING is currently not - * tested here. - * - * The test currently runs for - * - TPACKET_V1: RX_RING, TX_RING - * - TPACKET_V2: RX_RING, TX_RING - * - TPACKET_V3: RX_RING - * - * License (GPLv2): - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/socket.h> -#include <sys/mman.h> -#include <linux/if_packet.h> -#include <linux/filter.h> -#include <ctype.h> -#include <fcntl.h> -#include <unistd.h> -#include <bits/wordsize.h> -#include <net/ethernet.h> -#include <netinet/ip.h> -#include <arpa/inet.h> -#include <stdint.h> -#include <string.h> -#include <assert.h> -#include <net/if.h> -#include <inttypes.h> -#include <poll.h> - -#include "psock_lib.h" - -#ifndef bug_on -# define bug_on(cond) assert(!(cond)) -#endif - -#ifndef __aligned_tpacket -# define __aligned_tpacket __attribute__((aligned(TPACKET_ALIGNMENT))) -#endif - -#ifndef __align_tpacket -# define __align_tpacket(x) __attribute__((aligned(TPACKET_ALIGN(x)))) -#endif - -#define NUM_PACKETS 100 -#define ALIGN_8(x) (((x) + 8 - 1) & ~(8 - 1)) - -struct ring { - struct iovec *rd; - uint8_t *mm_space; - size_t mm_len, rd_len; - struct sockaddr_ll ll; - void (*walk)(int sock, struct ring *ring); - int type, rd_num, flen, version; - union { - struct tpacket_req req; - struct tpacket_req3 req3; - }; -}; - -struct block_desc { - uint32_t version; - uint32_t offset_to_priv; - struct tpacket_hdr_v1 h1; -}; - -union frame_map { - struct { - struct tpacket_hdr tp_h __aligned_tpacket; - struct sockaddr_ll s_ll __align_tpacket(sizeof(struct tpacket_hdr)); - } *v1; - struct { - struct tpacket2_hdr tp_h __aligned_tpacket; - struct sockaddr_ll s_ll __align_tpacket(sizeof(struct tpacket2_hdr)); - } *v2; - void *raw; -}; - -static unsigned int total_packets, total_bytes; - -static int pfsocket(int ver) -{ - int ret, sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); - if (sock == -1) { - perror("socket"); - exit(1); - } - - ret = setsockopt(sock, SOL_PACKET, PACKET_VERSION, &ver, sizeof(ver)); - if (ret == -1) { - perror("setsockopt"); - exit(1); - } - - return sock; -} - -static void status_bar_update(void) -{ - if (total_packets % 10 == 0) { - fprintf(stderr, "."); - fflush(stderr); - } -} - -static void test_payload(void *pay, size_t len) -{ - struct ethhdr *eth = pay; - - if (len < sizeof(struct ethhdr)) { - fprintf(stderr, "test_payload: packet too " - "small: %zu bytes!\n", len); - exit(1); - } - - if (eth->h_proto != htons(ETH_P_IP)) { - fprintf(stderr, "test_payload: wrong ethernet " - "type: 0x%x!\n", ntohs(eth->h_proto)); - exit(1); - } -} - -static void create_payload(void *pay, size_t *len) -{ - int i; - struct ethhdr *eth = pay; - struct iphdr *ip = pay + sizeof(*eth); - - /* Lets create some broken crap, that still passes - * our BPF filter. - */ - - *len = DATA_LEN + 42; - - memset(pay, 0xff, ETH_ALEN * 2); - eth->h_proto = htons(ETH_P_IP); - - for (i = 0; i < sizeof(*ip); ++i) - ((uint8_t *) pay)[i + sizeof(*eth)] = (uint8_t) rand(); - - ip->ihl = 5; - ip->version = 4; - ip->protocol = 0x11; - ip->frag_off = 0; - ip->ttl = 64; - ip->tot_len = htons((uint16_t) *len - sizeof(*eth)); - - ip->saddr = htonl(INADDR_LOOPBACK); - ip->daddr = htonl(INADDR_LOOPBACK); - - memset(pay + sizeof(*eth) + sizeof(*ip), - DATA_CHAR, DATA_LEN); -} - -static inline int __v1_rx_kernel_ready(struct tpacket_hdr *hdr) -{ - return ((hdr->tp_status & TP_STATUS_USER) == TP_STATUS_USER); -} - -static inline void __v1_rx_user_ready(struct tpacket_hdr *hdr) -{ - hdr->tp_status = TP_STATUS_KERNEL; - __sync_synchronize(); -} - -static inline int __v2_rx_kernel_ready(struct tpacket2_hdr *hdr) -{ - return ((hdr->tp_status & TP_STATUS_USER) == TP_STATUS_USER); -} - -static inline void __v2_rx_user_ready(struct tpacket2_hdr *hdr) -{ - hdr->tp_status = TP_STATUS_KERNEL; - __sync_synchronize(); -} - -static inline int __v1_v2_rx_kernel_ready(void *base, int version) -{ - switch (version) { - case TPACKET_V1: - return __v1_rx_kernel_ready(base); - case TPACKET_V2: - return __v2_rx_kernel_ready(base); - default: - bug_on(1); - return 0; - } -} - -static inline void __v1_v2_rx_user_ready(void *base, int version) -{ - switch (version) { - case TPACKET_V1: - __v1_rx_user_ready(base); - break; - case TPACKET_V2: - __v2_rx_user_ready(base); - break; - } -} - -static void walk_v1_v2_rx(int sock, struct ring *ring) -{ - struct pollfd pfd; - int udp_sock[2]; - union frame_map ppd; - unsigned int frame_num = 0; - - bug_on(ring->type != PACKET_RX_RING); - - pair_udp_open(udp_sock, PORT_BASE); - pair_udp_setfilter(sock); - - memset(&pfd, 0, sizeof(pfd)); - pfd.fd = sock; - pfd.events = POLLIN | POLLERR; - pfd.revents = 0; - - pair_udp_send(udp_sock, NUM_PACKETS); - - while (total_packets < NUM_PACKETS * 2) { - while (__v1_v2_rx_kernel_ready(ring->rd[frame_num].iov_base, - ring->version)) { - ppd.raw = ring->rd[frame_num].iov_base; - - switch (ring->version) { - case TPACKET_V1: - test_payload((uint8_t *) ppd.raw + ppd.v1->tp_h.tp_mac, - ppd.v1->tp_h.tp_snaplen); - total_bytes += ppd.v1->tp_h.tp_snaplen; - break; - - case TPACKET_V2: - test_payload((uint8_t *) ppd.raw + ppd.v2->tp_h.tp_mac, - ppd.v2->tp_h.tp_snaplen); - total_bytes += ppd.v2->tp_h.tp_snaplen; - break; - } - - status_bar_update(); - total_packets++; - - __v1_v2_rx_user_ready(ppd.raw, ring->version); - - frame_num = (frame_num + 1) % ring->rd_num; - } - - poll(&pfd, 1, 1); - } - - pair_udp_close(udp_sock); - - if (total_packets != 2 * NUM_PACKETS) { - fprintf(stderr, "walk_v%d_rx: received %u out of %u pkts\n", - ring->version, total_packets, NUM_PACKETS); - exit(1); - } - - fprintf(stderr, " %u pkts (%u bytes)", NUM_PACKETS, total_bytes >> 1); -} - -static inline int __v1_tx_kernel_ready(struct tpacket_hdr *hdr) -{ - return !(hdr->tp_status & (TP_STATUS_SEND_REQUEST | TP_STATUS_SENDING)); -} - -static inline void __v1_tx_user_ready(struct tpacket_hdr *hdr) -{ - hdr->tp_status = TP_STATUS_SEND_REQUEST; - __sync_synchronize(); -} - -static inline int __v2_tx_kernel_ready(struct tpacket2_hdr *hdr) -{ - return !(hdr->tp_status & (TP_STATUS_SEND_REQUEST | TP_STATUS_SENDING)); -} - -static inline void __v2_tx_user_ready(struct tpacket2_hdr *hdr) -{ - hdr->tp_status = TP_STATUS_SEND_REQUEST; - __sync_synchronize(); -} - -static inline int __v1_v2_tx_kernel_ready(void *base, int version) -{ - switch (version) { - case TPACKET_V1: - return __v1_tx_kernel_ready(base); - case TPACKET_V2: - return __v2_tx_kernel_ready(base); - default: - bug_on(1); - return 0; - } -} - -static inline void __v1_v2_tx_user_ready(void *base, int version) -{ - switch (version) { - case TPACKET_V1: - __v1_tx_user_ready(base); - break; - case TPACKET_V2: - __v2_tx_user_ready(base); - break; - } -} - -static void __v1_v2_set_packet_loss_discard(int sock) -{ - int ret, discard = 1; - - ret = setsockopt(sock, SOL_PACKET, PACKET_LOSS, (void *) &discard, - sizeof(discard)); - if (ret == -1) { - perror("setsockopt"); - exit(1); - } -} - -static void walk_v1_v2_tx(int sock, struct ring *ring) -{ - struct pollfd pfd; - int rcv_sock, ret; - size_t packet_len; - union frame_map ppd; - char packet[1024]; - unsigned int frame_num = 0, got = 0; - struct sockaddr_ll ll = { - .sll_family = PF_PACKET, - .sll_halen = ETH_ALEN, - }; - - bug_on(ring->type != PACKET_TX_RING); - bug_on(ring->rd_num < NUM_PACKETS); - - rcv_sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); - if (rcv_sock == -1) { - perror("socket"); - exit(1); - } - - pair_udp_setfilter(rcv_sock); - - ll.sll_ifindex = if_nametoindex("lo"); - ret = bind(rcv_sock, (struct sockaddr *) &ll, sizeof(ll)); - if (ret == -1) { - perror("bind"); - exit(1); - } - - memset(&pfd, 0, sizeof(pfd)); - pfd.fd = sock; - pfd.events = POLLOUT | POLLERR; - pfd.revents = 0; - - total_packets = NUM_PACKETS; - create_payload(packet, &packet_len); - - while (total_packets > 0) { - while (__v1_v2_tx_kernel_ready(ring->rd[frame_num].iov_base, - ring->version) && - total_packets > 0) { - ppd.raw = ring->rd[frame_num].iov_base; - - switch (ring->version) { - case TPACKET_V1: - ppd.v1->tp_h.tp_snaplen = packet_len; - ppd.v1->tp_h.tp_len = packet_len; - - memcpy((uint8_t *) ppd.raw + TPACKET_HDRLEN - - sizeof(struct sockaddr_ll), packet, - packet_len); - total_bytes += ppd.v1->tp_h.tp_snaplen; - break; - - case TPACKET_V2: - ppd.v2->tp_h.tp_snaplen = packet_len; - ppd.v2->tp_h.tp_len = packet_len; - - memcpy((uint8_t *) ppd.raw + TPACKET2_HDRLEN - - sizeof(struct sockaddr_ll), packet, - packet_len); - total_bytes += ppd.v2->tp_h.tp_snaplen; - break; - } - - status_bar_update(); - total_packets--; - - __v1_v2_tx_user_ready(ppd.raw, ring->version); - - frame_num = (frame_num + 1) % ring->rd_num; - } - - poll(&pfd, 1, 1); - } - - bug_on(total_packets != 0); - - ret = sendto(sock, NULL, 0, 0, NULL, 0); - if (ret == -1) { - perror("sendto"); - exit(1); - } - - while ((ret = recvfrom(rcv_sock, packet, sizeof(packet), - 0, NULL, NULL)) > 0 && - total_packets < NUM_PACKETS) { - got += ret; - test_payload(packet, ret); - - status_bar_update(); - total_packets++; - } - - close(rcv_sock); - - if (total_packets != NUM_PACKETS) { - fprintf(stderr, "walk_v%d_rx: received %u out of %u pkts\n", - ring->version, total_packets, NUM_PACKETS); - exit(1); - } - - fprintf(stderr, " %u pkts (%u bytes)", NUM_PACKETS, got); -} - -static void walk_v1_v2(int sock, struct ring *ring) -{ - if (ring->type == PACKET_RX_RING) - walk_v1_v2_rx(sock, ring); - else - walk_v1_v2_tx(sock, ring); -} - -static uint64_t __v3_prev_block_seq_num = 0; - -void __v3_test_block_seq_num(struct block_desc *pbd) -{ - if (__v3_prev_block_seq_num + 1 != pbd->h1.seq_num) { - fprintf(stderr, "\nprev_block_seq_num:%"PRIu64", expected " - "seq:%"PRIu64" != actual seq:%"PRIu64"\n", - __v3_prev_block_seq_num, __v3_prev_block_seq_num + 1, - (uint64_t) pbd->h1.seq_num); - exit(1); - } - - __v3_prev_block_seq_num = pbd->h1.seq_num; -} - -static void __v3_test_block_len(struct block_desc *pbd, uint32_t bytes, int block_num) -{ - if (pbd->h1.num_pkts && bytes != pbd->h1.blk_len) { - fprintf(stderr, "\nblock:%u with %upackets, expected " - "len:%u != actual len:%u\n", block_num, - pbd->h1.num_pkts, bytes, pbd->h1.blk_len); - exit(1); - } -} - -static void __v3_test_block_header(struct block_desc *pbd, const int block_num) -{ - if ((pbd->h1.block_status & TP_STATUS_USER) == 0) { - fprintf(stderr, "\nblock %u: not in TP_STATUS_USER\n", block_num); - exit(1); - } - - __v3_test_block_seq_num(pbd); -} - -static void __v3_walk_block(struct block_desc *pbd, const int block_num) -{ - int num_pkts = pbd->h1.num_pkts, i; - unsigned long bytes = 0, bytes_with_padding = ALIGN_8(sizeof(*pbd)); - struct tpacket3_hdr *ppd; - - __v3_test_block_header(pbd, block_num); - - ppd = (struct tpacket3_hdr *) ((uint8_t *) pbd + - pbd->h1.offset_to_first_pkt); - - for (i = 0; i < num_pkts; ++i) { - bytes += ppd->tp_snaplen; - - if (ppd->tp_next_offset) - bytes_with_padding += ppd->tp_next_offset; - else - bytes_with_padding += ALIGN_8(ppd->tp_snaplen + ppd->tp_mac); - - test_payload((uint8_t *) ppd + ppd->tp_mac, ppd->tp_snaplen); - - status_bar_update(); - total_packets++; - - ppd = (struct tpacket3_hdr *) ((uint8_t *) ppd + ppd->tp_next_offset); - __sync_synchronize(); - } - - __v3_test_block_len(pbd, bytes_with_padding, block_num); - total_bytes += bytes; -} - -void __v3_flush_block(struct block_desc *pbd) -{ - pbd->h1.block_status = TP_STATUS_KERNEL; - __sync_synchronize(); -} - -static void walk_v3_rx(int sock, struct ring *ring) -{ - unsigned int block_num = 0; - struct pollfd pfd; - struct block_desc *pbd; - int udp_sock[2]; - - bug_on(ring->type != PACKET_RX_RING); - - pair_udp_open(udp_sock, PORT_BASE); - pair_udp_setfilter(sock); - - memset(&pfd, 0, sizeof(pfd)); - pfd.fd = sock; - pfd.events = POLLIN | POLLERR; - pfd.revents = 0; - - pair_udp_send(udp_sock, NUM_PACKETS); - - while (total_packets < NUM_PACKETS * 2) { - pbd = (struct block_desc *) ring->rd[block_num].iov_base; - - while ((pbd->h1.block_status & TP_STATUS_USER) == 0) - poll(&pfd, 1, 1); - - __v3_walk_block(pbd, block_num); - __v3_flush_block(pbd); - - block_num = (block_num + 1) % ring->rd_num; - } - - pair_udp_close(udp_sock); - - if (total_packets != 2 * NUM_PACKETS) { - fprintf(stderr, "walk_v3_rx: received %u out of %u pkts\n", - total_packets, NUM_PACKETS); - exit(1); - } - - fprintf(stderr, " %u pkts (%u bytes)", NUM_PACKETS, total_bytes >> 1); -} - -static void walk_v3(int sock, struct ring *ring) -{ - if (ring->type == PACKET_RX_RING) - walk_v3_rx(sock, ring); - else - bug_on(1); -} - -static void __v1_v2_fill(struct ring *ring, unsigned int blocks) -{ - ring->req.tp_block_size = getpagesize() << 2; - ring->req.tp_frame_size = TPACKET_ALIGNMENT << 7; - ring->req.tp_block_nr = blocks; - - ring->req.tp_frame_nr = ring->req.tp_block_size / - ring->req.tp_frame_size * - ring->req.tp_block_nr; - - ring->mm_len = ring->req.tp_block_size * ring->req.tp_block_nr; - ring->walk = walk_v1_v2; - ring->rd_num = ring->req.tp_frame_nr; - ring->flen = ring->req.tp_frame_size; -} - -static void __v3_fill(struct ring *ring, unsigned int blocks) -{ - ring->req3.tp_retire_blk_tov = 64; - ring->req3.tp_sizeof_priv = 0; - ring->req3.tp_feature_req_word = TP_FT_REQ_FILL_RXHASH; - - ring->req3.tp_block_size = getpagesize() << 2; - ring->req3.tp_frame_size = TPACKET_ALIGNMENT << 7; - ring->req3.tp_block_nr = blocks; - - ring->req3.tp_frame_nr = ring->req3.tp_block_size / - ring->req3.tp_frame_size * - ring->req3.tp_block_nr; - - ring->mm_len = ring->req3.tp_block_size * ring->req3.tp_block_nr; - ring->walk = walk_v3; - ring->rd_num = ring->req3.tp_block_nr; - ring->flen = ring->req3.tp_block_size; -} - -static void setup_ring(int sock, struct ring *ring, int version, int type) -{ - int ret = 0; - unsigned int blocks = 256; - - ring->type = type; - ring->version = version; - - switch (version) { - case TPACKET_V1: - case TPACKET_V2: - if (type == PACKET_TX_RING) - __v1_v2_set_packet_loss_discard(sock); - __v1_v2_fill(ring, blocks); - ret = setsockopt(sock, SOL_PACKET, type, &ring->req, - sizeof(ring->req)); - break; - - case TPACKET_V3: - __v3_fill(ring, blocks); - ret = setsockopt(sock, SOL_PACKET, type, &ring->req3, - sizeof(ring->req3)); - break; - } - - if (ret == -1) { - perror("setsockopt"); - exit(1); - } - - ring->rd_len = ring->rd_num * sizeof(*ring->rd); - ring->rd = malloc(ring->rd_len); - if (ring->rd == NULL) { - perror("malloc"); - exit(1); - } - - total_packets = 0; - total_bytes = 0; -} - -static void mmap_ring(int sock, struct ring *ring) -{ - int i; - - ring->mm_space = mmap(0, ring->mm_len, PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_LOCKED | MAP_POPULATE, sock, 0); - if (ring->mm_space == MAP_FAILED) { - perror("mmap"); - exit(1); - } - - memset(ring->rd, 0, ring->rd_len); - for (i = 0; i < ring->rd_num; ++i) { - ring->rd[i].iov_base = ring->mm_space + (i * ring->flen); - ring->rd[i].iov_len = ring->flen; - } -} - -static void bind_ring(int sock, struct ring *ring) -{ - int ret; - - ring->ll.sll_family = PF_PACKET; - ring->ll.sll_protocol = htons(ETH_P_ALL); - ring->ll.sll_ifindex = if_nametoindex("lo"); - ring->ll.sll_hatype = 0; - ring->ll.sll_pkttype = 0; - ring->ll.sll_halen = 0; - - ret = bind(sock, (struct sockaddr *) &ring->ll, sizeof(ring->ll)); - if (ret == -1) { - perror("bind"); - exit(1); - } -} - -static void walk_ring(int sock, struct ring *ring) -{ - ring->walk(sock, ring); -} - -static void unmap_ring(int sock, struct ring *ring) -{ - munmap(ring->mm_space, ring->mm_len); - free(ring->rd); -} - -static int test_kernel_bit_width(void) -{ - char in[512], *ptr; - int num = 0, fd; - ssize_t ret; - - fd = open("/proc/kallsyms", O_RDONLY); - if (fd == -1) { - perror("open"); - exit(1); - } - - ret = read(fd, in, sizeof(in)); - if (ret <= 0) { - perror("read"); - exit(1); - } - - close(fd); - - ptr = in; - while(!isspace(*ptr)) { - num++; - ptr++; - } - - return num * 4; -} - -static int test_user_bit_width(void) -{ - return __WORDSIZE; -} - -static const char *tpacket_str[] = { - [TPACKET_V1] = "TPACKET_V1", - [TPACKET_V2] = "TPACKET_V2", - [TPACKET_V3] = "TPACKET_V3", -}; - -static const char *type_str[] = { - [PACKET_RX_RING] = "PACKET_RX_RING", - [PACKET_TX_RING] = "PACKET_TX_RING", -}; - -static int test_tpacket(int version, int type) -{ - int sock; - struct ring ring; - - fprintf(stderr, "test: %s with %s ", tpacket_str[version], - type_str[type]); - fflush(stderr); - - if (version == TPACKET_V1 && - test_kernel_bit_width() != test_user_bit_width()) { - fprintf(stderr, "test: skip %s %s since user and kernel " - "space have different bit width\n", - tpacket_str[version], type_str[type]); - return 0; - } - - sock = pfsocket(version); - memset(&ring, 0, sizeof(ring)); - setup_ring(sock, &ring, version, type); - mmap_ring(sock, &ring); - bind_ring(sock, &ring); - walk_ring(sock, &ring); - unmap_ring(sock, &ring); - close(sock); - - fprintf(stderr, "\n"); - return 0; -} - -int main(void) -{ - int ret = 0; - - ret |= test_tpacket(TPACKET_V1, PACKET_RX_RING); - ret |= test_tpacket(TPACKET_V1, PACKET_TX_RING); - - ret |= test_tpacket(TPACKET_V2, PACKET_RX_RING); - ret |= test_tpacket(TPACKET_V2, PACKET_TX_RING); - - ret |= test_tpacket(TPACKET_V3, PACKET_RX_RING); - - if (ret) - return 1; - - printf("OK. All tests passed\n"); - return 0; -} diff --git a/net/run_afpackettests b/net/run_afpackettests deleted file mode 100644 index 5246e78..0000000 --- a/net/run_afpackettests +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh - -if [ $(id -u) != 0 ]; then - echo $msg must be run as root >&2 - exit 0 -fi - -echo "--------------------" -echo "running psock_fanout test" -echo "--------------------" -./psock_fanout -if [ $? -ne 0 ]; then - echo "[FAIL]" -else - echo "[PASS]" -fi - -echo "--------------------" -echo "running psock_tpacket test" -echo "--------------------" -./psock_tpacket -if [ $? -ne 0 ]; then - echo "[FAIL]" -else - echo "[PASS]" -fi diff --git a/net/run_netsocktests b/net/run_netsocktests deleted file mode 100644 index c09a682..0000000 --- a/net/run_netsocktests +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -echo "--------------------" -echo "running socket test" -echo "--------------------" -./socket -if [ $? -ne 0 ]; then - echo "[FAIL]" -else - echo "[PASS]" -fi - diff --git a/net/socket.c b/net/socket.c deleted file mode 100644 index 0f227f2..0000000 --- a/net/socket.c +++ /dev/null @@ -1,92 +0,0 @@ -#include <stdio.h> -#include <errno.h> -#include <unistd.h> -#include <string.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> - -struct socket_testcase { - int domain; - int type; - int protocol; - - /* 0 = valid file descriptor - * -foo = error foo - */ - int expect; - - /* If non-zero, accept EAFNOSUPPORT to handle the case - * of the protocol not being configured into the kernel. - */ - int nosupport_ok; -}; - -static struct socket_testcase tests[] = { - { AF_MAX, 0, 0, -EAFNOSUPPORT, 0 }, - { AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 1 }, - { AF_INET, SOCK_DGRAM, IPPROTO_TCP, -EPROTONOSUPPORT, 1 }, - { AF_INET, SOCK_DGRAM, IPPROTO_UDP, 0, 1 }, - { AF_INET, SOCK_STREAM, IPPROTO_UDP, -EPROTONOSUPPORT, 1 }, -}; - -#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) -#define ERR_STRING_SZ 64 - -static int run_tests(void) -{ - char err_string1[ERR_STRING_SZ]; - char err_string2[ERR_STRING_SZ]; - int i, err; - - err = 0; - for (i = 0; i < ARRAY_SIZE(tests); i++) { - struct socket_testcase *s = &tests[i]; - int fd; - - fd = socket(s->domain, s->type, s->protocol); - if (fd < 0) { - if (s->nosupport_ok && - errno == EAFNOSUPPORT) - continue; - - if (s->expect < 0 && - errno == -s->expect) - continue; - - strerror_r(-s->expect, err_string1, ERR_STRING_SZ); - strerror_r(errno, err_string2, ERR_STRING_SZ); - - fprintf(stderr, "socket(%d, %d, %d) expected " - "err (%s) got (%s)\n", - s->domain, s->type, s->protocol, - err_string1, err_string2); - - err = -1; - break; - } else { - close(fd); - - if (s->expect < 0) { - strerror_r(errno, err_string1, ERR_STRING_SZ); - - fprintf(stderr, "socket(%d, %d, %d) expected " - "success got err (%s)\n", - s->domain, s->type, s->protocol, - err_string1); - - err = -1; - break; - } - } - } - - return err; -} - -int main(void) -{ - int err = run_tests(); - - return err; -} diff --git a/powerpc/Makefile b/powerpc/Makefile deleted file mode 100644 index 54833a7..0000000 --- a/powerpc/Makefile +++ /dev/null @@ -1,39 +0,0 @@ -# Makefile for powerpc selftests - -# ARCH can be overridden by the user for cross compiling -ARCH ?= $(shell uname -m) -ARCH := $(shell echo $(ARCH) | sed -e s/ppc.*/powerpc/) - -ifeq ($(ARCH),powerpc) - -GIT_VERSION = $(shell git describe --always --long --dirty || echo "unknown") - -CC := $(CROSS_COMPILE)$(CC) -CFLAGS := -Wall -O2 -flto -Wall -Werror -DGIT_VERSION='"$(GIT_VERSION)"' -I$(CURDIR) $(CFLAGS) - -export CC CFLAGS - -TARGETS = pmu copyloops mm tm - -endif - -all: - @for TARGET in $(TARGETS); do \ - $(MAKE) -C $$TARGET all; \ - done; - -run_tests: all - @for TARGET in $(TARGETS); do \ - $(MAKE) -C $$TARGET run_tests; \ - done; - -clean: - @for TARGET in $(TARGETS); do \ - $(MAKE) -C $$TARGET clean; \ - done; - rm -f tags - -tags: - find . -name '*.c' -o -name '*.h' | xargs ctags - -.PHONY: all run_tests clean tags diff --git a/powerpc/copyloops/Makefile b/powerpc/copyloops/Makefile deleted file mode 100644 index 6f2d3be..0000000 --- a/powerpc/copyloops/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -# The loops are all 64-bit code -CFLAGS += -m64 -CFLAGS += -I$(CURDIR) -CFLAGS += -D SELFTEST - -# Use our CFLAGS for the implicit .S rule -ASFLAGS = $(CFLAGS) - -PROGS := copyuser_64 copyuser_power7 memcpy_64 memcpy_power7 -EXTRA_SOURCES := validate.c ../harness.c - -all: $(PROGS) - -copyuser_64: CPPFLAGS += -D COPY_LOOP=test___copy_tofrom_user_base -copyuser_power7: CPPFLAGS += -D COPY_LOOP=test___copy_tofrom_user_power7 -memcpy_64: CPPFLAGS += -D COPY_LOOP=test_memcpy -memcpy_power7: CPPFLAGS += -D COPY_LOOP=test_memcpy_power7 - -$(PROGS): $(EXTRA_SOURCES) - -run_tests: all - @-for PROG in $(PROGS); do \ - ./$$PROG; \ - done; - -clean: - rm -f $(PROGS) *.o - -.PHONY: all run_tests clean diff --git a/powerpc/copyloops/asm/ppc_asm.h b/powerpc/copyloops/asm/ppc_asm.h deleted file mode 100644 index d1dc374..0000000 --- a/powerpc/copyloops/asm/ppc_asm.h +++ /dev/null @@ -1,89 +0,0 @@ -#include <ppc-asm.h> - -#define CONFIG_ALTIVEC - -#define r1 1 - -#define vr0 0 -#define vr1 1 -#define vr2 2 -#define vr3 3 -#define vr4 4 -#define vr5 5 -#define vr6 6 -#define vr7 7 -#define vr8 8 -#define vr9 9 -#define vr10 10 -#define vr11 11 -#define vr12 12 -#define vr13 13 -#define vr14 14 -#define vr15 15 -#define vr16 16 -#define vr17 17 -#define vr18 18 -#define vr19 19 -#define vr20 20 -#define vr21 21 -#define vr22 22 -#define vr23 23 -#define vr24 24 -#define vr25 25 -#define vr26 26 -#define vr27 27 -#define vr28 28 -#define vr29 29 -#define vr30 30 -#define vr31 31 - -#define R14 r14 -#define R15 r15 -#define R16 r16 -#define R17 r17 -#define R18 r18 -#define R19 r19 -#define R20 r20 -#define R21 r21 -#define R22 r22 -#define R29 r29 -#define R30 r30 -#define R31 r31 - -#define STACKFRAMESIZE 256 -#define STK_REG(i) (112 + ((i)-14)*8) - -#define _GLOBAL(A) FUNC_START(test_ ## A) -#define _GLOBAL_TOC(A) _GLOBAL(A) - -#define PPC_MTOCRF(A, B) mtocrf A, B - -FUNC_START(enter_vmx_usercopy) - li r3,1 - blr - -FUNC_START(exit_vmx_usercopy) - li r3,0 - blr - -FUNC_START(enter_vmx_copy) - li r3,1 - blr - -FUNC_START(exit_vmx_copy) - blr - -FUNC_START(memcpy_power7) - blr - -FUNC_START(__copy_tofrom_user_power7) - blr - -FUNC_START(__copy_tofrom_user_base) - blr - -#define BEGIN_FTR_SECTION -#define FTR_SECTION_ELSE -#define ALT_FTR_SECTION_END_IFCLR(x) -#define ALT_FTR_SECTION_END(x, y) -#define END_FTR_SECTION_IFCLR(x) diff --git a/powerpc/copyloops/asm/processor.h b/powerpc/copyloops/asm/processor.h deleted file mode 100644 index e69de29..0000000 --- a/powerpc/copyloops/asm/processor.h +++ /dev/null diff --git a/powerpc/copyloops/copyuser_64.S b/powerpc/copyloops/copyuser_64.S deleted file mode 120000 index f1c418a..0000000 --- a/powerpc/copyloops/copyuser_64.S +++ /dev/null @@ -1 +0,0 @@ -../../../../../arch/powerpc/lib/copyuser_64.S
\ No newline at end of file diff --git a/powerpc/copyloops/copyuser_power7.S b/powerpc/copyloops/copyuser_power7.S deleted file mode 120000 index 4786895..0000000 --- a/powerpc/copyloops/copyuser_power7.S +++ /dev/null @@ -1 +0,0 @@ -../../../../../arch/powerpc/lib/copyuser_power7.S
\ No newline at end of file diff --git a/powerpc/copyloops/memcpy_64.S b/powerpc/copyloops/memcpy_64.S deleted file mode 120000 index cce33fb..0000000 --- a/powerpc/copyloops/memcpy_64.S +++ /dev/null @@ -1 +0,0 @@ -../../../../../arch/powerpc/lib/memcpy_64.S
\ No newline at end of file diff --git a/powerpc/copyloops/memcpy_power7.S b/powerpc/copyloops/memcpy_power7.S deleted file mode 120000 index 0d6fbfa..0000000 --- a/powerpc/copyloops/memcpy_power7.S +++ /dev/null @@ -1 +0,0 @@ -../../../../../arch/powerpc/lib/memcpy_power7.S
\ No newline at end of file diff --git a/powerpc/copyloops/validate.c b/powerpc/copyloops/validate.c deleted file mode 100644 index 1750ff5..0000000 --- a/powerpc/copyloops/validate.c +++ /dev/null @@ -1,99 +0,0 @@ -#include <malloc.h> -#include <string.h> -#include <stdlib.h> -#include <stdbool.h> - -#include "../utils.h" - -#define MAX_LEN 8192 -#define MAX_OFFSET 16 -#define MIN_REDZONE 128 -#define BUFLEN (MAX_LEN+MAX_OFFSET+2*MIN_REDZONE) -#define POISON 0xa5 - -unsigned long COPY_LOOP(void *to, const void *from, unsigned long size); - -static void do_one(char *src, char *dst, unsigned long src_off, - unsigned long dst_off, unsigned long len, void *redzone, - void *fill) -{ - char *srcp, *dstp; - unsigned long ret; - unsigned long i; - - srcp = src + MIN_REDZONE + src_off; - dstp = dst + MIN_REDZONE + dst_off; - - memset(src, POISON, BUFLEN); - memset(dst, POISON, BUFLEN); - memcpy(srcp, fill, len); - - ret = COPY_LOOP(dstp, srcp, len); - if (ret && ret != (unsigned long)dstp) { - printf("(%p,%p,%ld) returned %ld\n", dstp, srcp, len, ret); - abort(); - } - - if (memcmp(dstp, srcp, len)) { - printf("(%p,%p,%ld) miscompare\n", dstp, srcp, len); - printf("src: "); - for (i = 0; i < len; i++) - printf("%02x ", srcp[i]); - printf("\ndst: "); - for (i = 0; i < len; i++) - printf("%02x ", dstp[i]); - printf("\n"); - abort(); - } - - if (memcmp(dst, redzone, dstp - dst)) { - printf("(%p,%p,%ld) redzone before corrupted\n", - dstp, srcp, len); - abort(); - } - - if (memcmp(dstp+len, redzone, dst+BUFLEN-(dstp+len))) { - printf("(%p,%p,%ld) redzone after corrupted\n", - dstp, srcp, len); - abort(); - } -} - -int test_copy_loop(void) -{ - char *src, *dst, *redzone, *fill; - unsigned long len, src_off, dst_off; - unsigned long i; - - src = memalign(BUFLEN, BUFLEN); - dst = memalign(BUFLEN, BUFLEN); - redzone = malloc(BUFLEN); - fill = malloc(BUFLEN); - - if (!src || !dst || !redzone || !fill) { - fprintf(stderr, "malloc failed\n"); - exit(1); - } - - memset(redzone, POISON, BUFLEN); - - /* Fill with sequential bytes */ - for (i = 0; i < BUFLEN; i++) - fill[i] = i & 0xff; - - for (len = 1; len < MAX_LEN; len++) { - for (src_off = 0; src_off < MAX_OFFSET; src_off++) { - for (dst_off = 0; dst_off < MAX_OFFSET; dst_off++) { - do_one(src, dst, src_off, dst_off, len, - redzone, fill); - } - } - } - - return 0; -} - -int main(void) -{ - return test_harness(test_copy_loop, str(COPY_LOOP)); -} diff --git a/powerpc/harness.c b/powerpc/harness.c deleted file mode 100644 index 8ebc58a..0000000 --- a/powerpc/harness.c +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright 2013, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <errno.h> -#include <signal.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <unistd.h> - -#include "subunit.h" -#include "utils.h" - -#define TIMEOUT 120 -#define KILL_TIMEOUT 5 - - -int run_test(int (test_function)(void), char *name) -{ - bool terminated; - int rc, status; - pid_t pid; - - /* Make sure output is flushed before forking */ - fflush(stdout); - - pid = fork(); - if (pid == 0) { - setpgid(0, 0); - exit(test_function()); - } else if (pid == -1) { - perror("fork"); - return 1; - } - - setpgid(pid, pid); - - /* Wake us up in timeout seconds */ - alarm(TIMEOUT); - terminated = false; - -wait: - rc = waitpid(pid, &status, 0); - if (rc == -1) { - if (errno != EINTR) { - printf("unknown error from waitpid\n"); - return 1; - } - - if (terminated) { - printf("!! force killing %s\n", name); - kill(-pid, SIGKILL); - return 1; - } else { - printf("!! killing %s\n", name); - kill(-pid, SIGTERM); - terminated = true; - alarm(KILL_TIMEOUT); - goto wait; - } - } - - /* Kill anything else in the process group that is still running */ - kill(-pid, SIGTERM); - - if (WIFEXITED(status)) - status = WEXITSTATUS(status); - else { - if (WIFSIGNALED(status)) - printf("!! child died by signal %d\n", WTERMSIG(status)); - else - printf("!! child died by unknown cause\n"); - - status = 1; /* Signal or other */ - } - - return status; -} - -static void alarm_handler(int signum) -{ - /* Jut wake us up from waitpid */ -} - -static struct sigaction alarm_action = { - .sa_handler = alarm_handler, -}; - -int test_harness(int (test_function)(void), char *name) -{ - int rc; - - test_start(name); - test_set_git_version(GIT_VERSION); - - if (sigaction(SIGALRM, &alarm_action, NULL)) { - perror("sigaction"); - test_error(name); - return 1; - } - - rc = run_test(test_function, name); - - if (rc == MAGIC_SKIP_RETURN_VALUE) - test_skip(name); - else - test_finish(name, rc); - - return rc; -} diff --git a/powerpc/mm/Makefile b/powerpc/mm/Makefile deleted file mode 100644 index 357ccbd..0000000 --- a/powerpc/mm/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -noarg: - $(MAKE) -C ../ - -PROGS := hugetlb_vs_thp_test - -all: $(PROGS) - -$(PROGS): ../harness.c - -run_tests: all - @-for PROG in $(PROGS); do \ - ./$$PROG; \ - done; - -clean: - rm -f $(PROGS) - -.PHONY: all run_tests clean diff --git a/powerpc/mm/hugetlb_vs_thp_test.c b/powerpc/mm/hugetlb_vs_thp_test.c deleted file mode 100644 index 3d8e5b0..0000000 --- a/powerpc/mm/hugetlb_vs_thp_test.c +++ /dev/null @@ -1,72 +0,0 @@ -#include <stdio.h> -#include <sys/mman.h> -#include <unistd.h> - -#include "utils.h" - -/* This must match the huge page & THP size */ -#define SIZE (16 * 1024 * 1024) - -static int test_body(void) -{ - void *addr; - char *p; - - addr = (void *)0xa0000000; - - p = mmap(addr, SIZE, PROT_READ | PROT_WRITE, - MAP_HUGETLB | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); - if (p != MAP_FAILED) { - /* - * Typically the mmap will fail because no huge pages are - * allocated on the system. But if there are huge pages - * allocated the mmap will succeed. That's fine too, we just - * munmap here before continuing. - */ - munmap(addr, SIZE); - } - - p = mmap(addr, SIZE, PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); - if (p == MAP_FAILED) { - printf("Mapping failed @ %p\n", addr); - perror("mmap"); - return 1; - } - - /* - * Either a user or kernel access is sufficient to trigger the bug. - * A kernel access is easier to spot & debug, as it will trigger the - * softlockup or RCU stall detectors, and when the system is kicked - * into xmon we get a backtrace in the kernel. - * - * A good option is: - * getcwd(p, SIZE); - * - * For the purposes of this testcase it's preferable to spin in - * userspace, so the harness can kill us if we get stuck. That way we - * see a test failure rather than a dead system. - */ - *p = 0xf; - - munmap(addr, SIZE); - - return 0; -} - -static int test_main(void) -{ - int i; - - /* 10,000 because it's a "bunch", and completes reasonably quickly */ - for (i = 0; i < 10000; i++) - if (test_body()) - return 1; - - return 0; -} - -int main(void) -{ - return test_harness(test_main, "hugetlb_vs_thp"); -} diff --git a/powerpc/pmu/Makefile b/powerpc/pmu/Makefile deleted file mode 100644 index b9ff0db..0000000 --- a/powerpc/pmu/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -noarg: - $(MAKE) -C ../ - -PROGS := count_instructions -EXTRA_SOURCES := ../harness.c event.c - -all: $(PROGS) sub_all - -$(PROGS): $(EXTRA_SOURCES) - -# loop.S can only be built 64-bit -count_instructions: loop.S count_instructions.c $(EXTRA_SOURCES) - $(CC) $(CFLAGS) -m64 -o $@ $^ - -run_tests: all sub_run_tests - @-for PROG in $(PROGS); do \ - ./$$PROG; \ - done; - -clean: sub_clean - rm -f $(PROGS) loop.o - - -SUB_TARGETS = ebb - -sub_all: - @for TARGET in $(SUB_TARGETS); do \ - $(MAKE) -C $$TARGET all; \ - done; - -sub_run_tests: all - @for TARGET in $(SUB_TARGETS); do \ - $(MAKE) -C $$TARGET run_tests; \ - done; - -sub_clean: - @for TARGET in $(SUB_TARGETS); do \ - $(MAKE) -C $$TARGET clean; \ - done; - -.PHONY: all run_tests clean sub_all sub_run_tests sub_clean diff --git a/powerpc/pmu/count_instructions.c b/powerpc/pmu/count_instructions.c deleted file mode 100644 index 312b4f0..0000000 --- a/powerpc/pmu/count_instructions.c +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2013, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#define _GNU_SOURCE - -#include <stdio.h> -#include <stdbool.h> -#include <string.h> -#include <sys/prctl.h> - -#include "event.h" -#include "utils.h" - -extern void thirty_two_instruction_loop(u64 loops); - -static void setup_event(struct event *e, u64 config, char *name) -{ - event_init_opts(e, config, PERF_TYPE_HARDWARE, name); - - e->attr.disabled = 1; - e->attr.exclude_kernel = 1; - e->attr.exclude_hv = 1; - e->attr.exclude_idle = 1; -} - -static int do_count_loop(struct event *events, u64 instructions, - u64 overhead, bool report) -{ - s64 difference, expected; - double percentage; - - prctl(PR_TASK_PERF_EVENTS_ENABLE); - - /* Run for 1M instructions */ - thirty_two_instruction_loop(instructions >> 5); - - prctl(PR_TASK_PERF_EVENTS_DISABLE); - - event_read(&events[0]); - event_read(&events[1]); - - expected = instructions + overhead; - difference = events[0].result.value - expected; - percentage = (double)difference / events[0].result.value * 100; - - if (report) { - event_report(&events[0]); - event_report(&events[1]); - - printf("Looped for %llu instructions, overhead %llu\n", instructions, overhead); - printf("Expected %llu\n", expected); - printf("Actual %llu\n", events[0].result.value); - printf("Delta %lld, %f%%\n", difference, percentage); - } - - event_reset(&events[0]); - event_reset(&events[1]); - - if (difference < 0) - difference = -difference; - - /* Tolerate a difference below 0.0001 % */ - difference *= 10000 * 100; - if (difference / events[0].result.value) - return -1; - - return 0; -} - -/* Count how many instructions it takes to do a null loop */ -static u64 determine_overhead(struct event *events) -{ - u64 current, overhead; - int i; - - do_count_loop(events, 0, 0, false); - overhead = events[0].result.value; - - for (i = 0; i < 100; i++) { - do_count_loop(events, 0, 0, false); - current = events[0].result.value; - if (current < overhead) { - printf("Replacing overhead %llu with %llu\n", overhead, current); - overhead = current; - } - } - - return overhead; -} - -static int count_instructions(void) -{ - struct event events[2]; - u64 overhead; - - setup_event(&events[0], PERF_COUNT_HW_INSTRUCTIONS, "instructions"); - setup_event(&events[1], PERF_COUNT_HW_CPU_CYCLES, "cycles"); - - if (event_open(&events[0])) { - perror("perf_event_open"); - return -1; - } - - if (event_open_with_group(&events[1], events[0].fd)) { - perror("perf_event_open"); - return -1; - } - - overhead = determine_overhead(events); - printf("Overhead of null loop: %llu instructions\n", overhead); - - /* Run for 1M instructions */ - FAIL_IF(do_count_loop(events, 0x100000, overhead, true)); - - /* Run for 10M instructions */ - FAIL_IF(do_count_loop(events, 0xa00000, overhead, true)); - - /* Run for 100M instructions */ - FAIL_IF(do_count_loop(events, 0x6400000, overhead, true)); - - /* Run for 1G instructions */ - FAIL_IF(do_count_loop(events, 0x40000000, overhead, true)); - - event_close(&events[0]); - event_close(&events[1]); - - return 0; -} - -int main(void) -{ - return test_harness(count_instructions, "count_instructions"); -} diff --git a/powerpc/pmu/ebb/Makefile b/powerpc/pmu/ebb/Makefile deleted file mode 100644 index edbba2a..0000000 --- a/powerpc/pmu/ebb/Makefile +++ /dev/null @@ -1,32 +0,0 @@ -noarg: - $(MAKE) -C ../../ - -# The EBB handler is 64-bit code and everything links against it -CFLAGS += -m64 - -PROGS := reg_access_test event_attributes_test cycles_test \ - cycles_with_freeze_test pmc56_overflow_test \ - ebb_vs_cpu_event_test cpu_event_vs_ebb_test \ - cpu_event_pinned_vs_ebb_test task_event_vs_ebb_test \ - task_event_pinned_vs_ebb_test multi_ebb_procs_test \ - multi_counter_test pmae_handling_test \ - close_clears_pmcc_test instruction_count_test \ - fork_cleanup_test ebb_on_child_test \ - ebb_on_willing_child_test back_to_back_ebbs_test \ - lost_exception_test no_handler_test - -all: $(PROGS) - -$(PROGS): ../../harness.c ../event.c ../lib.c ebb.c ebb_handler.S trace.c - -instruction_count_test: ../loop.S - -lost_exception_test: ../lib.c - -run_tests: all - @-for PROG in $(PROGS); do \ - ./$$PROG; \ - done; - -clean: - rm -f $(PROGS) diff --git a/powerpc/pmu/ebb/back_to_back_ebbs_test.c b/powerpc/pmu/ebb/back_to_back_ebbs_test.c deleted file mode 100644 index 66ea765..0000000 --- a/powerpc/pmu/ebb/back_to_back_ebbs_test.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> - -#include "ebb.h" - - -#define NUMBER_OF_EBBS 50 - -/* - * Test that if we overflow the counter while in the EBB handler, we take - * another EBB on exiting from the handler. - * - * We do this by counting with a stupidly low sample period, causing us to - * overflow the PMU while we're still in the EBB handler, leading to another - * EBB. - * - * We get out of what would otherwise be an infinite loop by leaving the - * counter frozen once we've taken enough EBBs. - */ - -static void ebb_callee(void) -{ - uint64_t siar, val; - - val = mfspr(SPRN_BESCR); - if (!(val & BESCR_PMEO)) { - ebb_state.stats.spurious++; - goto out; - } - - ebb_state.stats.ebb_count++; - trace_log_counter(ebb_state.trace, ebb_state.stats.ebb_count); - - /* Resets the PMC */ - count_pmc(1, sample_period); - -out: - if (ebb_state.stats.ebb_count == NUMBER_OF_EBBS) - /* Reset but leave counters frozen */ - reset_ebb_with_clear_mask(MMCR0_PMAO); - else - /* Unfreezes */ - reset_ebb(); - - /* Do some stuff to chew some cycles and pop the counter */ - siar = mfspr(SPRN_SIAR); - trace_log_reg(ebb_state.trace, SPRN_SIAR, siar); - - val = mfspr(SPRN_PMC1); - trace_log_reg(ebb_state.trace, SPRN_PMC1, val); - - val = mfspr(SPRN_MMCR0); - trace_log_reg(ebb_state.trace, SPRN_MMCR0, val); -} - -int back_to_back_ebbs(void) -{ - struct event event; - - event_init_named(&event, 0x1001e, "cycles"); - event_leader_ebb_init(&event); - - event.attr.exclude_kernel = 1; - event.attr.exclude_hv = 1; - event.attr.exclude_idle = 1; - - FAIL_IF(event_open(&event)); - - setup_ebb_handler(ebb_callee); - - FAIL_IF(ebb_event_enable(&event)); - - sample_period = 5; - - ebb_freeze_pmcs(); - mtspr(SPRN_PMC1, pmc_sample_period(sample_period)); - ebb_global_enable(); - ebb_unfreeze_pmcs(); - - while (ebb_state.stats.ebb_count < NUMBER_OF_EBBS) - FAIL_IF(core_busy_loop()); - - ebb_global_disable(); - ebb_freeze_pmcs(); - - count_pmc(1, sample_period); - - dump_ebb_state(); - - event_close(&event); - - FAIL_IF(ebb_state.stats.ebb_count != NUMBER_OF_EBBS); - - return 0; -} - -int main(void) -{ - return test_harness(back_to_back_ebbs, "back_to_back_ebbs"); -} diff --git a/powerpc/pmu/ebb/close_clears_pmcc_test.c b/powerpc/pmu/ebb/close_clears_pmcc_test.c deleted file mode 100644 index 0f0423d..0000000 --- a/powerpc/pmu/ebb/close_clears_pmcc_test.c +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <setjmp.h> -#include <signal.h> - -#include "ebb.h" - - -/* - * Test that closing the EBB event clears MMCR0_PMCC, preventing further access - * by userspace to the PMU hardware. - */ - -int close_clears_pmcc(void) -{ - struct event event; - - event_init_named(&event, 0x1001e, "cycles"); - event_leader_ebb_init(&event); - - FAIL_IF(event_open(&event)); - - ebb_enable_pmc_counting(1); - setup_ebb_handler(standard_ebb_callee); - ebb_global_enable(); - FAIL_IF(ebb_event_enable(&event)); - - mtspr(SPRN_PMC1, pmc_sample_period(sample_period)); - - while (ebb_state.stats.ebb_count < 1) - FAIL_IF(core_busy_loop()); - - ebb_global_disable(); - event_close(&event); - - FAIL_IF(ebb_state.stats.ebb_count == 0); - - /* The real test is here, do we take a SIGILL when writing PMU regs now - * that we have closed the event. We expect that we will. */ - - FAIL_IF(catch_sigill(write_pmc1)); - - /* We should still be able to read EBB regs though */ - mfspr(SPRN_EBBHR); - mfspr(SPRN_EBBRR); - mfspr(SPRN_BESCR); - - return 0; -} - -int main(void) -{ - return test_harness(close_clears_pmcc, "close_clears_pmcc"); -} diff --git a/powerpc/pmu/ebb/cpu_event_pinned_vs_ebb_test.c b/powerpc/pmu/ebb/cpu_event_pinned_vs_ebb_test.c deleted file mode 100644 index d3ed64d..0000000 --- a/powerpc/pmu/ebb/cpu_event_pinned_vs_ebb_test.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <stdbool.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <unistd.h> - -#include "ebb.h" - - -/* - * Tests a pinned cpu event vs an EBB - in that order. The pinned cpu event - * should remain and the EBB event should fail to enable. - */ - -static int setup_cpu_event(struct event *event, int cpu) -{ - event_init_named(event, 0x400FA, "PM_RUN_INST_CMPL"); - - event->attr.pinned = 1; - - event->attr.exclude_kernel = 1; - event->attr.exclude_hv = 1; - event->attr.exclude_idle = 1; - - SKIP_IF(require_paranoia_below(1)); - FAIL_IF(event_open_with_cpu(event, cpu)); - FAIL_IF(event_enable(event)); - - return 0; -} - -int cpu_event_pinned_vs_ebb(void) -{ - union pipe read_pipe, write_pipe; - struct event event; - int cpu, rc; - pid_t pid; - - cpu = pick_online_cpu(); - FAIL_IF(cpu < 0); - FAIL_IF(bind_to_cpu(cpu)); - - FAIL_IF(pipe(read_pipe.fds) == -1); - FAIL_IF(pipe(write_pipe.fds) == -1); - - pid = fork(); - if (pid == 0) { - /* NB order of pipes looks reversed */ - exit(ebb_child(write_pipe, read_pipe)); - } - - /* We setup the cpu event first */ - rc = setup_cpu_event(&event, cpu); - if (rc) { - kill_child_and_wait(pid); - return rc; - } - - /* Signal the child to install its EBB event and wait */ - if (sync_with_child(read_pipe, write_pipe)) - /* If it fails, wait for it to exit */ - goto wait; - - /* Signal the child to run */ - FAIL_IF(sync_with_child(read_pipe, write_pipe)); - -wait: - /* We expect it to fail to read the event */ - FAIL_IF(wait_for_child(pid) != 2); - - FAIL_IF(event_disable(&event)); - FAIL_IF(event_read(&event)); - - event_report(&event); - - /* The cpu event should have run */ - FAIL_IF(event.result.value == 0); - FAIL_IF(event.result.enabled != event.result.running); - - return 0; -} - -int main(void) -{ - return test_harness(cpu_event_pinned_vs_ebb, "cpu_event_pinned_vs_ebb"); -} diff --git a/powerpc/pmu/ebb/cpu_event_vs_ebb_test.c b/powerpc/pmu/ebb/cpu_event_vs_ebb_test.c deleted file mode 100644 index 8b972c2..0000000 --- a/powerpc/pmu/ebb/cpu_event_vs_ebb_test.c +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <stdbool.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <unistd.h> - -#include "ebb.h" - - -/* - * Tests a cpu event vs an EBB - in that order. The EBB should force the cpu - * event off the PMU. - */ - -static int setup_cpu_event(struct event *event, int cpu) -{ - event_init_named(event, 0x400FA, "PM_RUN_INST_CMPL"); - - event->attr.exclude_kernel = 1; - event->attr.exclude_hv = 1; - event->attr.exclude_idle = 1; - - SKIP_IF(require_paranoia_below(1)); - FAIL_IF(event_open_with_cpu(event, cpu)); - FAIL_IF(event_enable(event)); - - return 0; -} - -int cpu_event_vs_ebb(void) -{ - union pipe read_pipe, write_pipe; - struct event event; - int cpu, rc; - pid_t pid; - - cpu = pick_online_cpu(); - FAIL_IF(cpu < 0); - FAIL_IF(bind_to_cpu(cpu)); - - FAIL_IF(pipe(read_pipe.fds) == -1); - FAIL_IF(pipe(write_pipe.fds) == -1); - - pid = fork(); - if (pid == 0) { - /* NB order of pipes looks reversed */ - exit(ebb_child(write_pipe, read_pipe)); - } - - /* We setup the cpu event first */ - rc = setup_cpu_event(&event, cpu); - if (rc) { - kill_child_and_wait(pid); - return rc; - } - - /* Signal the child to install its EBB event and wait */ - if (sync_with_child(read_pipe, write_pipe)) - /* If it fails, wait for it to exit */ - goto wait; - - /* Signal the child to run */ - FAIL_IF(sync_with_child(read_pipe, write_pipe)); - -wait: - /* We expect the child to succeed */ - FAIL_IF(wait_for_child(pid)); - - FAIL_IF(event_disable(&event)); - FAIL_IF(event_read(&event)); - - event_report(&event); - - /* The cpu event may have run */ - - return 0; -} - -int main(void) -{ - return test_harness(cpu_event_vs_ebb, "cpu_event_vs_ebb"); -} diff --git a/powerpc/pmu/ebb/cycles_test.c b/powerpc/pmu/ebb/cycles_test.c deleted file mode 100644 index 8590fc1..0000000 --- a/powerpc/pmu/ebb/cycles_test.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <stdio.h> -#include <stdlib.h> - -#include "ebb.h" - - -/* - * Basic test that counts user cycles and takes EBBs. - */ -int cycles(void) -{ - struct event event; - - event_init_named(&event, 0x1001e, "cycles"); - event_leader_ebb_init(&event); - - event.attr.exclude_kernel = 1; - event.attr.exclude_hv = 1; - event.attr.exclude_idle = 1; - - FAIL_IF(event_open(&event)); - - ebb_enable_pmc_counting(1); - setup_ebb_handler(standard_ebb_callee); - ebb_global_enable(); - FAIL_IF(ebb_event_enable(&event)); - - mtspr(SPRN_PMC1, pmc_sample_period(sample_period)); - - while (ebb_state.stats.ebb_count < 10) { - FAIL_IF(core_busy_loop()); - FAIL_IF(ebb_check_mmcr0()); - } - - ebb_global_disable(); - ebb_freeze_pmcs(); - - count_pmc(1, sample_period); - - dump_ebb_state(); - - event_close(&event); - - FAIL_IF(ebb_state.stats.ebb_count == 0); - FAIL_IF(!ebb_check_count(1, sample_period, 100)); - - return 0; -} - -int main(void) -{ - return test_harness(cycles, "cycles"); -} diff --git a/powerpc/pmu/ebb/cycles_with_freeze_test.c b/powerpc/pmu/ebb/cycles_with_freeze_test.c deleted file mode 100644 index 754b3f2..0000000 --- a/powerpc/pmu/ebb/cycles_with_freeze_test.c +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <stdbool.h> - -#include "ebb.h" - - -/* - * Test of counting cycles while using MMCR0_FC (freeze counters) to only count - * parts of the code. This is complicated by the fact that FC is set by the - * hardware when the event overflows. We may take the EBB after we have set FC, - * so we have to be careful about whether we clear FC at the end of the EBB - * handler or not. - */ - -static bool counters_frozen = false; -static int ebbs_while_frozen = 0; - -static void ebb_callee(void) -{ - uint64_t mask, val; - - mask = MMCR0_PMAO | MMCR0_FC; - - val = mfspr(SPRN_BESCR); - if (!(val & BESCR_PMEO)) { - ebb_state.stats.spurious++; - goto out; - } - - ebb_state.stats.ebb_count++; - trace_log_counter(ebb_state.trace, ebb_state.stats.ebb_count); - - val = mfspr(SPRN_MMCR0); - trace_log_reg(ebb_state.trace, SPRN_MMCR0, val); - - if (counters_frozen) { - trace_log_string(ebb_state.trace, "frozen"); - ebbs_while_frozen++; - mask &= ~MMCR0_FC; - } - - count_pmc(1, sample_period); -out: - reset_ebb_with_clear_mask(mask); -} - -int cycles_with_freeze(void) -{ - struct event event; - uint64_t val; - bool fc_cleared; - - event_init_named(&event, 0x1001e, "cycles"); - event_leader_ebb_init(&event); - - event.attr.exclude_kernel = 1; - event.attr.exclude_hv = 1; - event.attr.exclude_idle = 1; - - FAIL_IF(event_open(&event)); - - setup_ebb_handler(ebb_callee); - ebb_global_enable(); - FAIL_IF(ebb_event_enable(&event)); - - mtspr(SPRN_PMC1, pmc_sample_period(sample_period)); - - fc_cleared = false; - - /* Make sure we loop until we take at least one EBB */ - while ((ebb_state.stats.ebb_count < 20 && !fc_cleared) || - ebb_state.stats.ebb_count < 1) - { - counters_frozen = false; - mb(); - mtspr(SPRN_MMCR0, mfspr(SPRN_MMCR0) & ~MMCR0_FC); - - FAIL_IF(core_busy_loop()); - - counters_frozen = true; - mb(); - mtspr(SPRN_MMCR0, mfspr(SPRN_MMCR0) | MMCR0_FC); - - val = mfspr(SPRN_MMCR0); - if (! (val & MMCR0_FC)) { - printf("Outside of loop, FC NOT set MMCR0 0x%lx\n", val); - fc_cleared = true; - } - } - - ebb_global_disable(); - ebb_freeze_pmcs(); - - count_pmc(1, sample_period); - - dump_ebb_state(); - - printf("EBBs while frozen %d\n", ebbs_while_frozen); - - event_close(&event); - - FAIL_IF(ebb_state.stats.ebb_count == 0); - FAIL_IF(fc_cleared); - - return 0; -} - -int main(void) -{ - return test_harness(cycles_with_freeze, "cycles_with_freeze"); -} diff --git a/powerpc/pmu/ebb/ebb.c b/powerpc/pmu/ebb/ebb.c deleted file mode 100644 index 1b46be9..0000000 --- a/powerpc/pmu/ebb/ebb.c +++ /dev/null @@ -1,727 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#define _GNU_SOURCE /* For CPU_ZERO etc. */ - -#include <sched.h> -#include <sys/wait.h> -#include <setjmp.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/ioctl.h> - -#include "trace.h" -#include "reg.h" -#include "ebb.h" - - -void (*ebb_user_func)(void); - -void ebb_hook(void) -{ - if (ebb_user_func) - ebb_user_func(); -} - -struct ebb_state ebb_state; - -u64 sample_period = 0x40000000ull; - -void reset_ebb_with_clear_mask(unsigned long mmcr0_clear_mask) -{ - u64 val; - - /* 2) clear MMCR0[PMAO] - docs say BESCR[PMEO] should do this */ - /* 3) set MMCR0[PMAE] - docs say BESCR[PME] should do this */ - val = mfspr(SPRN_MMCR0); - mtspr(SPRN_MMCR0, (val & ~mmcr0_clear_mask) | MMCR0_PMAE); - - /* 4) clear BESCR[PMEO] */ - mtspr(SPRN_BESCRR, BESCR_PMEO); - - /* 5) set BESCR[PME] */ - mtspr(SPRN_BESCRS, BESCR_PME); - - /* 6) rfebb 1 - done in our caller */ -} - -void reset_ebb(void) -{ - reset_ebb_with_clear_mask(MMCR0_PMAO | MMCR0_FC); -} - -/* Called outside of the EBB handler to check MMCR0 is sane */ -int ebb_check_mmcr0(void) -{ - u64 val; - - val = mfspr(SPRN_MMCR0); - if ((val & (MMCR0_FC | MMCR0_PMAO)) == MMCR0_FC) { - /* It's OK if we see FC & PMAO, but not FC by itself */ - printf("Outside of loop, only FC set 0x%llx\n", val); - return 1; - } - - return 0; -} - -bool ebb_check_count(int pmc, u64 sample_period, int fudge) -{ - u64 count, upper, lower; - - count = ebb_state.stats.pmc_count[PMC_INDEX(pmc)]; - - lower = ebb_state.stats.ebb_count * (sample_period - fudge); - - if (count < lower) { - printf("PMC%d count (0x%llx) below lower limit 0x%llx (-0x%llx)\n", - pmc, count, lower, lower - count); - return false; - } - - upper = ebb_state.stats.ebb_count * (sample_period + fudge); - - if (count > upper) { - printf("PMC%d count (0x%llx) above upper limit 0x%llx (+0x%llx)\n", - pmc, count, upper, count - upper); - return false; - } - - printf("PMC%d count (0x%llx) is between 0x%llx and 0x%llx delta +0x%llx/-0x%llx\n", - pmc, count, lower, upper, count - lower, upper - count); - - return true; -} - -void standard_ebb_callee(void) -{ - int found, i; - u64 val; - - val = mfspr(SPRN_BESCR); - if (!(val & BESCR_PMEO)) { - ebb_state.stats.spurious++; - goto out; - } - - ebb_state.stats.ebb_count++; - trace_log_counter(ebb_state.trace, ebb_state.stats.ebb_count); - - val = mfspr(SPRN_MMCR0); - trace_log_reg(ebb_state.trace, SPRN_MMCR0, val); - - found = 0; - for (i = 1; i <= 6; i++) { - if (ebb_state.pmc_enable[PMC_INDEX(i)]) - found += count_pmc(i, sample_period); - } - - if (!found) - ebb_state.stats.no_overflow++; - -out: - reset_ebb(); -} - -extern void ebb_handler(void); - -void setup_ebb_handler(void (*callee)(void)) -{ - u64 entry; - -#if defined(_CALL_ELF) && _CALL_ELF == 2 - entry = (u64)ebb_handler; -#else - struct opd - { - u64 entry; - u64 toc; - } *opd; - - opd = (struct opd *)ebb_handler; - entry = opd->entry; -#endif - printf("EBB Handler is at %#llx\n", entry); - - ebb_user_func = callee; - - /* Ensure ebb_user_func is set before we set the handler */ - mb(); - mtspr(SPRN_EBBHR, entry); - - /* Make sure the handler is set before we return */ - mb(); -} - -void clear_ebb_stats(void) -{ - memset(&ebb_state.stats, 0, sizeof(ebb_state.stats)); -} - -void dump_summary_ebb_state(void) -{ - printf("ebb_state:\n" \ - " ebb_count = %d\n" \ - " spurious = %d\n" \ - " negative = %d\n" \ - " no_overflow = %d\n" \ - " pmc[1] count = 0x%llx\n" \ - " pmc[2] count = 0x%llx\n" \ - " pmc[3] count = 0x%llx\n" \ - " pmc[4] count = 0x%llx\n" \ - " pmc[5] count = 0x%llx\n" \ - " pmc[6] count = 0x%llx\n", - ebb_state.stats.ebb_count, ebb_state.stats.spurious, - ebb_state.stats.negative, ebb_state.stats.no_overflow, - ebb_state.stats.pmc_count[0], ebb_state.stats.pmc_count[1], - ebb_state.stats.pmc_count[2], ebb_state.stats.pmc_count[3], - ebb_state.stats.pmc_count[4], ebb_state.stats.pmc_count[5]); -} - -static char *decode_mmcr0(u32 value) -{ - static char buf[16]; - - buf[0] = '\0'; - - if (value & (1 << 31)) - strcat(buf, "FC "); - if (value & (1 << 26)) - strcat(buf, "PMAE "); - if (value & (1 << 7)) - strcat(buf, "PMAO "); - - return buf; -} - -static char *decode_bescr(u64 value) -{ - static char buf[16]; - - buf[0] = '\0'; - - if (value & (1ull << 63)) - strcat(buf, "GE "); - if (value & (1ull << 32)) - strcat(buf, "PMAE "); - if (value & 1) - strcat(buf, "PMAO "); - - return buf; -} - -void dump_ebb_hw_state(void) -{ - u64 bescr; - u32 mmcr0; - - mmcr0 = mfspr(SPRN_MMCR0); - bescr = mfspr(SPRN_BESCR); - - printf("HW state:\n" \ - "MMCR0 0x%016x %s\n" \ - "EBBHR 0x%016lx\n" \ - "BESCR 0x%016llx %s\n" \ - "PMC1 0x%016lx\n" \ - "PMC2 0x%016lx\n" \ - "PMC3 0x%016lx\n" \ - "PMC4 0x%016lx\n" \ - "PMC5 0x%016lx\n" \ - "PMC6 0x%016lx\n" \ - "SIAR 0x%016lx\n", - mmcr0, decode_mmcr0(mmcr0), mfspr(SPRN_EBBHR), bescr, - decode_bescr(bescr), mfspr(SPRN_PMC1), mfspr(SPRN_PMC2), - mfspr(SPRN_PMC3), mfspr(SPRN_PMC4), mfspr(SPRN_PMC5), - mfspr(SPRN_PMC6), mfspr(SPRN_SIAR)); -} - -void dump_ebb_state(void) -{ - dump_summary_ebb_state(); - - dump_ebb_hw_state(); - - trace_buffer_print(ebb_state.trace); -} - -int count_pmc(int pmc, uint32_t sample_period) -{ - uint32_t start_value; - u64 val; - - /* 0) Read PMC */ - start_value = pmc_sample_period(sample_period); - - val = read_pmc(pmc); - if (val < start_value) - ebb_state.stats.negative++; - else - ebb_state.stats.pmc_count[PMC_INDEX(pmc)] += val - start_value; - - trace_log_reg(ebb_state.trace, SPRN_PMC1 + pmc - 1, val); - - /* 1) Reset PMC */ - write_pmc(pmc, start_value); - - /* Report if we overflowed */ - return val >= COUNTER_OVERFLOW; -} - -int ebb_event_enable(struct event *e) -{ - int rc; - - /* Ensure any SPR writes are ordered vs us */ - mb(); - - rc = ioctl(e->fd, PERF_EVENT_IOC_ENABLE); - if (rc) - return rc; - - rc = event_read(e); - - /* Ditto */ - mb(); - - return rc; -} - -void ebb_freeze_pmcs(void) -{ - mtspr(SPRN_MMCR0, mfspr(SPRN_MMCR0) | MMCR0_FC); - mb(); -} - -void ebb_unfreeze_pmcs(void) -{ - /* Unfreeze counters */ - mtspr(SPRN_MMCR0, mfspr(SPRN_MMCR0) & ~MMCR0_FC); - mb(); -} - -void ebb_global_enable(void) -{ - /* Enable EBBs globally and PMU EBBs */ - mtspr(SPRN_BESCR, 0x8000000100000000ull); - mb(); -} - -void ebb_global_disable(void) -{ - /* Disable EBBs & freeze counters, events are still scheduled */ - mtspr(SPRN_BESCRR, BESCR_PME); - mb(); -} - -void event_ebb_init(struct event *e) -{ - e->attr.config |= (1ull << 63); -} - -void event_bhrb_init(struct event *e, unsigned ifm) -{ - e->attr.config |= (1ull << 62) | ((u64)ifm << 60); -} - -void event_leader_ebb_init(struct event *e) -{ - event_ebb_init(e); - - e->attr.exclusive = 1; - e->attr.pinned = 1; -} - -int core_busy_loop(void) -{ - int rc; - - asm volatile ( - "li 3, 0x3030\n" - "std 3, -96(1)\n" - "li 4, 0x4040\n" - "std 4, -104(1)\n" - "li 5, 0x5050\n" - "std 5, -112(1)\n" - "li 6, 0x6060\n" - "std 6, -120(1)\n" - "li 7, 0x7070\n" - "std 7, -128(1)\n" - "li 8, 0x0808\n" - "std 8, -136(1)\n" - "li 9, 0x0909\n" - "std 9, -144(1)\n" - "li 10, 0x1010\n" - "std 10, -152(1)\n" - "li 11, 0x1111\n" - "std 11, -160(1)\n" - "li 14, 0x1414\n" - "std 14, -168(1)\n" - "li 15, 0x1515\n" - "std 15, -176(1)\n" - "li 16, 0x1616\n" - "std 16, -184(1)\n" - "li 17, 0x1717\n" - "std 17, -192(1)\n" - "li 18, 0x1818\n" - "std 18, -200(1)\n" - "li 19, 0x1919\n" - "std 19, -208(1)\n" - "li 20, 0x2020\n" - "std 20, -216(1)\n" - "li 21, 0x2121\n" - "std 21, -224(1)\n" - "li 22, 0x2222\n" - "std 22, -232(1)\n" - "li 23, 0x2323\n" - "std 23, -240(1)\n" - "li 24, 0x2424\n" - "std 24, -248(1)\n" - "li 25, 0x2525\n" - "std 25, -256(1)\n" - "li 26, 0x2626\n" - "std 26, -264(1)\n" - "li 27, 0x2727\n" - "std 27, -272(1)\n" - "li 28, 0x2828\n" - "std 28, -280(1)\n" - "li 29, 0x2929\n" - "std 29, -288(1)\n" - "li 30, 0x3030\n" - "li 31, 0x3131\n" - - "li 3, 0\n" - "0: " - "addi 3, 3, 1\n" - "cmpwi 3, 100\n" - "blt 0b\n" - - /* Return 1 (fail) unless we get through all the checks */ - "li 0, 1\n" - - /* Check none of our registers have been corrupted */ - "cmpwi 4, 0x4040\n" - "bne 1f\n" - "cmpwi 5, 0x5050\n" - "bne 1f\n" - "cmpwi 6, 0x6060\n" - "bne 1f\n" - "cmpwi 7, 0x7070\n" - "bne 1f\n" - "cmpwi 8, 0x0808\n" - "bne 1f\n" - "cmpwi 9, 0x0909\n" - "bne 1f\n" - "cmpwi 10, 0x1010\n" - "bne 1f\n" - "cmpwi 11, 0x1111\n" - "bne 1f\n" - "cmpwi 14, 0x1414\n" - "bne 1f\n" - "cmpwi 15, 0x1515\n" - "bne 1f\n" - "cmpwi 16, 0x1616\n" - "bne 1f\n" - "cmpwi 17, 0x1717\n" - "bne 1f\n" - "cmpwi 18, 0x1818\n" - "bne 1f\n" - "cmpwi 19, 0x1919\n" - "bne 1f\n" - "cmpwi 20, 0x2020\n" - "bne 1f\n" - "cmpwi 21, 0x2121\n" - "bne 1f\n" - "cmpwi 22, 0x2222\n" - "bne 1f\n" - "cmpwi 23, 0x2323\n" - "bne 1f\n" - "cmpwi 24, 0x2424\n" - "bne 1f\n" - "cmpwi 25, 0x2525\n" - "bne 1f\n" - "cmpwi 26, 0x2626\n" - "bne 1f\n" - "cmpwi 27, 0x2727\n" - "bne 1f\n" - "cmpwi 28, 0x2828\n" - "bne 1f\n" - "cmpwi 29, 0x2929\n" - "bne 1f\n" - "cmpwi 30, 0x3030\n" - "bne 1f\n" - "cmpwi 31, 0x3131\n" - "bne 1f\n" - - /* Load junk into all our registers before we reload them from the stack. */ - "li 3, 0xde\n" - "li 4, 0xad\n" - "li 5, 0xbe\n" - "li 6, 0xef\n" - "li 7, 0xde\n" - "li 8, 0xad\n" - "li 9, 0xbe\n" - "li 10, 0xef\n" - "li 11, 0xde\n" - "li 14, 0xad\n" - "li 15, 0xbe\n" - "li 16, 0xef\n" - "li 17, 0xde\n" - "li 18, 0xad\n" - "li 19, 0xbe\n" - "li 20, 0xef\n" - "li 21, 0xde\n" - "li 22, 0xad\n" - "li 23, 0xbe\n" - "li 24, 0xef\n" - "li 25, 0xde\n" - "li 26, 0xad\n" - "li 27, 0xbe\n" - "li 28, 0xef\n" - "li 29, 0xdd\n" - - "ld 3, -96(1)\n" - "cmpwi 3, 0x3030\n" - "bne 1f\n" - "ld 4, -104(1)\n" - "cmpwi 4, 0x4040\n" - "bne 1f\n" - "ld 5, -112(1)\n" - "cmpwi 5, 0x5050\n" - "bne 1f\n" - "ld 6, -120(1)\n" - "cmpwi 6, 0x6060\n" - "bne 1f\n" - "ld 7, -128(1)\n" - "cmpwi 7, 0x7070\n" - "bne 1f\n" - "ld 8, -136(1)\n" - "cmpwi 8, 0x0808\n" - "bne 1f\n" - "ld 9, -144(1)\n" - "cmpwi 9, 0x0909\n" - "bne 1f\n" - "ld 10, -152(1)\n" - "cmpwi 10, 0x1010\n" - "bne 1f\n" - "ld 11, -160(1)\n" - "cmpwi 11, 0x1111\n" - "bne 1f\n" - "ld 14, -168(1)\n" - "cmpwi 14, 0x1414\n" - "bne 1f\n" - "ld 15, -176(1)\n" - "cmpwi 15, 0x1515\n" - "bne 1f\n" - "ld 16, -184(1)\n" - "cmpwi 16, 0x1616\n" - "bne 1f\n" - "ld 17, -192(1)\n" - "cmpwi 17, 0x1717\n" - "bne 1f\n" - "ld 18, -200(1)\n" - "cmpwi 18, 0x1818\n" - "bne 1f\n" - "ld 19, -208(1)\n" - "cmpwi 19, 0x1919\n" - "bne 1f\n" - "ld 20, -216(1)\n" - "cmpwi 20, 0x2020\n" - "bne 1f\n" - "ld 21, -224(1)\n" - "cmpwi 21, 0x2121\n" - "bne 1f\n" - "ld 22, -232(1)\n" - "cmpwi 22, 0x2222\n" - "bne 1f\n" - "ld 23, -240(1)\n" - "cmpwi 23, 0x2323\n" - "bne 1f\n" - "ld 24, -248(1)\n" - "cmpwi 24, 0x2424\n" - "bne 1f\n" - "ld 25, -256(1)\n" - "cmpwi 25, 0x2525\n" - "bne 1f\n" - "ld 26, -264(1)\n" - "cmpwi 26, 0x2626\n" - "bne 1f\n" - "ld 27, -272(1)\n" - "cmpwi 27, 0x2727\n" - "bne 1f\n" - "ld 28, -280(1)\n" - "cmpwi 28, 0x2828\n" - "bne 1f\n" - "ld 29, -288(1)\n" - "cmpwi 29, 0x2929\n" - "bne 1f\n" - - /* Load 0 (success) to return */ - "li 0, 0\n" - - "1: mr %0, 0\n" - - : "=r" (rc) - : /* no inputs */ - : "3", "4", "5", "6", "7", "8", "9", "10", "11", "14", - "15", "16", "17", "18", "19", "20", "21", "22", "23", - "24", "25", "26", "27", "28", "29", "30", "31", - "memory" - ); - - return rc; -} - -int core_busy_loop_with_freeze(void) -{ - int rc; - - mtspr(SPRN_MMCR0, mfspr(SPRN_MMCR0) & ~MMCR0_FC); - rc = core_busy_loop(); - mtspr(SPRN_MMCR0, mfspr(SPRN_MMCR0) | MMCR0_FC); - - return rc; -} - -int ebb_child(union pipe read_pipe, union pipe write_pipe) -{ - struct event event; - uint64_t val; - - FAIL_IF(wait_for_parent(read_pipe)); - - event_init_named(&event, 0x1001e, "cycles"); - event_leader_ebb_init(&event); - - event.attr.exclude_kernel = 1; - event.attr.exclude_hv = 1; - event.attr.exclude_idle = 1; - - FAIL_IF(event_open(&event)); - - ebb_enable_pmc_counting(1); - setup_ebb_handler(standard_ebb_callee); - ebb_global_enable(); - - FAIL_IF(event_enable(&event)); - - if (event_read(&event)) { - /* - * Some tests expect to fail here, so don't report an error on - * this line, and return a distinguisable error code. Tell the - * parent an error happened. - */ - notify_parent_of_error(write_pipe); - return 2; - } - - mtspr(SPRN_PMC1, pmc_sample_period(sample_period)); - - FAIL_IF(notify_parent(write_pipe)); - FAIL_IF(wait_for_parent(read_pipe)); - FAIL_IF(notify_parent(write_pipe)); - - while (ebb_state.stats.ebb_count < 20) { - FAIL_IF(core_busy_loop()); - - /* To try and hit SIGILL case */ - val = mfspr(SPRN_MMCRA); - val |= mfspr(SPRN_MMCR2); - val |= mfspr(SPRN_MMCR0); - } - - ebb_global_disable(); - ebb_freeze_pmcs(); - - count_pmc(1, sample_period); - - dump_ebb_state(); - - event_close(&event); - - FAIL_IF(ebb_state.stats.ebb_count == 0); - - return 0; -} - -static jmp_buf setjmp_env; - -static void sigill_handler(int signal) -{ - printf("Took sigill\n"); - longjmp(setjmp_env, 1); -} - -static struct sigaction sigill_action = { - .sa_handler = sigill_handler, -}; - -int catch_sigill(void (*func)(void)) -{ - if (sigaction(SIGILL, &sigill_action, NULL)) { - perror("sigaction"); - return 1; - } - - if (setjmp(setjmp_env) == 0) { - func(); - return 1; - } - - return 0; -} - -void write_pmc1(void) -{ - mtspr(SPRN_PMC1, 0); -} - -void write_pmc(int pmc, u64 value) -{ - switch (pmc) { - case 1: mtspr(SPRN_PMC1, value); break; - case 2: mtspr(SPRN_PMC2, value); break; - case 3: mtspr(SPRN_PMC3, value); break; - case 4: mtspr(SPRN_PMC4, value); break; - case 5: mtspr(SPRN_PMC5, value); break; - case 6: mtspr(SPRN_PMC6, value); break; - } -} - -u64 read_pmc(int pmc) -{ - switch (pmc) { - case 1: return mfspr(SPRN_PMC1); - case 2: return mfspr(SPRN_PMC2); - case 3: return mfspr(SPRN_PMC3); - case 4: return mfspr(SPRN_PMC4); - case 5: return mfspr(SPRN_PMC5); - case 6: return mfspr(SPRN_PMC6); - } - - return 0; -} - -static void term_handler(int signal) -{ - dump_summary_ebb_state(); - dump_ebb_hw_state(); - abort(); -} - -struct sigaction term_action = { - .sa_handler = term_handler, -}; - -static void __attribute__((constructor)) ebb_init(void) -{ - clear_ebb_stats(); - - if (sigaction(SIGTERM, &term_action, NULL)) - perror("sigaction"); - - ebb_state.trace = trace_buffer_allocate(1 * 1024 * 1024); -} diff --git a/powerpc/pmu/ebb/ebb.h b/powerpc/pmu/ebb/ebb.h deleted file mode 100644 index e62bde0..0000000 --- a/powerpc/pmu/ebb/ebb.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#ifndef _SELFTESTS_POWERPC_PMU_EBB_EBB_H -#define _SELFTESTS_POWERPC_PMU_EBB_EBB_H - -#include "../event.h" -#include "../lib.h" -#include "trace.h" -#include "reg.h" - -#define PMC_INDEX(pmc) ((pmc)-1) - -#define NUM_PMC_VALUES 128 - -struct ebb_state -{ - struct { - u64 pmc_count[6]; - volatile int ebb_count; - int spurious; - int negative; - int no_overflow; - } stats; - - bool pmc_enable[6]; - struct trace_buffer *trace; -}; - -extern struct ebb_state ebb_state; - -#define COUNTER_OVERFLOW 0x80000000ull - -static inline uint32_t pmc_sample_period(uint32_t value) -{ - return COUNTER_OVERFLOW - value; -} - -static inline void ebb_enable_pmc_counting(int pmc) -{ - ebb_state.pmc_enable[PMC_INDEX(pmc)] = true; -} - -bool ebb_check_count(int pmc, u64 sample_period, int fudge); -void event_leader_ebb_init(struct event *e); -void event_ebb_init(struct event *e); -void event_bhrb_init(struct event *e, unsigned ifm); -void setup_ebb_handler(void (*callee)(void)); -void standard_ebb_callee(void); -int ebb_event_enable(struct event *e); -void ebb_global_enable(void); -void ebb_global_disable(void); -void ebb_freeze_pmcs(void); -void ebb_unfreeze_pmcs(void); -void event_ebb_init(struct event *e); -void event_leader_ebb_init(struct event *e); -int count_pmc(int pmc, uint32_t sample_period); -void dump_ebb_state(void); -void dump_summary_ebb_state(void); -void dump_ebb_hw_state(void); -void clear_ebb_stats(void); -void write_pmc(int pmc, u64 value); -u64 read_pmc(int pmc); -void reset_ebb_with_clear_mask(unsigned long mmcr0_clear_mask); -void reset_ebb(void); -int ebb_check_mmcr0(void); - -extern u64 sample_period; - -int core_busy_loop(void); -int core_busy_loop_with_freeze(void); -int ebb_child(union pipe read_pipe, union pipe write_pipe); -int catch_sigill(void (*func)(void)); -void write_pmc1(void); - -#endif /* _SELFTESTS_POWERPC_PMU_EBB_EBB_H */ diff --git a/powerpc/pmu/ebb/ebb_handler.S b/powerpc/pmu/ebb/ebb_handler.S deleted file mode 100644 index 14274ea..0000000 --- a/powerpc/pmu/ebb/ebb_handler.S +++ /dev/null @@ -1,365 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <ppc-asm.h> -#include "reg.h" - - -/* ppc-asm.h defines most of the reg aliases, but not r1/r2. */ -#define r1 1 -#define r2 2 - -#define RFEBB .long 0x4c000924 - -/* Stack layout: - * - * ^ - * User stack | - * Back chain ------+ <- r1 <-------+ - * ... | - * Red zone / ABI Gap | - * ... | - * vr63 <+ | - * vr0 | | - * VSCR | | - * FSCR | | - * r31 | Save area | - * r0 | | - * XER | | - * CTR | | - * LR | | - * CCR <+ | - * ... <+ | - * LR | Caller frame | - * CCR | | - * Back chain <+ <- updated r1 --------+ - * - */ - -#if defined(_CALL_ELF) && _CALL_ELF == 2 -#define ABIGAP 512 -#else -#define ABIGAP 288 -#endif - -#define NR_GPR 32 -#define NR_SPR 6 -#define NR_VSR 64 - -#define SAVE_AREA ((NR_GPR + NR_SPR) * 8 + (NR_VSR * 16)) -#define CALLER_FRAME 112 - -#define STACK_FRAME (ABIGAP + SAVE_AREA + CALLER_FRAME) - -#define CCR_SAVE (CALLER_FRAME) -#define LR_SAVE (CCR_SAVE + 8) -#define CTR_SAVE (LR_SAVE + 8) -#define XER_SAVE (CTR_SAVE + 8) -#define GPR_SAVE(n) (XER_SAVE + 8 + (8 * n)) -#define FSCR_SAVE (GPR_SAVE(31) + 8) -#define VSCR_SAVE (FSCR_SAVE + 8) -#define VSR_SAVE(n) (VSCR_SAVE + 8 + (16 * n)) - -#define SAVE_GPR(n) std n,GPR_SAVE(n)(r1) -#define REST_GPR(n) ld n,GPR_SAVE(n)(r1) -#define TRASH_GPR(n) lis n,0xaaaa - -#define SAVE_VSR(n, b) li b, VSR_SAVE(n); stxvd2x n,b,r1 -#define LOAD_VSR(n, b) li b, VSR_SAVE(n); lxvd2x n,b,r1 - -#define LOAD_REG_IMMEDIATE(reg,expr) \ - lis reg,(expr)@highest; \ - ori reg,reg,(expr)@higher; \ - rldicr reg,reg,32,31; \ - oris reg,reg,(expr)@h; \ - ori reg,reg,(expr)@l; - - -#if defined(_CALL_ELF) && _CALL_ELF == 2 -#define ENTRY_POINT(name) \ - .type FUNC_NAME(name),@function; \ - .globl FUNC_NAME(name); \ - FUNC_NAME(name): - -#define RESTORE_TOC(name) \ - /* Restore our TOC pointer using our entry point */ \ - LOAD_REG_IMMEDIATE(r12, name) \ -0: addis r2,r12,(.TOC.-0b)@ha; \ - addi r2,r2,(.TOC.-0b)@l; - -#else -#define ENTRY_POINT(name) FUNC_START(name) -#define RESTORE_TOC(name) \ - /* Restore our TOC pointer via our opd entry */ \ - LOAD_REG_IMMEDIATE(r2, name) \ - ld r2,8(r2); -#endif - - .text - -ENTRY_POINT(ebb_handler) - stdu r1,-STACK_FRAME(r1) - SAVE_GPR(0) - mflr r0 - std r0,LR_SAVE(r1) - mfcr r0 - std r0,CCR_SAVE(r1) - mfctr r0 - std r0,CTR_SAVE(r1) - mfxer r0 - std r0,XER_SAVE(r1) - SAVE_GPR(2) - SAVE_GPR(3) - SAVE_GPR(4) - SAVE_GPR(5) - SAVE_GPR(6) - SAVE_GPR(7) - SAVE_GPR(8) - SAVE_GPR(9) - SAVE_GPR(10) - SAVE_GPR(11) - SAVE_GPR(12) - SAVE_GPR(13) - SAVE_GPR(14) - SAVE_GPR(15) - SAVE_GPR(16) - SAVE_GPR(17) - SAVE_GPR(18) - SAVE_GPR(19) - SAVE_GPR(20) - SAVE_GPR(21) - SAVE_GPR(22) - SAVE_GPR(23) - SAVE_GPR(24) - SAVE_GPR(25) - SAVE_GPR(26) - SAVE_GPR(27) - SAVE_GPR(28) - SAVE_GPR(29) - SAVE_GPR(30) - SAVE_GPR(31) - SAVE_VSR(0, r3) - mffs f0 - stfd f0, FSCR_SAVE(r1) - mfvscr f0 - stfd f0, VSCR_SAVE(r1) - SAVE_VSR(1, r3) - SAVE_VSR(2, r3) - SAVE_VSR(3, r3) - SAVE_VSR(4, r3) - SAVE_VSR(5, r3) - SAVE_VSR(6, r3) - SAVE_VSR(7, r3) - SAVE_VSR(8, r3) - SAVE_VSR(9, r3) - SAVE_VSR(10, r3) - SAVE_VSR(11, r3) - SAVE_VSR(12, r3) - SAVE_VSR(13, r3) - SAVE_VSR(14, r3) - SAVE_VSR(15, r3) - SAVE_VSR(16, r3) - SAVE_VSR(17, r3) - SAVE_VSR(18, r3) - SAVE_VSR(19, r3) - SAVE_VSR(20, r3) - SAVE_VSR(21, r3) - SAVE_VSR(22, r3) - SAVE_VSR(23, r3) - SAVE_VSR(24, r3) - SAVE_VSR(25, r3) - SAVE_VSR(26, r3) - SAVE_VSR(27, r3) - SAVE_VSR(28, r3) - SAVE_VSR(29, r3) - SAVE_VSR(30, r3) - SAVE_VSR(31, r3) - SAVE_VSR(32, r3) - SAVE_VSR(33, r3) - SAVE_VSR(34, r3) - SAVE_VSR(35, r3) - SAVE_VSR(36, r3) - SAVE_VSR(37, r3) - SAVE_VSR(38, r3) - SAVE_VSR(39, r3) - SAVE_VSR(40, r3) - SAVE_VSR(41, r3) - SAVE_VSR(42, r3) - SAVE_VSR(43, r3) - SAVE_VSR(44, r3) - SAVE_VSR(45, r3) - SAVE_VSR(46, r3) - SAVE_VSR(47, r3) - SAVE_VSR(48, r3) - SAVE_VSR(49, r3) - SAVE_VSR(50, r3) - SAVE_VSR(51, r3) - SAVE_VSR(52, r3) - SAVE_VSR(53, r3) - SAVE_VSR(54, r3) - SAVE_VSR(55, r3) - SAVE_VSR(56, r3) - SAVE_VSR(57, r3) - SAVE_VSR(58, r3) - SAVE_VSR(59, r3) - SAVE_VSR(60, r3) - SAVE_VSR(61, r3) - SAVE_VSR(62, r3) - SAVE_VSR(63, r3) - - TRASH_GPR(2) - TRASH_GPR(3) - TRASH_GPR(4) - TRASH_GPR(5) - TRASH_GPR(6) - TRASH_GPR(7) - TRASH_GPR(8) - TRASH_GPR(9) - TRASH_GPR(10) - TRASH_GPR(11) - TRASH_GPR(12) - TRASH_GPR(14) - TRASH_GPR(15) - TRASH_GPR(16) - TRASH_GPR(17) - TRASH_GPR(18) - TRASH_GPR(19) - TRASH_GPR(20) - TRASH_GPR(21) - TRASH_GPR(22) - TRASH_GPR(23) - TRASH_GPR(24) - TRASH_GPR(25) - TRASH_GPR(26) - TRASH_GPR(27) - TRASH_GPR(28) - TRASH_GPR(29) - TRASH_GPR(30) - TRASH_GPR(31) - - RESTORE_TOC(ebb_handler) - - /* - * r13 is our TLS pointer. We leave whatever value was in there when the - * EBB fired. That seems to be OK because once set the TLS pointer is not - * changed - but presumably that could change in future. - */ - - bl ebb_hook - nop - - /* r2 may be changed here but we don't care */ - - lfd f0, FSCR_SAVE(r1) - mtfsf 0xff,f0 - lfd f0, VSCR_SAVE(r1) - mtvscr f0 - LOAD_VSR(0, r3) - LOAD_VSR(1, r3) - LOAD_VSR(2, r3) - LOAD_VSR(3, r3) - LOAD_VSR(4, r3) - LOAD_VSR(5, r3) - LOAD_VSR(6, r3) - LOAD_VSR(7, r3) - LOAD_VSR(8, r3) - LOAD_VSR(9, r3) - LOAD_VSR(10, r3) - LOAD_VSR(11, r3) - LOAD_VSR(12, r3) - LOAD_VSR(13, r3) - LOAD_VSR(14, r3) - LOAD_VSR(15, r3) - LOAD_VSR(16, r3) - LOAD_VSR(17, r3) - LOAD_VSR(18, r3) - LOAD_VSR(19, r3) - LOAD_VSR(20, r3) - LOAD_VSR(21, r3) - LOAD_VSR(22, r3) - LOAD_VSR(23, r3) - LOAD_VSR(24, r3) - LOAD_VSR(25, r3) - LOAD_VSR(26, r3) - LOAD_VSR(27, r3) - LOAD_VSR(28, r3) - LOAD_VSR(29, r3) - LOAD_VSR(30, r3) - LOAD_VSR(31, r3) - LOAD_VSR(32, r3) - LOAD_VSR(33, r3) - LOAD_VSR(34, r3) - LOAD_VSR(35, r3) - LOAD_VSR(36, r3) - LOAD_VSR(37, r3) - LOAD_VSR(38, r3) - LOAD_VSR(39, r3) - LOAD_VSR(40, r3) - LOAD_VSR(41, r3) - LOAD_VSR(42, r3) - LOAD_VSR(43, r3) - LOAD_VSR(44, r3) - LOAD_VSR(45, r3) - LOAD_VSR(46, r3) - LOAD_VSR(47, r3) - LOAD_VSR(48, r3) - LOAD_VSR(49, r3) - LOAD_VSR(50, r3) - LOAD_VSR(51, r3) - LOAD_VSR(52, r3) - LOAD_VSR(53, r3) - LOAD_VSR(54, r3) - LOAD_VSR(55, r3) - LOAD_VSR(56, r3) - LOAD_VSR(57, r3) - LOAD_VSR(58, r3) - LOAD_VSR(59, r3) - LOAD_VSR(60, r3) - LOAD_VSR(61, r3) - LOAD_VSR(62, r3) - LOAD_VSR(63, r3) - - ld r0,XER_SAVE(r1) - mtxer r0 - ld r0,CTR_SAVE(r1) - mtctr r0 - ld r0,LR_SAVE(r1) - mtlr r0 - ld r0,CCR_SAVE(r1) - mtcr r0 - REST_GPR(0) - REST_GPR(2) - REST_GPR(3) - REST_GPR(4) - REST_GPR(5) - REST_GPR(6) - REST_GPR(7) - REST_GPR(8) - REST_GPR(9) - REST_GPR(10) - REST_GPR(11) - REST_GPR(12) - REST_GPR(13) - REST_GPR(14) - REST_GPR(15) - REST_GPR(16) - REST_GPR(17) - REST_GPR(18) - REST_GPR(19) - REST_GPR(20) - REST_GPR(21) - REST_GPR(22) - REST_GPR(23) - REST_GPR(24) - REST_GPR(25) - REST_GPR(26) - REST_GPR(27) - REST_GPR(28) - REST_GPR(29) - REST_GPR(30) - REST_GPR(31) - addi r1,r1,STACK_FRAME - RFEBB -FUNC_END(ebb_handler) diff --git a/powerpc/pmu/ebb/ebb_on_child_test.c b/powerpc/pmu/ebb/ebb_on_child_test.c deleted file mode 100644 index c45f948..0000000 --- a/powerpc/pmu/ebb/ebb_on_child_test.c +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <stdbool.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <unistd.h> - -#include "ebb.h" - - -/* - * Tests we can setup an EBB on our child. Nothing interesting happens, because - * even though the event is enabled and running the child hasn't enabled the - * actual delivery of the EBBs. - */ - -static int victim_child(union pipe read_pipe, union pipe write_pipe) -{ - int i; - - FAIL_IF(wait_for_parent(read_pipe)); - FAIL_IF(notify_parent(write_pipe)); - - /* Parent creates EBB event */ - - FAIL_IF(wait_for_parent(read_pipe)); - FAIL_IF(notify_parent(write_pipe)); - - /* Check the EBB is enabled by writing PMC1 */ - write_pmc1(); - - /* EBB event is enabled here */ - for (i = 0; i < 1000000; i++) ; - - return 0; -} - -int ebb_on_child(void) -{ - union pipe read_pipe, write_pipe; - struct event event; - pid_t pid; - - FAIL_IF(pipe(read_pipe.fds) == -1); - FAIL_IF(pipe(write_pipe.fds) == -1); - - pid = fork(); - if (pid == 0) { - /* NB order of pipes looks reversed */ - exit(victim_child(write_pipe, read_pipe)); - } - - FAIL_IF(sync_with_child(read_pipe, write_pipe)); - - /* Child is running now */ - - event_init_named(&event, 0x1001e, "cycles"); - event_leader_ebb_init(&event); - - event.attr.exclude_kernel = 1; - event.attr.exclude_hv = 1; - event.attr.exclude_idle = 1; - - FAIL_IF(event_open_with_pid(&event, pid)); - FAIL_IF(ebb_event_enable(&event)); - - FAIL_IF(sync_with_child(read_pipe, write_pipe)); - - /* Child should just exit happily */ - FAIL_IF(wait_for_child(pid)); - - event_close(&event); - - return 0; -} - -int main(void) -{ - return test_harness(ebb_on_child, "ebb_on_child"); -} diff --git a/powerpc/pmu/ebb/ebb_on_willing_child_test.c b/powerpc/pmu/ebb/ebb_on_willing_child_test.c deleted file mode 100644 index 11acf1d..0000000 --- a/powerpc/pmu/ebb/ebb_on_willing_child_test.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <stdbool.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <unistd.h> - -#include "ebb.h" - - -/* - * Tests we can setup an EBB on our child. The child expects this and enables - * EBBs, which are then delivered to the child, even though the event is - * created by the parent. - */ - -static int victim_child(union pipe read_pipe, union pipe write_pipe) -{ - FAIL_IF(wait_for_parent(read_pipe)); - - /* Setup our EBB handler, before the EBB event is created */ - ebb_enable_pmc_counting(1); - setup_ebb_handler(standard_ebb_callee); - ebb_global_enable(); - - FAIL_IF(notify_parent(write_pipe)); - - while (ebb_state.stats.ebb_count < 20) { - FAIL_IF(core_busy_loop()); - } - - ebb_global_disable(); - ebb_freeze_pmcs(); - - count_pmc(1, sample_period); - - dump_ebb_state(); - - FAIL_IF(ebb_state.stats.ebb_count == 0); - - return 0; -} - -/* Tests we can setup an EBB on our child - if it's expecting it */ -int ebb_on_willing_child(void) -{ - union pipe read_pipe, write_pipe; - struct event event; - pid_t pid; - - FAIL_IF(pipe(read_pipe.fds) == -1); - FAIL_IF(pipe(write_pipe.fds) == -1); - - pid = fork(); - if (pid == 0) { - /* NB order of pipes looks reversed */ - exit(victim_child(write_pipe, read_pipe)); - } - - /* Signal the child to setup its EBB handler */ - FAIL_IF(sync_with_child(read_pipe, write_pipe)); - - /* Child is running now */ - - event_init_named(&event, 0x1001e, "cycles"); - event_leader_ebb_init(&event); - - event.attr.exclude_kernel = 1; - event.attr.exclude_hv = 1; - event.attr.exclude_idle = 1; - - FAIL_IF(event_open_with_pid(&event, pid)); - FAIL_IF(ebb_event_enable(&event)); - - /* Child show now take EBBs and then exit */ - FAIL_IF(wait_for_child(pid)); - - event_close(&event); - - return 0; -} - -int main(void) -{ - return test_harness(ebb_on_willing_child, "ebb_on_willing_child"); -} diff --git a/powerpc/pmu/ebb/ebb_vs_cpu_event_test.c b/powerpc/pmu/ebb/ebb_vs_cpu_event_test.c deleted file mode 100644 index be4dd5a..0000000 --- a/powerpc/pmu/ebb/ebb_vs_cpu_event_test.c +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <stdbool.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <unistd.h> - -#include "ebb.h" - - -/* - * Tests an EBB vs a cpu event - in that order. The EBB should force the cpu - * event off the PMU. - */ - -static int setup_cpu_event(struct event *event, int cpu) -{ - event_init_named(event, 0x400FA, "PM_RUN_INST_CMPL"); - - event->attr.exclude_kernel = 1; - event->attr.exclude_hv = 1; - event->attr.exclude_idle = 1; - - SKIP_IF(require_paranoia_below(1)); - FAIL_IF(event_open_with_cpu(event, cpu)); - FAIL_IF(event_enable(event)); - - return 0; -} - -int ebb_vs_cpu_event(void) -{ - union pipe read_pipe, write_pipe; - struct event event; - int cpu, rc; - pid_t pid; - - cpu = pick_online_cpu(); - FAIL_IF(cpu < 0); - FAIL_IF(bind_to_cpu(cpu)); - - FAIL_IF(pipe(read_pipe.fds) == -1); - FAIL_IF(pipe(write_pipe.fds) == -1); - - pid = fork(); - if (pid == 0) { - /* NB order of pipes looks reversed */ - exit(ebb_child(write_pipe, read_pipe)); - } - - /* Signal the child to install its EBB event and wait */ - FAIL_IF(sync_with_child(read_pipe, write_pipe)); - - /* Now try to install our CPU event */ - rc = setup_cpu_event(&event, cpu); - if (rc) { - kill_child_and_wait(pid); - return rc; - } - - /* Signal the child to run */ - FAIL_IF(sync_with_child(read_pipe, write_pipe)); - - /* .. and wait for it to complete */ - FAIL_IF(wait_for_child(pid)); - FAIL_IF(event_disable(&event)); - FAIL_IF(event_read(&event)); - - event_report(&event); - - /* The cpu event may have run, but we don't expect 100% */ - FAIL_IF(event.result.enabled >= event.result.running); - - return 0; -} - -int main(void) -{ - return test_harness(ebb_vs_cpu_event, "ebb_vs_cpu_event"); -} diff --git a/powerpc/pmu/ebb/event_attributes_test.c b/powerpc/pmu/ebb/event_attributes_test.c deleted file mode 100644 index 7e78153..0000000 --- a/powerpc/pmu/ebb/event_attributes_test.c +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <stdio.h> -#include <stdlib.h> - -#include "ebb.h" - - -/* - * Test various attributes of the EBB event are enforced. - */ -int event_attributes(void) -{ - struct event event, leader; - - event_init(&event, 0x1001e); - event_leader_ebb_init(&event); - /* Expected to succeed */ - FAIL_IF(event_open(&event)); - event_close(&event); - - - event_init(&event, 0x001e); /* CYCLES - no PMC specified */ - event_leader_ebb_init(&event); - /* Expected to fail, no PMC specified */ - FAIL_IF(event_open(&event) == 0); - - - event_init(&event, 0x2001e); - event_leader_ebb_init(&event); - event.attr.exclusive = 0; - /* Expected to fail, not exclusive */ - FAIL_IF(event_open(&event) == 0); - - - event_init(&event, 0x3001e); - event_leader_ebb_init(&event); - event.attr.freq = 1; - /* Expected to fail, sets freq */ - FAIL_IF(event_open(&event) == 0); - - - event_init(&event, 0x4001e); - event_leader_ebb_init(&event); - event.attr.sample_period = 1; - /* Expected to fail, sets sample_period */ - FAIL_IF(event_open(&event) == 0); - - - event_init(&event, 0x1001e); - event_leader_ebb_init(&event); - event.attr.enable_on_exec = 1; - /* Expected to fail, sets enable_on_exec */ - FAIL_IF(event_open(&event) == 0); - - - event_init(&event, 0x1001e); - event_leader_ebb_init(&event); - event.attr.inherit = 1; - /* Expected to fail, sets inherit */ - FAIL_IF(event_open(&event) == 0); - - - event_init(&leader, 0x1001e); - event_leader_ebb_init(&leader); - FAIL_IF(event_open(&leader)); - - event_init(&event, 0x20002); - event_ebb_init(&event); - - /* Expected to succeed */ - FAIL_IF(event_open_with_group(&event, leader.fd)); - event_close(&leader); - event_close(&event); - - - event_init(&leader, 0x1001e); - event_leader_ebb_init(&leader); - FAIL_IF(event_open(&leader)); - - event_init(&event, 0x20002); - - /* Expected to fail, event doesn't request EBB, leader does */ - FAIL_IF(event_open_with_group(&event, leader.fd) == 0); - event_close(&leader); - - - event_init(&leader, 0x1001e); - event_leader_ebb_init(&leader); - /* Clear the EBB flag */ - leader.attr.config &= ~(1ull << 63); - - FAIL_IF(event_open(&leader)); - - event_init(&event, 0x20002); - event_ebb_init(&event); - - /* Expected to fail, leader doesn't request EBB */ - FAIL_IF(event_open_with_group(&event, leader.fd) == 0); - event_close(&leader); - - - event_init(&leader, 0x1001e); - event_leader_ebb_init(&leader); - leader.attr.exclusive = 0; - /* Expected to fail, leader isn't exclusive */ - FAIL_IF(event_open(&leader) == 0); - - - event_init(&leader, 0x1001e); - event_leader_ebb_init(&leader); - leader.attr.pinned = 0; - /* Expected to fail, leader isn't pinned */ - FAIL_IF(event_open(&leader) == 0); - - event_init(&event, 0x1001e); - event_leader_ebb_init(&event); - /* Expected to fail, not a task event */ - SKIP_IF(require_paranoia_below(1)); - FAIL_IF(event_open_with_cpu(&event, 0) == 0); - - return 0; -} - -int main(void) -{ - return test_harness(event_attributes, "event_attributes"); -} diff --git a/powerpc/pmu/ebb/fixed_instruction_loop.S b/powerpc/pmu/ebb/fixed_instruction_loop.S deleted file mode 100644 index b866a05..0000000 --- a/powerpc/pmu/ebb/fixed_instruction_loop.S +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <ppc-asm.h> - - .text - -FUNC_START(thirty_two_instruction_loop) - cmpwi r3,0 - beqlr - addi r4,r3,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 # 28 addi's - subi r3,r3,1 - b FUNC_NAME(thirty_two_instruction_loop) -FUNC_END(thirty_two_instruction_loop) diff --git a/powerpc/pmu/ebb/fork_cleanup_test.c b/powerpc/pmu/ebb/fork_cleanup_test.c deleted file mode 100644 index 9e7af6e..0000000 --- a/powerpc/pmu/ebb/fork_cleanup_test.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <stdbool.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <unistd.h> -#include <setjmp.h> -#include <signal.h> - -#include "ebb.h" - - -/* - * Test that a fork clears the PMU state of the child. eg. BESCR/EBBHR/EBBRR - * are cleared, and MMCR0_PMCC is reset, preventing the child from accessing - * the PMU. - */ - -static struct event event; - -static int child(void) -{ - /* Even though we have EBE=0 we can still see the EBB regs */ - FAIL_IF(mfspr(SPRN_BESCR) != 0); - FAIL_IF(mfspr(SPRN_EBBHR) != 0); - FAIL_IF(mfspr(SPRN_EBBRR) != 0); - - FAIL_IF(catch_sigill(write_pmc1)); - - /* We can still read from the event, though it is on our parent */ - FAIL_IF(event_read(&event)); - - return 0; -} - -/* Tests that fork clears EBB state */ -int fork_cleanup(void) -{ - pid_t pid; - - event_init_named(&event, 0x1001e, "cycles"); - event_leader_ebb_init(&event); - - FAIL_IF(event_open(&event)); - - ebb_enable_pmc_counting(1); - setup_ebb_handler(standard_ebb_callee); - ebb_global_enable(); - - FAIL_IF(ebb_event_enable(&event)); - - mtspr(SPRN_MMCR0, MMCR0_FC); - mtspr(SPRN_PMC1, pmc_sample_period(sample_period)); - - /* Don't need to actually take any EBBs */ - - pid = fork(); - if (pid == 0) - exit(child()); - - /* Child does the actual testing */ - FAIL_IF(wait_for_child(pid)); - - /* After fork */ - event_close(&event); - - return 0; -} - -int main(void) -{ - return test_harness(fork_cleanup, "fork_cleanup"); -} diff --git a/powerpc/pmu/ebb/instruction_count_test.c b/powerpc/pmu/ebb/instruction_count_test.c deleted file mode 100644 index f8190fa..0000000 --- a/powerpc/pmu/ebb/instruction_count_test.c +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#define _GNU_SOURCE - -#include <stdio.h> -#include <stdbool.h> -#include <string.h> -#include <sys/prctl.h> - -#include "ebb.h" - - -/* - * Run a calibrated instruction loop and count instructions executed using - * EBBs. Make sure the counts look right. - */ - -extern void thirty_two_instruction_loop(uint64_t loops); - -static bool counters_frozen = true; - -static int do_count_loop(struct event *event, uint64_t instructions, - uint64_t overhead, bool report) -{ - int64_t difference, expected; - double percentage; - - clear_ebb_stats(); - - counters_frozen = false; - mb(); - mtspr(SPRN_MMCR0, mfspr(SPRN_MMCR0) & ~MMCR0_FC); - - thirty_two_instruction_loop(instructions >> 5); - - counters_frozen = true; - mb(); - mtspr(SPRN_MMCR0, mfspr(SPRN_MMCR0) | MMCR0_FC); - - count_pmc(4, sample_period); - - event->result.value = ebb_state.stats.pmc_count[4-1]; - expected = instructions + overhead; - difference = event->result.value - expected; - percentage = (double)difference / event->result.value * 100; - - if (report) { - printf("Looped for %lu instructions, overhead %lu\n", instructions, overhead); - printf("Expected %lu\n", expected); - printf("Actual %llu\n", event->result.value); - printf("Error %ld, %f%%\n", difference, percentage); - printf("Took %d EBBs\n", ebb_state.stats.ebb_count); - } - - if (difference < 0) - difference = -difference; - - /* Tolerate a difference of up to 0.0001 % */ - difference *= 10000 * 100; - if (difference / event->result.value) - return -1; - - return 0; -} - -/* Count how many instructions it takes to do a null loop */ -static uint64_t determine_overhead(struct event *event) -{ - uint64_t current, overhead; - int i; - - do_count_loop(event, 0, 0, false); - overhead = event->result.value; - - for (i = 0; i < 100; i++) { - do_count_loop(event, 0, 0, false); - current = event->result.value; - if (current < overhead) { - printf("Replacing overhead %lu with %lu\n", overhead, current); - overhead = current; - } - } - - return overhead; -} - -static void pmc4_ebb_callee(void) -{ - uint64_t val; - - val = mfspr(SPRN_BESCR); - if (!(val & BESCR_PMEO)) { - ebb_state.stats.spurious++; - goto out; - } - - ebb_state.stats.ebb_count++; - count_pmc(4, sample_period); -out: - if (counters_frozen) - reset_ebb_with_clear_mask(MMCR0_PMAO); - else - reset_ebb(); -} - -int instruction_count(void) -{ - struct event event; - uint64_t overhead; - - event_init_named(&event, 0x400FA, "PM_RUN_INST_CMPL"); - event_leader_ebb_init(&event); - event.attr.exclude_kernel = 1; - event.attr.exclude_hv = 1; - event.attr.exclude_idle = 1; - - FAIL_IF(event_open(&event)); - FAIL_IF(ebb_event_enable(&event)); - - sample_period = COUNTER_OVERFLOW; - - setup_ebb_handler(pmc4_ebb_callee); - mtspr(SPRN_MMCR0, mfspr(SPRN_MMCR0) & ~MMCR0_FC); - ebb_global_enable(); - - overhead = determine_overhead(&event); - printf("Overhead of null loop: %lu instructions\n", overhead); - - /* Run for 1M instructions */ - FAIL_IF(do_count_loop(&event, 0x100000, overhead, true)); - - /* Run for 10M instructions */ - FAIL_IF(do_count_loop(&event, 0xa00000, overhead, true)); - - /* Run for 100M instructions */ - FAIL_IF(do_count_loop(&event, 0x6400000, overhead, true)); - - /* Run for 1G instructions */ - FAIL_IF(do_count_loop(&event, 0x40000000, overhead, true)); - - /* Run for 16G instructions */ - FAIL_IF(do_count_loop(&event, 0x400000000, overhead, true)); - - /* Run for 64G instructions */ - FAIL_IF(do_count_loop(&event, 0x1000000000, overhead, true)); - - /* Run for 128G instructions */ - FAIL_IF(do_count_loop(&event, 0x2000000000, overhead, true)); - - ebb_global_disable(); - event_close(&event); - - printf("Finished OK\n"); - - return 0; -} - -int main(void) -{ - return test_harness(instruction_count, "instruction_count"); -} diff --git a/powerpc/pmu/ebb/lost_exception_test.c b/powerpc/pmu/ebb/lost_exception_test.c deleted file mode 100644 index 0c9dd9b..0000000 --- a/powerpc/pmu/ebb/lost_exception_test.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <sched.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <sys/mman.h> - -#include "ebb.h" - - -/* - * Test that tries to trigger CPU_FTR_PMAO_BUG. Which is a hardware defect - * where an exception triggers but we context switch before it is delivered and - * lose the exception. - */ - -static int test_body(void) -{ - int i, orig_period, max_period; - struct event event; - - /* We use PMC4 to make sure the kernel switches all counters correctly */ - event_init_named(&event, 0x40002, "instructions"); - event_leader_ebb_init(&event); - - event.attr.exclude_kernel = 1; - event.attr.exclude_hv = 1; - event.attr.exclude_idle = 1; - - FAIL_IF(event_open(&event)); - - ebb_enable_pmc_counting(4); - setup_ebb_handler(standard_ebb_callee); - ebb_global_enable(); - FAIL_IF(ebb_event_enable(&event)); - - /* - * We want a low sample period, but we also want to get out of the EBB - * handler without tripping up again. - * - * This value picked after much experimentation. - */ - orig_period = max_period = sample_period = 400; - - mtspr(SPRN_PMC4, pmc_sample_period(sample_period)); - - while (ebb_state.stats.ebb_count < 1000000) { - /* - * We are trying to get the EBB exception to race exactly with - * us entering the kernel to do the syscall. We then need the - * kernel to decide our timeslice is up and context switch to - * the other thread. When we come back our EBB will have been - * lost and we'll spin in this while loop forever. - */ - - for (i = 0; i < 100000; i++) - sched_yield(); - - /* Change the sample period slightly to try and hit the race */ - if (sample_period >= (orig_period + 200)) - sample_period = orig_period; - else - sample_period++; - - if (sample_period > max_period) - max_period = sample_period; - } - - ebb_freeze_pmcs(); - ebb_global_disable(); - - count_pmc(4, sample_period); - mtspr(SPRN_PMC4, 0xdead); - - dump_summary_ebb_state(); - dump_ebb_hw_state(); - - event_close(&event); - - FAIL_IF(ebb_state.stats.ebb_count == 0); - - /* We vary our sample period so we need extra fudge here */ - FAIL_IF(!ebb_check_count(4, orig_period, 2 * (max_period - orig_period))); - - return 0; -} - -static int lost_exception(void) -{ - return eat_cpu(test_body); -} - -int main(void) -{ - return test_harness(lost_exception, "lost_exception"); -} diff --git a/powerpc/pmu/ebb/multi_counter_test.c b/powerpc/pmu/ebb/multi_counter_test.c deleted file mode 100644 index 67d78af..0000000 --- a/powerpc/pmu/ebb/multi_counter_test.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <sys/ioctl.h> - -#include "ebb.h" - - -/* - * Test counting multiple events using EBBs. - */ -int multi_counter(void) -{ - struct event events[6]; - int i, group_fd; - - event_init_named(&events[0], 0x1001C, "PM_CMPLU_STALL_THRD"); - event_init_named(&events[1], 0x2D016, "PM_CMPLU_STALL_FXU"); - event_init_named(&events[2], 0x30006, "PM_CMPLU_STALL_OTHER_CMPL"); - event_init_named(&events[3], 0x4000A, "PM_CMPLU_STALL"); - event_init_named(&events[4], 0x600f4, "PM_RUN_CYC"); - event_init_named(&events[5], 0x500fa, "PM_RUN_INST_CMPL"); - - event_leader_ebb_init(&events[0]); - for (i = 1; i < 6; i++) - event_ebb_init(&events[i]); - - group_fd = -1; - for (i = 0; i < 6; i++) { - events[i].attr.exclude_kernel = 1; - events[i].attr.exclude_hv = 1; - events[i].attr.exclude_idle = 1; - - FAIL_IF(event_open_with_group(&events[i], group_fd)); - if (group_fd == -1) - group_fd = events[0].fd; - } - - ebb_enable_pmc_counting(1); - ebb_enable_pmc_counting(2); - ebb_enable_pmc_counting(3); - ebb_enable_pmc_counting(4); - ebb_enable_pmc_counting(5); - ebb_enable_pmc_counting(6); - setup_ebb_handler(standard_ebb_callee); - - FAIL_IF(ioctl(events[0].fd, PERF_EVENT_IOC_ENABLE, PERF_IOC_FLAG_GROUP)); - FAIL_IF(event_read(&events[0])); - - ebb_global_enable(); - - mtspr(SPRN_PMC1, pmc_sample_period(sample_period)); - mtspr(SPRN_PMC2, pmc_sample_period(sample_period)); - mtspr(SPRN_PMC3, pmc_sample_period(sample_period)); - mtspr(SPRN_PMC4, pmc_sample_period(sample_period)); - mtspr(SPRN_PMC5, pmc_sample_period(sample_period)); - mtspr(SPRN_PMC6, pmc_sample_period(sample_period)); - - while (ebb_state.stats.ebb_count < 50) { - FAIL_IF(core_busy_loop()); - FAIL_IF(ebb_check_mmcr0()); - } - - ebb_global_disable(); - ebb_freeze_pmcs(); - - count_pmc(1, sample_period); - count_pmc(2, sample_period); - count_pmc(3, sample_period); - count_pmc(4, sample_period); - count_pmc(5, sample_period); - count_pmc(6, sample_period); - - dump_ebb_state(); - - for (i = 0; i < 6; i++) - event_close(&events[i]); - - FAIL_IF(ebb_state.stats.ebb_count == 0); - - return 0; -} - -int main(void) -{ - return test_harness(multi_counter, "multi_counter"); -} diff --git a/powerpc/pmu/ebb/multi_ebb_procs_test.c b/powerpc/pmu/ebb/multi_ebb_procs_test.c deleted file mode 100644 index b8dc371..0000000 --- a/powerpc/pmu/ebb/multi_ebb_procs_test.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> -#include <signal.h> - -#include "ebb.h" - - -/* - * Test running multiple EBB using processes at once on a single CPU. They - * should all run happily without interfering with each other. - */ - -static bool child_should_exit; - -static void sigint_handler(int signal) -{ - child_should_exit = true; -} - -struct sigaction sigint_action = { - .sa_handler = sigint_handler, -}; - -static int cycles_child(void) -{ - struct event event; - - if (sigaction(SIGINT, &sigint_action, NULL)) { - perror("sigaction"); - return 1; - } - - event_init_named(&event, 0x1001e, "cycles"); - event_leader_ebb_init(&event); - - event.attr.exclude_kernel = 1; - event.attr.exclude_hv = 1; - event.attr.exclude_idle = 1; - - FAIL_IF(event_open(&event)); - - ebb_enable_pmc_counting(1); - setup_ebb_handler(standard_ebb_callee); - ebb_global_enable(); - - FAIL_IF(ebb_event_enable(&event)); - - mtspr(SPRN_PMC1, pmc_sample_period(sample_period)); - - while (!child_should_exit) { - FAIL_IF(core_busy_loop()); - FAIL_IF(ebb_check_mmcr0()); - } - - ebb_global_disable(); - ebb_freeze_pmcs(); - - count_pmc(1, sample_period); - - dump_summary_ebb_state(); - - event_close(&event); - - FAIL_IF(ebb_state.stats.ebb_count == 0); - - return 0; -} - -#define NR_CHILDREN 4 - -int multi_ebb_procs(void) -{ - pid_t pids[NR_CHILDREN]; - int cpu, rc, i; - - cpu = pick_online_cpu(); - FAIL_IF(cpu < 0); - FAIL_IF(bind_to_cpu(cpu)); - - for (i = 0; i < NR_CHILDREN; i++) { - pids[i] = fork(); - if (pids[i] == 0) - exit(cycles_child()); - } - - /* Have them all run for "a while" */ - sleep(10); - - rc = 0; - for (i = 0; i < NR_CHILDREN; i++) { - /* Tell them to stop */ - kill(pids[i], SIGINT); - /* And wait */ - rc |= wait_for_child(pids[i]); - } - - return rc; -} - -int main(void) -{ - return test_harness(multi_ebb_procs, "multi_ebb_procs"); -} diff --git a/powerpc/pmu/ebb/no_handler_test.c b/powerpc/pmu/ebb/no_handler_test.c deleted file mode 100644 index 2f9bf8e..0000000 --- a/powerpc/pmu/ebb/no_handler_test.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <setjmp.h> -#include <signal.h> - -#include "ebb.h" - - -/* Test that things work sanely if we have no handler */ - -static int no_handler_test(void) -{ - struct event event; - u64 val; - int i; - - event_init_named(&event, 0x1001e, "cycles"); - event_leader_ebb_init(&event); - - event.attr.exclude_kernel = 1; - event.attr.exclude_hv = 1; - event.attr.exclude_idle = 1; - - FAIL_IF(event_open(&event)); - FAIL_IF(ebb_event_enable(&event)); - - val = mfspr(SPRN_EBBHR); - FAIL_IF(val != 0); - - /* Make sure it overflows quickly */ - sample_period = 1000; - mtspr(SPRN_PMC1, pmc_sample_period(sample_period)); - - /* Spin to make sure the event has time to overflow */ - for (i = 0; i < 1000; i++) - mb(); - - dump_ebb_state(); - - /* We expect to see the PMU frozen & PMAO set */ - val = mfspr(SPRN_MMCR0); - FAIL_IF(val != 0x0000000080000080); - - event_close(&event); - - dump_ebb_state(); - - /* The real test is that we never took an EBB at 0x0 */ - - return 0; -} - -int main(void) -{ - return test_harness(no_handler_test,"no_handler_test"); -} diff --git a/powerpc/pmu/ebb/pmae_handling_test.c b/powerpc/pmu/ebb/pmae_handling_test.c deleted file mode 100644 index 986500f..0000000 --- a/powerpc/pmu/ebb/pmae_handling_test.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <sched.h> -#include <signal.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> - -#include "ebb.h" - - -/* - * Test that the kernel properly handles PMAE across context switches. - * - * We test this by calling into the kernel inside our EBB handler, where PMAE - * is clear. A cpu eater companion thread is running on the same CPU as us to - * encourage the scheduler to switch us. - * - * The kernel must make sure that when it context switches us back in, it - * honours the fact that we had PMAE clear. - * - * Observed to hit the failing case on the first EBB with a broken kernel. - */ - -static bool mmcr0_mismatch; -static uint64_t before, after; - -static void syscall_ebb_callee(void) -{ - uint64_t val; - - val = mfspr(SPRN_BESCR); - if (!(val & BESCR_PMEO)) { - ebb_state.stats.spurious++; - goto out; - } - - ebb_state.stats.ebb_count++; - count_pmc(1, sample_period); - - before = mfspr(SPRN_MMCR0); - - /* Try and get ourselves scheduled, to force a PMU context switch */ - sched_yield(); - - after = mfspr(SPRN_MMCR0); - if (before != after) - mmcr0_mismatch = true; - -out: - reset_ebb(); -} - -static int test_body(void) -{ - struct event event; - - event_init_named(&event, 0x1001e, "cycles"); - event_leader_ebb_init(&event); - - event.attr.exclude_kernel = 1; - event.attr.exclude_hv = 1; - event.attr.exclude_idle = 1; - - FAIL_IF(event_open(&event)); - - setup_ebb_handler(syscall_ebb_callee); - ebb_global_enable(); - - FAIL_IF(ebb_event_enable(&event)); - - mtspr(SPRN_PMC1, pmc_sample_period(sample_period)); - - while (ebb_state.stats.ebb_count < 20 && !mmcr0_mismatch) - FAIL_IF(core_busy_loop()); - - ebb_global_disable(); - ebb_freeze_pmcs(); - - count_pmc(1, sample_period); - - dump_ebb_state(); - - if (mmcr0_mismatch) - printf("Saw MMCR0 before 0x%lx after 0x%lx\n", before, after); - - event_close(&event); - - FAIL_IF(ebb_state.stats.ebb_count == 0); - FAIL_IF(mmcr0_mismatch); - - return 0; -} - -int pmae_handling(void) -{ - return eat_cpu(test_body); -} - -int main(void) -{ - return test_harness(pmae_handling, "pmae_handling"); -} diff --git a/powerpc/pmu/ebb/pmc56_overflow_test.c b/powerpc/pmu/ebb/pmc56_overflow_test.c deleted file mode 100644 index a503fa7..0000000 --- a/powerpc/pmu/ebb/pmc56_overflow_test.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <stdio.h> -#include <stdlib.h> - -#include "ebb.h" - - -/* - * Test that PMC5 & 6 are frozen (ie. don't overflow) when they are not being - * used. Tests the MMCR0_FC56 logic in the kernel. - */ - -static int pmc56_overflowed; - -static void ebb_callee(void) -{ - uint64_t val; - - val = mfspr(SPRN_BESCR); - if (!(val & BESCR_PMEO)) { - ebb_state.stats.spurious++; - goto out; - } - - ebb_state.stats.ebb_count++; - count_pmc(2, sample_period); - - val = mfspr(SPRN_PMC5); - if (val >= COUNTER_OVERFLOW) - pmc56_overflowed++; - - count_pmc(5, COUNTER_OVERFLOW); - - val = mfspr(SPRN_PMC6); - if (val >= COUNTER_OVERFLOW) - pmc56_overflowed++; - - count_pmc(6, COUNTER_OVERFLOW); - -out: - reset_ebb(); -} - -int pmc56_overflow(void) -{ - struct event event; - - /* Use PMC2 so we set PMCjCE, which enables PMC5/6 */ - event_init(&event, 0x2001e); - event_leader_ebb_init(&event); - - event.attr.exclude_kernel = 1; - event.attr.exclude_hv = 1; - event.attr.exclude_idle = 1; - - FAIL_IF(event_open(&event)); - - setup_ebb_handler(ebb_callee); - ebb_global_enable(); - - FAIL_IF(ebb_event_enable(&event)); - - mtspr(SPRN_PMC1, pmc_sample_period(sample_period)); - mtspr(SPRN_PMC5, 0); - mtspr(SPRN_PMC6, 0); - - while (ebb_state.stats.ebb_count < 10) - FAIL_IF(core_busy_loop()); - - ebb_global_disable(); - ebb_freeze_pmcs(); - - count_pmc(2, sample_period); - - dump_ebb_state(); - - printf("PMC5/6 overflow %d\n", pmc56_overflowed); - - event_close(&event); - - FAIL_IF(ebb_state.stats.ebb_count == 0 || pmc56_overflowed != 0); - - return 0; -} - -int main(void) -{ - return test_harness(pmc56_overflow, "pmc56_overflow"); -} diff --git a/powerpc/pmu/ebb/reg.h b/powerpc/pmu/ebb/reg.h deleted file mode 100644 index 5921b0d..0000000 --- a/powerpc/pmu/ebb/reg.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#ifndef _SELFTESTS_POWERPC_REG_H -#define _SELFTESTS_POWERPC_REG_H - -#define __stringify_1(x) #x -#define __stringify(x) __stringify_1(x) - -#define mfspr(rn) ({unsigned long rval; \ - asm volatile("mfspr %0," __stringify(rn) \ - : "=r" (rval)); rval; }) -#define mtspr(rn, v) asm volatile("mtspr " __stringify(rn) ",%0" : \ - : "r" ((unsigned long)(v)) \ - : "memory") - -#define mb() asm volatile("sync" : : : "memory"); - -#define SPRN_MMCR2 769 -#define SPRN_MMCRA 770 -#define SPRN_MMCR0 779 -#define MMCR0_PMAO 0x00000080 -#define MMCR0_PMAE 0x04000000 -#define MMCR0_FC 0x80000000 -#define SPRN_EBBHR 804 -#define SPRN_EBBRR 805 -#define SPRN_BESCR 806 /* Branch event status & control register */ -#define SPRN_BESCRS 800 /* Branch event status & control set (1 bits set to 1) */ -#define SPRN_BESCRSU 801 /* Branch event status & control set upper */ -#define SPRN_BESCRR 802 /* Branch event status & control REset (1 bits set to 0) */ -#define SPRN_BESCRRU 803 /* Branch event status & control REset upper */ - -#define BESCR_PMEO 0x1 /* PMU Event-based exception Occurred */ -#define BESCR_PME (0x1ul << 32) /* PMU Event-based exception Enable */ - -#define SPRN_PMC1 771 -#define SPRN_PMC2 772 -#define SPRN_PMC3 773 -#define SPRN_PMC4 774 -#define SPRN_PMC5 775 -#define SPRN_PMC6 776 - -#define SPRN_SIAR 780 -#define SPRN_SDAR 781 -#define SPRN_SIER 768 - -#endif /* _SELFTESTS_POWERPC_REG_H */ diff --git a/powerpc/pmu/ebb/reg_access_test.c b/powerpc/pmu/ebb/reg_access_test.c deleted file mode 100644 index 0cae66f..0000000 --- a/powerpc/pmu/ebb/reg_access_test.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <stdio.h> -#include <stdlib.h> - -#include "ebb.h" -#include "reg.h" - - -/* - * Test basic access to the EBB regs, they should be user accessible with no - * kernel interaction required. - */ -int reg_access(void) -{ - uint64_t val, expected; - - expected = 0x8000000100000000ull; - mtspr(SPRN_BESCR, expected); - val = mfspr(SPRN_BESCR); - - FAIL_IF(val != expected); - - expected = 0x0000000001000000ull; - mtspr(SPRN_EBBHR, expected); - val = mfspr(SPRN_EBBHR); - - FAIL_IF(val != expected); - - return 0; -} - -int main(void) -{ - return test_harness(reg_access, "reg_access"); -} diff --git a/powerpc/pmu/ebb/task_event_pinned_vs_ebb_test.c b/powerpc/pmu/ebb/task_event_pinned_vs_ebb_test.c deleted file mode 100644 index d56607e..0000000 --- a/powerpc/pmu/ebb/task_event_pinned_vs_ebb_test.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <stdbool.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <unistd.h> - -#include "ebb.h" - - -/* - * Tests a pinned per-task event vs an EBB - in that order. The pinned per-task - * event should prevent the EBB event from being enabled. - */ - -static int setup_child_event(struct event *event, pid_t child_pid) -{ - event_init_named(event, 0x400FA, "PM_RUN_INST_CMPL"); - - event->attr.pinned = 1; - - event->attr.exclude_kernel = 1; - event->attr.exclude_hv = 1; - event->attr.exclude_idle = 1; - - FAIL_IF(event_open_with_pid(event, child_pid)); - FAIL_IF(event_enable(event)); - - return 0; -} - -int task_event_pinned_vs_ebb(void) -{ - union pipe read_pipe, write_pipe; - struct event event; - pid_t pid; - int rc; - - FAIL_IF(pipe(read_pipe.fds) == -1); - FAIL_IF(pipe(write_pipe.fds) == -1); - - pid = fork(); - if (pid == 0) { - /* NB order of pipes looks reversed */ - exit(ebb_child(write_pipe, read_pipe)); - } - - /* We setup the task event first */ - rc = setup_child_event(&event, pid); - if (rc) { - kill_child_and_wait(pid); - return rc; - } - - /* Signal the child to install its EBB event and wait */ - if (sync_with_child(read_pipe, write_pipe)) - /* If it fails, wait for it to exit */ - goto wait; - - /* Signal the child to run */ - FAIL_IF(sync_with_child(read_pipe, write_pipe)); - -wait: - /* We expect it to fail to read the event */ - FAIL_IF(wait_for_child(pid) != 2); - FAIL_IF(event_disable(&event)); - FAIL_IF(event_read(&event)); - - event_report(&event); - - FAIL_IF(event.result.value == 0); - /* - * For reasons I don't understand enabled is usually just slightly - * lower than running. Would be good to confirm why. - */ - FAIL_IF(event.result.enabled == 0); - FAIL_IF(event.result.running == 0); - - return 0; -} - -int main(void) -{ - return test_harness(task_event_pinned_vs_ebb, "task_event_pinned_vs_ebb"); -} diff --git a/powerpc/pmu/ebb/task_event_vs_ebb_test.c b/powerpc/pmu/ebb/task_event_vs_ebb_test.c deleted file mode 100644 index eba3219..0000000 --- a/powerpc/pmu/ebb/task_event_vs_ebb_test.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <stdbool.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <unistd.h> - -#include "ebb.h" - - -/* - * Tests a per-task event vs an EBB - in that order. The EBB should push the - * per-task event off the PMU. - */ - -static int setup_child_event(struct event *event, pid_t child_pid) -{ - event_init_named(event, 0x400FA, "PM_RUN_INST_CMPL"); - - event->attr.exclude_kernel = 1; - event->attr.exclude_hv = 1; - event->attr.exclude_idle = 1; - - FAIL_IF(event_open_with_pid(event, child_pid)); - FAIL_IF(event_enable(event)); - - return 0; -} - -int task_event_vs_ebb(void) -{ - union pipe read_pipe, write_pipe; - struct event event; - pid_t pid; - int rc; - - FAIL_IF(pipe(read_pipe.fds) == -1); - FAIL_IF(pipe(write_pipe.fds) == -1); - - pid = fork(); - if (pid == 0) { - /* NB order of pipes looks reversed */ - exit(ebb_child(write_pipe, read_pipe)); - } - - /* We setup the task event first */ - rc = setup_child_event(&event, pid); - if (rc) { - kill_child_and_wait(pid); - return rc; - } - - /* Signal the child to install its EBB event and wait */ - if (sync_with_child(read_pipe, write_pipe)) - /* If it fails, wait for it to exit */ - goto wait; - - /* Signal the child to run */ - FAIL_IF(sync_with_child(read_pipe, write_pipe)); - -wait: - /* The EBB event should push the task event off so the child should succeed */ - FAIL_IF(wait_for_child(pid)); - FAIL_IF(event_disable(&event)); - FAIL_IF(event_read(&event)); - - event_report(&event); - - /* The task event may have run, or not so we can't assert anything about it */ - - return 0; -} - -int main(void) -{ - return test_harness(task_event_vs_ebb, "task_event_vs_ebb"); -} diff --git a/powerpc/pmu/ebb/trace.c b/powerpc/pmu/ebb/trace.c deleted file mode 100644 index 251e66a..0000000 --- a/powerpc/pmu/ebb/trace.c +++ /dev/null @@ -1,300 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/mman.h> - -#include "trace.h" - - -struct trace_buffer *trace_buffer_allocate(u64 size) -{ - struct trace_buffer *tb; - - if (size < sizeof(*tb)) { - fprintf(stderr, "Error: trace buffer too small\n"); - return NULL; - } - - tb = mmap(NULL, size, PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); - if (tb == MAP_FAILED) { - perror("mmap"); - return NULL; - } - - tb->size = size; - tb->tail = tb->data; - tb->overflow = false; - - return tb; -} - -static bool trace_check_bounds(struct trace_buffer *tb, void *p) -{ - return p < ((void *)tb + tb->size); -} - -static bool trace_check_alloc(struct trace_buffer *tb, void *p) -{ - /* - * If we ever overflowed don't allow any more input. This prevents us - * from dropping a large item and then later logging a small one. The - * buffer should just stop when overflow happened, not be patchy. If - * you're overflowing, make your buffer bigger. - */ - if (tb->overflow) - return false; - - if (!trace_check_bounds(tb, p)) { - tb->overflow = true; - return false; - } - - return true; -} - -static void *trace_alloc(struct trace_buffer *tb, int bytes) -{ - void *p, *newtail; - - p = tb->tail; - newtail = tb->tail + bytes; - if (!trace_check_alloc(tb, newtail)) - return NULL; - - tb->tail = newtail; - - return p; -} - -static struct trace_entry *trace_alloc_entry(struct trace_buffer *tb, int payload_size) -{ - struct trace_entry *e; - - e = trace_alloc(tb, sizeof(*e) + payload_size); - if (e) - e->length = payload_size; - - return e; -} - -int trace_log_reg(struct trace_buffer *tb, u64 reg, u64 value) -{ - struct trace_entry *e; - u64 *p; - - e = trace_alloc_entry(tb, sizeof(reg) + sizeof(value)); - if (!e) - return -ENOSPC; - - e->type = TRACE_TYPE_REG; - p = (u64 *)e->data; - *p++ = reg; - *p++ = value; - - return 0; -} - -int trace_log_counter(struct trace_buffer *tb, u64 value) -{ - struct trace_entry *e; - u64 *p; - - e = trace_alloc_entry(tb, sizeof(value)); - if (!e) - return -ENOSPC; - - e->type = TRACE_TYPE_COUNTER; - p = (u64 *)e->data; - *p++ = value; - - return 0; -} - -int trace_log_string(struct trace_buffer *tb, char *str) -{ - struct trace_entry *e; - char *p; - int len; - - len = strlen(str); - - /* We NULL terminate to make printing easier */ - e = trace_alloc_entry(tb, len + 1); - if (!e) - return -ENOSPC; - - e->type = TRACE_TYPE_STRING; - p = (char *)e->data; - memcpy(p, str, len); - p += len; - *p = '\0'; - - return 0; -} - -int trace_log_indent(struct trace_buffer *tb) -{ - struct trace_entry *e; - - e = trace_alloc_entry(tb, 0); - if (!e) - return -ENOSPC; - - e->type = TRACE_TYPE_INDENT; - - return 0; -} - -int trace_log_outdent(struct trace_buffer *tb) -{ - struct trace_entry *e; - - e = trace_alloc_entry(tb, 0); - if (!e) - return -ENOSPC; - - e->type = TRACE_TYPE_OUTDENT; - - return 0; -} - -static void trace_print_header(int seq, int prefix) -{ - printf("%*s[%d]: ", prefix, "", seq); -} - -static char *trace_decode_reg(int reg) -{ - switch (reg) { - case 769: return "SPRN_MMCR2"; break; - case 770: return "SPRN_MMCRA"; break; - case 779: return "SPRN_MMCR0"; break; - case 804: return "SPRN_EBBHR"; break; - case 805: return "SPRN_EBBRR"; break; - case 806: return "SPRN_BESCR"; break; - case 800: return "SPRN_BESCRS"; break; - case 801: return "SPRN_BESCRSU"; break; - case 802: return "SPRN_BESCRR"; break; - case 803: return "SPRN_BESCRRU"; break; - case 771: return "SPRN_PMC1"; break; - case 772: return "SPRN_PMC2"; break; - case 773: return "SPRN_PMC3"; break; - case 774: return "SPRN_PMC4"; break; - case 775: return "SPRN_PMC5"; break; - case 776: return "SPRN_PMC6"; break; - case 780: return "SPRN_SIAR"; break; - case 781: return "SPRN_SDAR"; break; - case 768: return "SPRN_SIER"; break; - } - - return NULL; -} - -static void trace_print_reg(struct trace_entry *e) -{ - u64 *p, *reg, *value; - char *name; - - p = (u64 *)e->data; - reg = p++; - value = p; - - name = trace_decode_reg(*reg); - if (name) - printf("register %-10s = 0x%016llx\n", name, *value); - else - printf("register %lld = 0x%016llx\n", *reg, *value); -} - -static void trace_print_counter(struct trace_entry *e) -{ - u64 *value; - - value = (u64 *)e->data; - printf("counter = %lld\n", *value); -} - -static void trace_print_string(struct trace_entry *e) -{ - char *str; - - str = (char *)e->data; - puts(str); -} - -#define BASE_PREFIX 2 -#define PREFIX_DELTA 8 - -static void trace_print_entry(struct trace_entry *e, int seq, int *prefix) -{ - switch (e->type) { - case TRACE_TYPE_REG: - trace_print_header(seq, *prefix); - trace_print_reg(e); - break; - case TRACE_TYPE_COUNTER: - trace_print_header(seq, *prefix); - trace_print_counter(e); - break; - case TRACE_TYPE_STRING: - trace_print_header(seq, *prefix); - trace_print_string(e); - break; - case TRACE_TYPE_INDENT: - trace_print_header(seq, *prefix); - puts("{"); - *prefix += PREFIX_DELTA; - break; - case TRACE_TYPE_OUTDENT: - *prefix -= PREFIX_DELTA; - if (*prefix < BASE_PREFIX) - *prefix = BASE_PREFIX; - trace_print_header(seq, *prefix); - puts("}"); - break; - default: - trace_print_header(seq, *prefix); - printf("entry @ %p type %d\n", e, e->type); - break; - } -} - -void trace_buffer_print(struct trace_buffer *tb) -{ - struct trace_entry *e; - int i, prefix; - void *p; - - printf("Trace buffer dump:\n"); - printf(" address %p \n", tb); - printf(" tail %p\n", tb->tail); - printf(" size %llu\n", tb->size); - printf(" overflow %s\n", tb->overflow ? "TRUE" : "false"); - printf(" Content:\n"); - - p = tb->data; - - i = 0; - prefix = BASE_PREFIX; - - while (trace_check_bounds(tb, p) && p < tb->tail) { - e = p; - - trace_print_entry(e, i, &prefix); - - i++; - p = (void *)e + sizeof(*e) + e->length; - } -} - -void trace_print_location(struct trace_buffer *tb) -{ - printf("Trace buffer 0x%llx bytes @ %p\n", tb->size, tb); -} diff --git a/powerpc/pmu/ebb/trace.h b/powerpc/pmu/ebb/trace.h deleted file mode 100644 index 926458e..0000000 --- a/powerpc/pmu/ebb/trace.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#ifndef _SELFTESTS_POWERPC_PMU_EBB_TRACE_H -#define _SELFTESTS_POWERPC_PMU_EBB_TRACE_H - -#include "utils.h" - -#define TRACE_TYPE_REG 1 -#define TRACE_TYPE_COUNTER 2 -#define TRACE_TYPE_STRING 3 -#define TRACE_TYPE_INDENT 4 -#define TRACE_TYPE_OUTDENT 5 - -struct trace_entry -{ - u8 type; - u8 length; - u8 data[0]; -}; - -struct trace_buffer -{ - u64 size; - bool overflow; - void *tail; - u8 data[0]; -}; - -struct trace_buffer *trace_buffer_allocate(u64 size); -int trace_log_reg(struct trace_buffer *tb, u64 reg, u64 value); -int trace_log_counter(struct trace_buffer *tb, u64 value); -int trace_log_string(struct trace_buffer *tb, char *str); -int trace_log_indent(struct trace_buffer *tb); -int trace_log_outdent(struct trace_buffer *tb); -void trace_buffer_print(struct trace_buffer *tb); -void trace_print_location(struct trace_buffer *tb); - -#endif /* _SELFTESTS_POWERPC_PMU_EBB_TRACE_H */ diff --git a/powerpc/pmu/event.c b/powerpc/pmu/event.c deleted file mode 100644 index 184b368..0000000 --- a/powerpc/pmu/event.c +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright 2013, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#define _GNU_SOURCE -#include <unistd.h> -#include <sys/syscall.h> -#include <string.h> -#include <stdio.h> -#include <sys/ioctl.h> - -#include "event.h" - - -int perf_event_open(struct perf_event_attr *attr, pid_t pid, int cpu, - int group_fd, unsigned long flags) -{ - return syscall(__NR_perf_event_open, attr, pid, cpu, - group_fd, flags); -} - -void event_init_opts(struct event *e, u64 config, int type, char *name) -{ - memset(e, 0, sizeof(*e)); - - e->name = name; - - e->attr.type = type; - e->attr.config = config; - e->attr.size = sizeof(e->attr); - /* This has to match the structure layout in the header */ - e->attr.read_format = PERF_FORMAT_TOTAL_TIME_ENABLED | \ - PERF_FORMAT_TOTAL_TIME_RUNNING; -} - -void event_init_named(struct event *e, u64 config, char *name) -{ - event_init_opts(e, config, PERF_TYPE_RAW, name); -} - -void event_init(struct event *e, u64 config) -{ - event_init_opts(e, config, PERF_TYPE_RAW, "event"); -} - -#define PERF_CURRENT_PID 0 -#define PERF_NO_PID -1 -#define PERF_NO_CPU -1 -#define PERF_NO_GROUP -1 - -int event_open_with_options(struct event *e, pid_t pid, int cpu, int group_fd) -{ - e->fd = perf_event_open(&e->attr, pid, cpu, group_fd, 0); - if (e->fd == -1) { - perror("perf_event_open"); - return -1; - } - - return 0; -} - -int event_open_with_group(struct event *e, int group_fd) -{ - return event_open_with_options(e, PERF_CURRENT_PID, PERF_NO_CPU, group_fd); -} - -int event_open_with_pid(struct event *e, pid_t pid) -{ - return event_open_with_options(e, pid, PERF_NO_CPU, PERF_NO_GROUP); -} - -int event_open_with_cpu(struct event *e, int cpu) -{ - return event_open_with_options(e, PERF_NO_PID, cpu, PERF_NO_GROUP); -} - -int event_open(struct event *e) -{ - return event_open_with_options(e, PERF_CURRENT_PID, PERF_NO_CPU, PERF_NO_GROUP); -} - -void event_close(struct event *e) -{ - close(e->fd); -} - -int event_enable(struct event *e) -{ - return ioctl(e->fd, PERF_EVENT_IOC_ENABLE); -} - -int event_disable(struct event *e) -{ - return ioctl(e->fd, PERF_EVENT_IOC_DISABLE); -} - -int event_reset(struct event *e) -{ - return ioctl(e->fd, PERF_EVENT_IOC_RESET); -} - -int event_read(struct event *e) -{ - int rc; - - rc = read(e->fd, &e->result, sizeof(e->result)); - if (rc != sizeof(e->result)) { - fprintf(stderr, "read error on event %p!\n", e); - return -1; - } - - return 0; -} - -void event_report_justified(struct event *e, int name_width, int result_width) -{ - printf("%*s: result %*llu ", name_width, e->name, result_width, - e->result.value); - - if (e->result.running == e->result.enabled) - printf("running/enabled %llu\n", e->result.running); - else - printf("running %llu enabled %llu\n", e->result.running, - e->result.enabled); -} - -void event_report(struct event *e) -{ - event_report_justified(e, 0, 0); -} diff --git a/powerpc/pmu/event.h b/powerpc/pmu/event.h deleted file mode 100644 index a0ea6b1..0000000 --- a/powerpc/pmu/event.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2013, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#ifndef _SELFTESTS_POWERPC_PMU_EVENT_H -#define _SELFTESTS_POWERPC_PMU_EVENT_H - -#include <unistd.h> -#include <linux/perf_event.h> - -#include "utils.h" - - -struct event { - struct perf_event_attr attr; - char *name; - int fd; - /* This must match the read_format we use */ - struct { - u64 value; - u64 running; - u64 enabled; - } result; -}; - -void event_init(struct event *e, u64 config); -void event_init_named(struct event *e, u64 config, char *name); -void event_init_opts(struct event *e, u64 config, int type, char *name); -int event_open_with_options(struct event *e, pid_t pid, int cpu, int group_fd); -int event_open_with_group(struct event *e, int group_fd); -int event_open_with_pid(struct event *e, pid_t pid); -int event_open_with_cpu(struct event *e, int cpu); -int event_open(struct event *e); -void event_close(struct event *e); -int event_enable(struct event *e); -int event_disable(struct event *e); -int event_reset(struct event *e); -int event_read(struct event *e); -void event_report_justified(struct event *e, int name_width, int result_width); -void event_report(struct event *e); - -#endif /* _SELFTESTS_POWERPC_PMU_EVENT_H */ diff --git a/powerpc/pmu/lib.c b/powerpc/pmu/lib.c deleted file mode 100644 index 0f6a473..0000000 --- a/powerpc/pmu/lib.c +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#define _GNU_SOURCE /* For CPU_ZERO etc. */ - -#include <errno.h> -#include <sched.h> -#include <setjmp.h> -#include <stdlib.h> -#include <sys/wait.h> - -#include "utils.h" -#include "lib.h" - - -int pick_online_cpu(void) -{ - cpu_set_t mask; - int cpu; - - CPU_ZERO(&mask); - - if (sched_getaffinity(0, sizeof(mask), &mask)) { - perror("sched_getaffinity"); - return -1; - } - - /* We prefer a primary thread, but skip 0 */ - for (cpu = 8; cpu < CPU_SETSIZE; cpu += 8) - if (CPU_ISSET(cpu, &mask)) - return cpu; - - /* Search for anything, but in reverse */ - for (cpu = CPU_SETSIZE - 1; cpu >= 0; cpu--) - if (CPU_ISSET(cpu, &mask)) - return cpu; - - printf("No cpus in affinity mask?!\n"); - return -1; -} - -int bind_to_cpu(int cpu) -{ - cpu_set_t mask; - - printf("Binding to cpu %d\n", cpu); - - CPU_ZERO(&mask); - CPU_SET(cpu, &mask); - - return sched_setaffinity(0, sizeof(mask), &mask); -} - -#define PARENT_TOKEN 0xAA -#define CHILD_TOKEN 0x55 - -int sync_with_child(union pipe read_pipe, union pipe write_pipe) -{ - char c = PARENT_TOKEN; - - FAIL_IF(write(write_pipe.write_fd, &c, 1) != 1); - FAIL_IF(read(read_pipe.read_fd, &c, 1) != 1); - if (c != CHILD_TOKEN) /* sometimes expected */ - return 1; - - return 0; -} - -int wait_for_parent(union pipe read_pipe) -{ - char c; - - FAIL_IF(read(read_pipe.read_fd, &c, 1) != 1); - FAIL_IF(c != PARENT_TOKEN); - - return 0; -} - -int notify_parent(union pipe write_pipe) -{ - char c = CHILD_TOKEN; - - FAIL_IF(write(write_pipe.write_fd, &c, 1) != 1); - - return 0; -} - -int notify_parent_of_error(union pipe write_pipe) -{ - char c = ~CHILD_TOKEN; - - FAIL_IF(write(write_pipe.write_fd, &c, 1) != 1); - - return 0; -} - -int wait_for_child(pid_t child_pid) -{ - int rc; - - if (waitpid(child_pid, &rc, 0) == -1) { - perror("waitpid"); - return 1; - } - - if (WIFEXITED(rc)) - rc = WEXITSTATUS(rc); - else - rc = 1; /* Signal or other */ - - return rc; -} - -int kill_child_and_wait(pid_t child_pid) -{ - kill(child_pid, SIGTERM); - - return wait_for_child(child_pid); -} - -static int eat_cpu_child(union pipe read_pipe, union pipe write_pipe) -{ - volatile int i = 0; - - /* - * We are just here to eat cpu and die. So make sure we can be killed, - * and also don't do any custom SIGTERM handling. - */ - signal(SIGTERM, SIG_DFL); - - notify_parent(write_pipe); - wait_for_parent(read_pipe); - - /* Soak up cpu forever */ - while (1) i++; - - return 0; -} - -pid_t eat_cpu(int (test_function)(void)) -{ - union pipe read_pipe, write_pipe; - int cpu, rc; - pid_t pid; - - cpu = pick_online_cpu(); - FAIL_IF(cpu < 0); - FAIL_IF(bind_to_cpu(cpu)); - - if (pipe(read_pipe.fds) == -1) - return -1; - - if (pipe(write_pipe.fds) == -1) - return -1; - - pid = fork(); - if (pid == 0) - exit(eat_cpu_child(write_pipe, read_pipe)); - - if (sync_with_child(read_pipe, write_pipe)) { - rc = -1; - goto out; - } - - printf("main test running as pid %d\n", getpid()); - - rc = test_function(); -out: - kill(pid, SIGKILL); - - return rc; -} - -struct addr_range libc, vdso; - -int parse_proc_maps(void) -{ - char execute, name[128]; - uint64_t start, end; - FILE *f; - int rc; - - f = fopen("/proc/self/maps", "r"); - if (!f) { - perror("fopen"); - return -1; - } - - do { - /* This skips line with no executable which is what we want */ - rc = fscanf(f, "%lx-%lx %*c%*c%c%*c %*x %*d:%*d %*d %127s\n", - &start, &end, &execute, name); - if (rc <= 0) - break; - - if (execute != 'x') - continue; - - if (strstr(name, "libc")) { - libc.first = start; - libc.last = end - 1; - } else if (strstr(name, "[vdso]")) { - vdso.first = start; - vdso.last = end - 1; - } - } while(1); - - fclose(f); - - return 0; -} - -#define PARANOID_PATH "/proc/sys/kernel/perf_event_paranoid" - -bool require_paranoia_below(int level) -{ - unsigned long current; - char *end, buf[16]; - FILE *f; - int rc; - - rc = -1; - - f = fopen(PARANOID_PATH, "r"); - if (!f) { - perror("fopen"); - goto out; - } - - if (!fgets(buf, sizeof(buf), f)) { - printf("Couldn't read " PARANOID_PATH "?\n"); - goto out_close; - } - - current = strtoul(buf, &end, 10); - - if (end == buf) { - printf("Couldn't parse " PARANOID_PATH "?\n"); - goto out_close; - } - - if (current >= level) - goto out; - - rc = 0; -out_close: - fclose(f); -out: - return rc; -} diff --git a/powerpc/pmu/lib.h b/powerpc/pmu/lib.h deleted file mode 100644 index ca5d72a..0000000 --- a/powerpc/pmu/lib.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2014, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#ifndef __SELFTESTS_POWERPC_PMU_LIB_H -#define __SELFTESTS_POWERPC_PMU_LIB_H - -#include <stdio.h> -#include <stdint.h> -#include <string.h> -#include <unistd.h> - -union pipe { - struct { - int read_fd; - int write_fd; - }; - int fds[2]; -}; - -extern int pick_online_cpu(void); -extern int bind_to_cpu(int cpu); -extern int kill_child_and_wait(pid_t child_pid); -extern int wait_for_child(pid_t child_pid); -extern int sync_with_child(union pipe read_pipe, union pipe write_pipe); -extern int wait_for_parent(union pipe read_pipe); -extern int notify_parent(union pipe write_pipe); -extern int notify_parent_of_error(union pipe write_pipe); -extern pid_t eat_cpu(int (test_function)(void)); -extern bool require_paranoia_below(int level); - -struct addr_range { - uint64_t first, last; -}; - -extern struct addr_range libc, vdso; - -int parse_proc_maps(void); - -#endif /* __SELFTESTS_POWERPC_PMU_LIB_H */ diff --git a/powerpc/pmu/loop.S b/powerpc/pmu/loop.S deleted file mode 100644 index 20c1f08..0000000 --- a/powerpc/pmu/loop.S +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2013, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#include <ppc-asm.h> - - .text - -FUNC_START(thirty_two_instruction_loop) - cmpdi r3,0 - beqlr - addi r4,r3,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 - addi r4,r4,1 # 28 addi's - subi r3,r3,1 - b FUNC_NAME(thirty_two_instruction_loop) -FUNC_END(thirty_two_instruction_loop) diff --git a/powerpc/subunit.h b/powerpc/subunit.h deleted file mode 100644 index 9c6c4e9..0000000 --- a/powerpc/subunit.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2013, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#ifndef _SELFTESTS_POWERPC_SUBUNIT_H -#define _SELFTESTS_POWERPC_SUBUNIT_H - -static inline void test_start(char *name) -{ - printf("test: %s\n", name); -} - -static inline void test_failure_detail(char *name, char *detail) -{ - printf("failure: %s [%s]\n", name, detail); -} - -static inline void test_failure(char *name) -{ - printf("failure: %s\n", name); -} - -static inline void test_error(char *name) -{ - printf("error: %s\n", name); -} - -static inline void test_skip(char *name) -{ - printf("skip: %s\n", name); -} - -static inline void test_success(char *name) -{ - printf("success: %s\n", name); -} - -static inline void test_finish(char *name, int status) -{ - if (status) - test_failure(name); - else - test_success(name); -} - -static inline void test_set_git_version(char *value) -{ - printf("tags: git_version:%s\n", value); -} - -#endif /* _SELFTESTS_POWERPC_SUBUNIT_H */ diff --git a/powerpc/tm/Makefile b/powerpc/tm/Makefile deleted file mode 100644 index 2cede23..0000000 --- a/powerpc/tm/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -PROGS := tm-resched-dscr - -all: $(PROGS) - -$(PROGS): ../harness.c - -run_tests: all - @-for PROG in $(PROGS); do \ - ./$$PROG; \ - done; - -clean: - rm -f $(PROGS) *.o - -.PHONY: all run_tests clean diff --git a/powerpc/tm/tm-resched-dscr.c b/powerpc/tm/tm-resched-dscr.c deleted file mode 100644 index 42d4c8c..0000000 --- a/powerpc/tm/tm-resched-dscr.c +++ /dev/null @@ -1,98 +0,0 @@ -/* Test context switching to see if the DSCR SPR is correctly preserved - * when within a transaction. - * - * Note: We assume that the DSCR has been left at the default value (0) - * for all CPUs. - * - * Method: - * - * Set a value into the DSCR. - * - * Start a transaction, and suspend it (*). - * - * Hard loop checking to see if the transaction has become doomed. - * - * Now that we *may* have been preempted, record the DSCR and TEXASR SPRS. - * - * If the abort was because of a context switch, check the DSCR value. - * Otherwise, try again. - * - * (*) If the transaction is not suspended we can't see the problem because - * the transaction abort handler will restore the DSCR to it's checkpointed - * value before we regain control. - */ - -#include <inttypes.h> -#include <stdio.h> -#include <stdlib.h> -#include <assert.h> -#include <asm/tm.h> - -#include "utils.h" - -#define TBEGIN ".long 0x7C00051D ;" -#define TEND ".long 0x7C00055D ;" -#define TCHECK ".long 0x7C00059C ;" -#define TSUSPEND ".long 0x7C0005DD ;" -#define TRESUME ".long 0x7C2005DD ;" -#define SPRN_TEXASR 0x82 -#define SPRN_DSCR 0x03 - -int test_body(void) -{ - uint64_t rv, dscr1 = 1, dscr2, texasr; - - printf("Check DSCR TM context switch: "); - fflush(stdout); - for (;;) { - rv = 1; - asm __volatile__ ( - /* set a known value into the DSCR */ - "ld 3, %[dscr1];" - "mtspr %[sprn_dscr], 3;" - - /* start and suspend a transaction */ - TBEGIN - "beq 1f;" - TSUSPEND - - /* hard loop until the transaction becomes doomed */ - "2: ;" - TCHECK - "bc 4, 0, 2b;" - - /* record DSCR and TEXASR */ - "mfspr 3, %[sprn_dscr];" - "std 3, %[dscr2];" - "mfspr 3, %[sprn_texasr];" - "std 3, %[texasr];" - - TRESUME - TEND - "li %[rv], 0;" - "1: ;" - : [rv]"=r"(rv), [dscr2]"=m"(dscr2), [texasr]"=m"(texasr) - : [dscr1]"m"(dscr1) - , [sprn_dscr]"i"(SPRN_DSCR), [sprn_texasr]"i"(SPRN_TEXASR) - : "memory", "r3" - ); - assert(rv); /* make sure the transaction aborted */ - if ((texasr >> 56) != TM_CAUSE_RESCHED) { - putchar('.'); - fflush(stdout); - continue; - } - if (dscr2 != dscr1) { - printf(" FAIL\n"); - return 1; - } else { - printf(" OK\n"); - return 0; - } - } -} - -int main(void) -{ - return test_harness(test_body, "tm_resched_dscr"); -} diff --git a/powerpc/utils.h b/powerpc/utils.h deleted file mode 100644 index a93777a..0000000 --- a/powerpc/utils.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2013, Michael Ellerman, IBM Corp. - * Licensed under GPLv2. - */ - -#ifndef _SELFTESTS_POWERPC_UTILS_H -#define _SELFTESTS_POWERPC_UTILS_H - -#include <stdint.h> -#include <stdbool.h> - -/* Avoid headaches with PRI?64 - just use %ll? always */ -typedef unsigned long long u64; -typedef signed long long s64; - -/* Just for familiarity */ -typedef uint32_t u32; -typedef uint8_t u8; - - -int test_harness(int (test_function)(void), char *name); - - -/* Yes, this is evil */ -#define FAIL_IF(x) \ -do { \ - if ((x)) { \ - fprintf(stderr, \ - "[FAIL] Test FAILED on line %d\n", __LINE__); \ - return 1; \ - } \ -} while (0) - -/* The test harness uses this, yes it's gross */ -#define MAGIC_SKIP_RETURN_VALUE 99 - -#define SKIP_IF(x) \ -do { \ - if ((x)) { \ - fprintf(stderr, \ - "[SKIP] Test skipped on line %d\n", __LINE__); \ - return MAGIC_SKIP_RETURN_VALUE; \ - } \ -} while (0) - -#define _str(s) #s -#define str(s) _str(s) - -#endif /* _SELFTESTS_POWERPC_UTILS_H */ diff --git a/ptrace/Makefile b/ptrace/Makefile deleted file mode 100644 index 47ae2d3..0000000 --- a/ptrace/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -CFLAGS += -iquote../../../../include/uapi -Wall -peeksiginfo: peeksiginfo.c - -all: peeksiginfo - -clean: - rm -f peeksiginfo - -run_tests: all - @./peeksiginfo || echo "peeksiginfo selftests: [FAIL]" diff --git a/ptrace/peeksiginfo.c b/ptrace/peeksiginfo.c deleted file mode 100644 index d46558b..0000000 --- a/ptrace/peeksiginfo.c +++ /dev/null @@ -1,214 +0,0 @@ -#define _GNU_SOURCE -#include <stdio.h> -#include <signal.h> -#include <unistd.h> -#include <errno.h> -#include <linux/types.h> -#include <sys/wait.h> -#include <sys/syscall.h> -#include <sys/user.h> -#include <sys/mman.h> - -#include "linux/ptrace.h" - -static int sys_rt_sigqueueinfo(pid_t tgid, int sig, siginfo_t *uinfo) -{ - return syscall(SYS_rt_sigqueueinfo, tgid, sig, uinfo); -} - -static int sys_rt_tgsigqueueinfo(pid_t tgid, pid_t tid, - int sig, siginfo_t *uinfo) -{ - return syscall(SYS_rt_tgsigqueueinfo, tgid, tid, sig, uinfo); -} - -static int sys_ptrace(int request, pid_t pid, void *addr, void *data) -{ - return syscall(SYS_ptrace, request, pid, addr, data); -} - -#define SIGNR 10 -#define TEST_SICODE_PRIV -1 -#define TEST_SICODE_SHARE -2 - -#define err(fmt, ...) \ - fprintf(stderr, \ - "Error (%s:%d): " fmt, \ - __FILE__, __LINE__, ##__VA_ARGS__) - -static int check_error_paths(pid_t child) -{ - struct ptrace_peeksiginfo_args arg; - int ret, exit_code = -1; - void *addr_rw, *addr_ro; - - /* - * Allocate two contiguous pages. The first one is for read-write, - * another is for read-only. - */ - addr_rw = mmap(NULL, 2 * PAGE_SIZE, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - if (addr_rw == MAP_FAILED) { - err("mmap() failed: %m\n"); - return 1; - } - - addr_ro = mmap(addr_rw + PAGE_SIZE, PAGE_SIZE, PROT_READ, - MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); - if (addr_ro == MAP_FAILED) { - err("mmap() failed: %m\n"); - goto out; - } - - arg.nr = SIGNR; - arg.off = 0; - - /* Unsupported flags */ - arg.flags = ~0; - ret = sys_ptrace(PTRACE_PEEKSIGINFO, child, &arg, addr_rw); - if (ret != -1 || errno != EINVAL) { - err("sys_ptrace() returns %d (expected -1)," - " errno %d (expected %d): %m\n", - ret, errno, EINVAL); - goto out; - } - arg.flags = 0; - - /* A part of the buffer is read-only */ - ret = sys_ptrace(PTRACE_PEEKSIGINFO, child, &arg, - addr_ro - sizeof(siginfo_t) * 2); - if (ret != 2) { - err("sys_ptrace() returns %d (expected 2): %m\n", ret); - goto out; - } - - /* Read-only buffer */ - ret = sys_ptrace(PTRACE_PEEKSIGINFO, child, &arg, addr_ro); - if (ret != -1 && errno != EFAULT) { - err("sys_ptrace() returns %d (expected -1)," - " errno %d (expected %d): %m\n", - ret, errno, EFAULT); - goto out; - } - - exit_code = 0; -out: - munmap(addr_rw, 2 * PAGE_SIZE); - return exit_code; -} - -int check_direct_path(pid_t child, int shared, int nr) -{ - struct ptrace_peeksiginfo_args arg = {.flags = 0, .nr = nr, .off = 0}; - int i, j, ret, exit_code = -1; - siginfo_t siginfo[SIGNR]; - int si_code; - - if (shared == 1) { - arg.flags = PTRACE_PEEKSIGINFO_SHARED; - si_code = TEST_SICODE_SHARE; - } else { - arg.flags = 0; - si_code = TEST_SICODE_PRIV; - } - - for (i = 0; i < SIGNR; ) { - arg.off = i; - ret = sys_ptrace(PTRACE_PEEKSIGINFO, child, &arg, siginfo); - if (ret == -1) { - err("ptrace() failed: %m\n"); - goto out; - } - - if (ret == 0) - break; - - for (j = 0; j < ret; j++, i++) { - if (siginfo[j].si_code == si_code && - siginfo[j].si_int == i) - continue; - - err("%d: Wrong siginfo i=%d si_code=%d si_int=%d\n", - shared, i, siginfo[j].si_code, siginfo[j].si_int); - goto out; - } - } - - if (i != SIGNR) { - err("Only %d signals were read\n", i); - goto out; - } - - exit_code = 0; -out: - return exit_code; -} - -int main(int argc, char *argv[]) -{ - siginfo_t siginfo[SIGNR]; - int i, exit_code = 1; - sigset_t blockmask; - pid_t child; - - sigemptyset(&blockmask); - sigaddset(&blockmask, SIGRTMIN); - sigprocmask(SIG_BLOCK, &blockmask, NULL); - - child = fork(); - if (child == -1) { - err("fork() failed: %m"); - return 1; - } else if (child == 0) { - pid_t ppid = getppid(); - while (1) { - if (ppid != getppid()) - break; - sleep(1); - } - return 1; - } - - /* Send signals in process-wide and per-thread queues */ - for (i = 0; i < SIGNR; i++) { - siginfo->si_code = TEST_SICODE_SHARE; - siginfo->si_int = i; - sys_rt_sigqueueinfo(child, SIGRTMIN, siginfo); - - siginfo->si_code = TEST_SICODE_PRIV; - siginfo->si_int = i; - sys_rt_tgsigqueueinfo(child, child, SIGRTMIN, siginfo); - } - - if (sys_ptrace(PTRACE_ATTACH, child, NULL, NULL) == -1) - return 1; - - waitpid(child, NULL, 0); - - /* Dump signals one by one*/ - if (check_direct_path(child, 0, 1)) - goto out; - /* Dump all signals for one call */ - if (check_direct_path(child, 0, SIGNR)) - goto out; - - /* - * Dump signal from the process-wide queue. - * The number of signals is not multible to the buffer size - */ - if (check_direct_path(child, 1, 3)) - goto out; - - if (check_error_paths(child)) - goto out; - - printf("PASS\n"); - exit_code = 0; -out: - if (sys_ptrace(PTRACE_KILL, child, NULL, NULL) == -1) - return 1; - - waitpid(child, NULL, 0); - - return exit_code; -} diff --git a/rcutorture/.gitignore b/rcutorture/.gitignore deleted file mode 100644 index 05838f6..0000000 --- a/rcutorture/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -initrd -linux-2.6 -b[0-9]* -rcu-test-image -res -*.swp diff --git a/rcutorture/bin/config2frag.sh b/rcutorture/bin/config2frag.sh deleted file mode 100644 index 9f9ffcd..0000000 --- a/rcutorture/bin/config2frag.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh -# Usage: sh config2frag.sh < .config > configfrag -# -# Converts the "# CONFIG_XXX is not set" to "CONFIG_XXX=n" so that the -# resulting file becomes a legitimate Kconfig fragment. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, you can access it online at -# http://www.gnu.org/licenses/gpl-2.0.html. -# -# Copyright (C) IBM Corporation, 2013 -# -# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com> - -LANG=C sed -e 's/^# CONFIG_\([a-zA-Z0-9_]*\) is not set$/CONFIG_\1=n/' diff --git a/rcutorture/bin/configNR_CPUS.sh b/rcutorture/bin/configNR_CPUS.sh deleted file mode 100755 index 43540f1..0000000 --- a/rcutorture/bin/configNR_CPUS.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash -# -# Extract the number of CPUs expected from the specified Kconfig-file -# fragment by checking CONFIG_SMP and CONFIG_NR_CPUS. If the specified -# file gives no clue, base the number on the number of idle CPUs on -# the system. -# -# Usage: configNR_CPUS.sh config-frag -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, you can access it online at -# http://www.gnu.org/licenses/gpl-2.0.html. -# -# Copyright (C) IBM Corporation, 2013 -# -# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com> - -cf=$1 -if test ! -r $cf -then - echo Unreadable config fragment $cf 1>&2 - exit -1 -fi -if grep -q '^CONFIG_SMP=n$' $cf -then - echo 1 - exit 0 -fi -if grep -q '^CONFIG_NR_CPUS=' $cf -then - grep '^CONFIG_NR_CPUS=' $cf | - sed -e 's/^CONFIG_NR_CPUS=\([0-9]*\).*$/\1/' - exit 0 -fi -cpus2use.sh diff --git a/rcutorture/bin/configcheck.sh b/rcutorture/bin/configcheck.sh deleted file mode 100755 index d686537..0000000 --- a/rcutorture/bin/configcheck.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/sh -# Usage: sh configcheck.sh .config .config-template -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, you can access it online at -# http://www.gnu.org/licenses/gpl-2.0.html. -# -# Copyright (C) IBM Corporation, 2011 -# -# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com> - -T=/tmp/abat-chk-config.sh.$$ -trap 'rm -rf $T' 0 -mkdir $T - -cat $1 > $T/.config - -cat $2 | sed -e 's/\(.*\)=n/# \1 is not set/' -e 's/^#CHECK#//' | -awk ' -BEGIN { - print "if grep -q \"" $0 "\" < '"$T/.config"'"; - print "then"; - print "\t:"; - print "else"; - if ($1 == "#") { - print "\tif grep -q \"" $2 "\" < '"$T/.config"'"; - print "\tthen"; - print "\t\tif test \"$firsttime\" = \"\"" - print "\t\tthen" - print "\t\t\tfirsttime=1" - print "\t\tfi" - print "\t\techo \":" $2 ": improperly set\""; - print "\telse"; - print "\t\t:"; - print "\tfi"; - } else { - print "\tif test \"$firsttime\" = \"\"" - print "\tthen" - print "\t\tfirsttime=1" - print "\tfi" - print "\techo \":" $0 ": improperly set\""; - } - print "fi"; - }' | sh diff --git a/rcutorture/bin/configinit.sh b/rcutorture/bin/configinit.sh deleted file mode 100755 index 9c3f3d3..0000000 --- a/rcutorture/bin/configinit.sh +++ /dev/null @@ -1,74 +0,0 @@ -#!/bin/sh -# -# sh configinit.sh config-spec-file [ build output dir ] -# -# Create a .config file from the spec file. Run from the kernel source tree. -# Exits with 0 if all went well, with 1 if all went well but the config -# did not match, and some other number for other failures. -# -# The first argument is the .config specification file, which contains -# desired settings, for example, "CONFIG_NO_HZ=y". For best results, -# this should be a full pathname. -# -# The second argument is a optional path to a build output directory, -# for example, "O=/tmp/foo". If this argument is omitted, the .config -# file will be generated directly in the current directory. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, you can access it online at -# http://www.gnu.org/licenses/gpl-2.0.html. -# -# Copyright (C) IBM Corporation, 2013 -# -# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com> - -T=/tmp/configinit.sh.$$ -trap 'rm -rf $T' 0 -mkdir $T - -# Capture config spec file. - -c=$1 -buildloc=$2 -builddir= -if test -n $buildloc -then - if echo $buildloc | grep -q '^O=' - then - builddir=`echo $buildloc | sed -e 's/^O=//'` - if test ! -d $builddir - then - mkdir $builddir - fi - else - echo Bad build directory: \"$builddir\" - exit 2 - fi -fi - -sed -e 's/^\(CONFIG[0-9A-Z_]*\)=.*$/grep -v "^# \1" |/' < $c > $T/u.sh -sed -e 's/^\(CONFIG[0-9A-Z_]*=\).*$/grep -v \1 |/' < $c >> $T/u.sh -grep '^grep' < $T/u.sh > $T/upd.sh -echo "cat - $c" >> $T/upd.sh -make mrproper -make $buildloc distclean > $builddir/Make.distclean 2>&1 -make $buildloc $TORTURE_DEFCONFIG > $builddir/Make.defconfig.out 2>&1 -mv $builddir/.config $builddir/.config.sav -sh $T/upd.sh < $builddir/.config.sav > $builddir/.config -cp $builddir/.config $builddir/.config.new -yes '' | make $buildloc oldconfig > $builddir/Make.modconfig.out 2>&1 - -# verify new config matches specification. -configcheck.sh $builddir/.config $c - -exit 0 diff --git a/rcutorture/bin/cpus2use.sh b/rcutorture/bin/cpus2use.sh deleted file mode 100755 index abe14b7..0000000 --- a/rcutorture/bin/cpus2use.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash -# -# Get an estimate of how CPU-hoggy to be. -# -# Usage: cpus2use.sh -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, you can access it online at -# http://www.gnu.org/licenses/gpl-2.0.html. -# -# Copyright (C) IBM Corporation, 2013 -# -# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com> - -ncpus=`grep '^processor' /proc/cpuinfo | wc -l` -idlecpus=`mpstat | tail -1 | \ - awk -v ncpus=$ncpus '{ print ncpus * ($7 + $12) / 100 }'` -awk -v ncpus=$ncpus -v idlecpus=$idlecpus < /dev/null ' -BEGIN { - cpus2use = idlecpus; - if (cpus2use < 1) - cpus2use = 1; - if (cpus2use < ncpus / 10) - cpus2use = ncpus / 10; - if (cpus2use == int(cpus2use)) - cpus2use = int(cpus2use) - else - cpus2use = int(cpus2use) + 1 - print cpus2use; -}' - diff --git a/rcutorture/bin/functions.sh b/rcutorture/bin/functions.sh deleted file mode 100644 index d01b865..0000000 --- a/rcutorture/bin/functions.sh +++ /dev/null @@ -1,223 +0,0 @@ -#!/bin/bash -# -# Shell functions for the rest of the scripts. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, you can access it online at -# http://www.gnu.org/licenses/gpl-2.0.html. -# -# Copyright (C) IBM Corporation, 2013 -# -# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com> - -# bootparam_hotplug_cpu bootparam-string -# -# Returns 1 if the specified boot-parameter string tells rcutorture to -# test CPU-hotplug operations. -bootparam_hotplug_cpu () { - echo "$1" | grep -q "rcutorture\.onoff_" -} - -# checkarg --argname argtype $# arg mustmatch cannotmatch -# -# Checks the specified argument "arg" against the mustmatch and cannotmatch -# patterns. -checkarg () { - if test $3 -le 1 - then - echo $1 needs argument $2 matching \"$5\" - usage - fi - if echo "$4" | grep -q -e "$5" - then - : - else - echo $1 $2 \"$4\" must match \"$5\" - usage - fi - if echo "$4" | grep -q -e "$6" - then - echo $1 $2 \"$4\" must not match \"$6\" - usage - fi -} - -# configfrag_boot_params bootparam-string config-fragment-file -# -# Adds boot parameters from the .boot file, if any. -configfrag_boot_params () { - if test -r "$2.boot" - then - echo $1 `grep -v '^#' "$2.boot" | tr '\012' ' '` - else - echo $1 - fi -} - -# configfrag_hotplug_cpu config-fragment-file -# -# Returns 1 if the config fragment specifies hotplug CPU. -configfrag_hotplug_cpu () { - if test ! -r "$1" - then - echo Unreadable config fragment "$1" 1>&2 - exit -1 - fi - grep -q '^CONFIG_HOTPLUG_CPU=y$' "$1" -} - -# identify_boot_image qemu-cmd -# -# Returns the relative path to the kernel build image. This will be -# arch/<arch>/boot/bzImage unless overridden with the TORTURE_BOOT_IMAGE -# environment variable. -identify_boot_image () { - if test -n "$TORTURE_BOOT_IMAGE" - then - echo $TORTURE_BOOT_IMAGE - else - case "$1" in - qemu-system-x86_64|qemu-system-i386) - echo arch/x86/boot/bzImage - ;; - qemu-system-ppc64) - echo arch/powerpc/boot/bzImage - ;; - *) - echo "" - ;; - esac - fi -} - -# identify_qemu builddir -# -# Returns our best guess as to which qemu command is appropriate for -# the kernel at hand. Override with the TORTURE_QEMU_CMD environment variable. -identify_qemu () { - local u="`file "$1"`" - if test -n "$TORTURE_QEMU_CMD" - then - echo $TORTURE_QEMU_CMD - elif echo $u | grep -q x86-64 - then - echo qemu-system-x86_64 - elif echo $u | grep -q "Intel 80386" - then - echo qemu-system-i386 - elif uname -a | grep -q ppc64 - then - echo qemu-system-ppc64 - else - echo Cannot figure out what qemu command to use! 1>&2 - echo file $1 output: $u - # Usually this will be one of /usr/bin/qemu-system-* - # Use TORTURE_QEMU_CMD environment variable or appropriate - # argument to top-level script. - exit 1 - fi -} - -# identify_qemu_append qemu-cmd -# -# Output arguments for the qemu "-append" string based on CPU type -# and the TORTURE_QEMU_INTERACTIVE environment variable. -identify_qemu_append () { - case "$1" in - qemu-system-x86_64|qemu-system-i386) - echo noapic selinux=0 initcall_debug debug - ;; - esac - if test -n "$TORTURE_QEMU_INTERACTIVE" - then - echo root=/dev/sda - else - echo console=ttyS0 - fi -} - -# identify_qemu_args qemu-cmd serial-file -# -# Output arguments for qemu arguments based on the TORTURE_QEMU_MAC -# and TORTURE_QEMU_INTERACTIVE environment variables. -identify_qemu_args () { - case "$1" in - qemu-system-x86_64|qemu-system-i386) - ;; - qemu-system-ppc64) - echo -enable-kvm -M pseries -cpu POWER7 -nodefaults - echo -device spapr-vscsi - if test -n "$TORTURE_QEMU_INTERACTIVE" -a -n "$TORTURE_QEMU_MAC" - then - echo -device spapr-vlan,netdev=net0,mac=$TORTURE_QEMU_MAC - echo -netdev bridge,br=br0,id=net0 - elif test -n "$TORTURE_QEMU_INTERACTIVE" - then - echo -net nic -net user - fi - ;; - esac - if test -n "$TORTURE_QEMU_INTERACTIVE" - then - echo -monitor stdio -serial pty -S - else - echo -serial file:$2 - fi -} - -# identify_qemu_vcpus -# -# Returns the number of virtual CPUs available to the aggregate of the -# guest OSes. -identify_qemu_vcpus () { - lscpu | grep '^CPU(s):' | sed -e 's/CPU(s)://' -} - -# print_bug -# -# Prints "BUG: " in red followed by remaining arguments -print_bug () { - printf '\033[031mBUG: \033[m' - echo $* -} - -# print_warning -# -# Prints "WARNING: " in yellow followed by remaining arguments -print_warning () { - printf '\033[033mWARNING: \033[m' - echo $* -} - -# specify_qemu_cpus qemu-cmd qemu-args #cpus -# -# Appends a string containing "-smp XXX" to qemu-args, unless the incoming -# qemu-args already contains "-smp". -specify_qemu_cpus () { - local nt; - - if echo $2 | grep -q -e -smp - then - echo $2 - else - case "$1" in - qemu-system-x86_64|qemu-system-i386) - echo $2 -smp $3 - ;; - qemu-system-ppc64) - nt="`lscpu | grep '^NUMA node0' | sed -e 's/^[^,]*,\([0-9]*\),.*$/\1/'`" - echo $2 -smp cores=`expr \( $3 + $nt - 1 \) / $nt`,threads=$nt - ;; - esac - fi -} diff --git a/rcutorture/bin/kvm-build.sh b/rcutorture/bin/kvm-build.sh deleted file mode 100755 index 7c1e56b..0000000 --- a/rcutorture/bin/kvm-build.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash -# -# Build a kvm-ready Linux kernel from the tree in the current directory. -# -# Usage: sh kvm-build.sh config-template build-dir more-configs -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, you can access it online at -# http://www.gnu.org/licenses/gpl-2.0.html. -# -# Copyright (C) IBM Corporation, 2011 -# -# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com> - -config_template=${1} -if test -z "$config_template" -o ! -f "$config_template" -o ! -r "$config_template" -then - echo "kvm-build.sh :$config_template: Not a readable file" - exit 1 -fi -builddir=${2} -if test -z "$builddir" -o ! -d "$builddir" -o ! -w "$builddir" -then - echo "kvm-build.sh :$builddir: Not a writable directory, cannot build into it" - exit 1 -fi -moreconfigs=${3} -if test -z "$moreconfigs" -o ! -r "$moreconfigs" -then - echo "kvm-build.sh :$moreconfigs: Not a readable file" - exit 1 -fi - -T=/tmp/test-linux.sh.$$ -trap 'rm -rf $T' 0 -mkdir $T - -grep -v 'CONFIG_[A-Z]*_TORTURE_TEST' < ${config_template} > $T/config -cat << ___EOF___ >> $T/config -CONFIG_INITRAMFS_SOURCE="$TORTURE_INITRD" -CONFIG_VIRTIO_PCI=y -CONFIG_VIRTIO_CONSOLE=y -___EOF___ -cat $moreconfigs >> $T/config - -configinit.sh $T/config O=$builddir -retval=$? -if test $retval -gt 1 -then - exit 2 -fi -ncpus=`cpus2use.sh` -make O=$builddir -j$ncpus $TORTURE_KMAKE_ARG > $builddir/Make.out 2>&1 -retval=$? -if test $retval -ne 0 || grep "rcu[^/]*": < $builddir/Make.out | egrep -q "Stop|Error|error:|warning:" || egrep -q "Stop|Error|error:" < $builddir/Make.out -then - echo Kernel build error - egrep "Stop|Error|error:|warning:" < $builddir/Make.out - echo Run aborted. - exit 3 -fi diff --git a/rcutorture/bin/kvm-recheck-lock.sh b/rcutorture/bin/kvm-recheck-lock.sh deleted file mode 100755 index 7f1ff1a..0000000 --- a/rcutorture/bin/kvm-recheck-lock.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash -# -# Analyze a given results directory for locktorture progress. -# -# Usage: sh kvm-recheck-lock.sh resdir -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, you can access it online at -# http://www.gnu.org/licenses/gpl-2.0.html. -# -# Copyright (C) IBM Corporation, 2014 -# -# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com> - -i="$1" -if test -d $i -then - : -else - echo Unreadable results directory: $i - exit 1 -fi - -configfile=`echo $i | sed -e 's/^.*\///'` -ncs=`grep "Writes: Total:" $i/console.log 2> /dev/null | tail -1 | sed -e 's/^.* Total: //' -e 's/ .*$//'` -if test -z "$ncs" -then - echo "$configfile -------" -else - title="$configfile ------- $ncs acquisitions/releases" - dur=`sed -e 's/^.* locktorture.shutdown_secs=//' -e 's/ .*$//' < $i/qemu-cmd 2> /dev/null` - if test -z "$dur" - then - : - else - ncsps=`awk -v ncs=$ncs -v dur=$dur ' - BEGIN { print ncs / dur }' < /dev/null` - title="$title ($ncsps per second)" - fi - echo $title -fi diff --git a/rcutorture/bin/kvm-recheck-rcu.sh b/rcutorture/bin/kvm-recheck-rcu.sh deleted file mode 100755 index 307c4b9..0000000 --- a/rcutorture/bin/kvm-recheck-rcu.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash -# -# Analyze a given results directory for rcutorture progress. -# -# Usage: sh kvm-recheck-rcu.sh resdir -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, you can access it online at -# http://www.gnu.org/licenses/gpl-2.0.html. -# -# Copyright (C) IBM Corporation, 2014 -# -# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com> - -i="$1" -if test -d $i -then - : -else - echo Unreadable results directory: $i - exit 1 -fi - -configfile=`echo $i | sed -e 's/^.*\///'` -ngps=`grep ver: $i/console.log 2> /dev/null | tail -1 | sed -e 's/^.* ver: //' -e 's/ .*$//'` -if test -z "$ngps" -then - echo "$configfile -------" -else - title="$configfile ------- $ngps grace periods" - dur=`sed -e 's/^.* rcutorture.shutdown_secs=//' -e 's/ .*$//' < $i/qemu-cmd 2> /dev/null` - if test -z "$dur" - then - : - else - ngpsps=`awk -v ngps=$ngps -v dur=$dur ' - BEGIN { print ngps / dur }' < /dev/null` - title="$title ($ngpsps per second)" - fi - echo $title -fi diff --git a/rcutorture/bin/kvm-recheck.sh b/rcutorture/bin/kvm-recheck.sh deleted file mode 100755 index ee1f6ca..0000000 --- a/rcutorture/bin/kvm-recheck.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/bash -# -# Given the results directories for previous KVM-based torture runs, -# check the build and console output for errors. Given a directory -# containing results directories, this recursively checks them all. -# -# Usage: sh kvm-recheck.sh resdir ... -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, you can access it online at -# http://www.gnu.org/licenses/gpl-2.0.html. -# -# Copyright (C) IBM Corporation, 2011 -# -# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com> - -PATH=`pwd`/tools/testing/selftests/rcutorture/bin:$PATH; export PATH -. tools/testing/selftests/rcutorture/bin/functions.sh -for rd in "$@" -do - firsttime=1 - dirs=`find $rd -name Make.defconfig.out -print | sort | sed -e 's,/[^/]*$,,' | sort -u` - for i in $dirs - do - if test -n "$firsttime" - then - firsttime="" - resdir=`echo $i | sed -e 's,/$,,' -e 's,/[^/]*$,,'` - head -1 $resdir/log - fi - TORTURE_SUITE="`cat $i/../TORTURE_SUITE`" - kvm-recheck-${TORTURE_SUITE}.sh $i - if test -f "$i/console.log" - then - configcheck.sh $i/.config $i/ConfigFragment - parse-build.sh $i/Make.out $configfile - parse-torture.sh $i/console.log $configfile - parse-console.sh $i/console.log $configfile - if test -r $i/Warnings - then - cat $i/Warnings - fi - else - if test -f "$i/qemu-cmd" - then - print_bug qemu failed - else - print_bug Build failed - fi - echo " $i" - fi - done -done diff --git a/rcutorture/bin/kvm-test-1-run.sh b/rcutorture/bin/kvm-test-1-run.sh deleted file mode 100755 index 27e544e..0000000 --- a/rcutorture/bin/kvm-test-1-run.sh +++ /dev/null @@ -1,222 +0,0 @@ -#!/bin/bash -# -# Run a kvm-based test of the specified tree on the specified configs. -# Fully automated run and error checking, no graphics console. -# -# Execute this in the source tree. Do not run it as a background task -# because qemu does not seem to like that much. -# -# Usage: sh kvm-test-1-run.sh config builddir resdir minutes qemu-args boot_args -# -# qemu-args defaults to "-nographic", along with arguments specifying the -# number of CPUs and other options generated from -# the underlying CPU architecture. -# boot_args defaults to value returned by the per_version_boot_params -# shell function. -# -# Anything you specify for either qemu-args or boot_args is appended to -# the default values. The "-smp" value is deduced from the contents of -# the config fragment. -# -# More sophisticated argument parsing is clearly needed. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, you can access it online at -# http://www.gnu.org/licenses/gpl-2.0.html. -# -# Copyright (C) IBM Corporation, 2011 -# -# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com> - -grace=120 - -T=/tmp/kvm-test-1-run.sh.$$ -trap 'rm -rf $T' 0 - -. $KVM/bin/functions.sh -. $KVPATH/ver_functions.sh - -config_template=${1} -config_dir=`echo $config_template | sed -e 's,/[^/]*$,,'` -title=`echo $config_template | sed -e 's/^.*\///'` -builddir=${2} -if test -z "$builddir" -o ! -d "$builddir" -o ! -w "$builddir" -then - echo "kvm-test-1-run.sh :$builddir: Not a writable directory, cannot build into it" - exit 1 -fi -resdir=${3} -if test -z "$resdir" -o ! -d "$resdir" -o ! -w "$resdir" -then - echo "kvm-test-1-run.sh :$resdir: Not a writable directory, cannot store results into it" - exit 1 -fi -cp $config_template $resdir/ConfigFragment -echo ' ---' `date`: Starting build -echo ' ---' Kconfig fragment at: $config_template >> $resdir/log -if test -r "$config_dir/CFcommon" -then - cat < $config_dir/CFcommon >> $T -fi -# Optimizations below this point -# CONFIG_USB=n -# CONFIG_SECURITY=n -# CONFIG_NFS_FS=n -# CONFIG_SOUND=n -# CONFIG_INPUT_JOYSTICK=n -# CONFIG_INPUT_TABLET=n -# CONFIG_INPUT_TOUCHSCREEN=n -# CONFIG_INPUT_MISC=n -# CONFIG_INPUT_MOUSE=n -# # CONFIG_NET=n # disables console access, so accept the slower build. -# CONFIG_SCSI=n -# CONFIG_ATA=n -# CONFIG_FAT_FS=n -# CONFIG_MSDOS_FS=n -# CONFIG_VFAT_FS=n -# CONFIG_ISO9660_FS=n -# CONFIG_QUOTA=n -# CONFIG_HID=n -# CONFIG_CRYPTO=n -# CONFIG_PCCARD=n -# CONFIG_PCMCIA=n -# CONFIG_CARDBUS=n -# CONFIG_YENTA=n -if kvm-build.sh $config_template $builddir $T -then - QEMU="`identify_qemu $builddir/vmlinux`" - BOOT_IMAGE="`identify_boot_image $QEMU`" - cp $builddir/Make*.out $resdir - cp $builddir/.config $resdir - if test -n "$BOOT_IMAGE" - then - cp $builddir/$BOOT_IMAGE $resdir - else - echo No identifiable boot image, not running KVM, see $resdir. - echo Do the torture scripts know about your architecture? - fi - parse-build.sh $resdir/Make.out $title - if test -f $builddir.wait - then - mv $builddir.wait $builddir.ready - fi -else - cp $builddir/Make*.out $resdir - cp $builddir/.config $resdir || : - echo Build failed, not running KVM, see $resdir. - if test -f $builddir.wait - then - mv $builddir.wait $builddir.ready - fi - exit 1 -fi -while test -f $builddir.ready -do - sleep 1 -done -minutes=$4 -seconds=$(($minutes * 60)) -qemu_args=$5 -boot_args=$6 - -cd $KVM -kstarttime=`awk 'BEGIN { print systime() }' < /dev/null` -echo ' ---' `date`: Starting kernel - -# Generate -smp qemu argument. -qemu_args="-nographic $qemu_args" -cpu_count=`configNR_CPUS.sh $config_template` -vcpus=`identify_qemu_vcpus` -if test $cpu_count -gt $vcpus -then - echo CPU count limited from $cpu_count to $vcpus - touch $resdir/Warnings - echo CPU count limited from $cpu_count to $vcpus >> $resdir/Warnings - cpu_count=$vcpus -fi -qemu_args="`specify_qemu_cpus "$QEMU" "$qemu_args" "$cpu_count"`" - -# Generate architecture-specific and interaction-specific qemu arguments -qemu_args="$qemu_args `identify_qemu_args "$QEMU" "$builddir/console.log"`" - -# Generate qemu -append arguments -qemu_append="`identify_qemu_append "$QEMU"`" - -# Pull in Kconfig-fragment boot parameters -boot_args="`configfrag_boot_params "$boot_args" "$config_template"`" -# Generate kernel-version-specific boot parameters -boot_args="`per_version_boot_params "$boot_args" $builddir/.config $seconds`" - -echo $QEMU $qemu_args -m 512 -kernel $builddir/$BOOT_IMAGE -append \"$qemu_append $boot_args\" > $resdir/qemu-cmd -if test -n "$TORTURE_BUILDONLY" -then - echo Build-only run specified, boot/test omitted. - exit 0 -fi -( $QEMU $qemu_args -m 512 -kernel $builddir/$BOOT_IMAGE -append "$qemu_append $boot_args"; echo $? > $resdir/qemu-retval ) & -qemu_pid=$! -commandcompleted=0 -echo Monitoring qemu job at pid $qemu_pid -while : -do - kruntime=`awk 'BEGIN { print systime() - '"$kstarttime"' }' < /dev/null` - if kill -0 $qemu_pid > /dev/null 2>&1 - then - if test $kruntime -ge $seconds - then - break; - fi - sleep 1 - else - commandcompleted=1 - if test $kruntime -lt $seconds - then - echo Completed in $kruntime vs. $seconds >> $resdir/Warnings 2>&1 - grep "^(qemu) qemu:" $resdir/kvm-test-1-run.sh.out >> $resdir/Warnings 2>&1 - killpid="`sed -n "s/^(qemu) qemu: terminating on signal [0-9]* from pid \([0-9]*\).*$/\1/p" $resdir/Warnings`" - if test -n "$killpid" - then - echo "ps -fp $killpid" >> $resdir/Warnings 2>&1 - ps -fp $killpid >> $resdir/Warnings 2>&1 - fi - else - echo ' ---' `date`: Kernel done - fi - break - fi -done -if test $commandcompleted -eq 0 -then - echo Grace period for qemu job at pid $qemu_pid - while : - do - kruntime=`awk 'BEGIN { print systime() - '"$kstarttime"' }' < /dev/null` - if kill -0 $qemu_pid > /dev/null 2>&1 - then - : - else - break - fi - if test $kruntime -ge $((seconds + grace)) - then - echo "!!! Hang at $kruntime vs. $seconds seconds" >> $resdir/Warnings 2>&1 - kill -KILL $qemu_pid - break - fi - sleep 1 - done -fi - -cp $builddir/console.log $resdir -parse-torture.sh $resdir/console.log $title -parse-console.sh $resdir/console.log $title diff --git a/rcutorture/bin/kvm.sh b/rcutorture/bin/kvm.sh deleted file mode 100644 index 40285c5..0000000 --- a/rcutorture/bin/kvm.sh +++ /dev/null @@ -1,410 +0,0 @@ -#!/bin/bash -# -# Run a series of 14 tests under KVM. These are not particularly -# well-selected or well-tuned, but are the current set. Run from the -# top level of the source tree. -# -# Edit the definitions below to set the locations of the various directories, -# as well as the test duration. -# -# Usage: sh kvm.sh [ options ] -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, you can access it online at -# http://www.gnu.org/licenses/gpl-2.0.html. -# -# Copyright (C) IBM Corporation, 2011 -# -# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com> - -scriptname=$0 -args="$*" - -T=/tmp/kvm.sh.$$ -trap 'rm -rf $T' 0 -mkdir $T - -dur=30 -dryrun="" -KVM="`pwd`/tools/testing/selftests/rcutorture"; export KVM -PATH=${KVM}/bin:$PATH; export PATH -TORTURE_DEFCONFIG=defconfig -TORTURE_BOOT_IMAGE="" -TORTURE_INITRD="$KVM/initrd"; export TORTURE_INITRD -TORTURE_KMAKE_ARG="" -TORTURE_SUITE=rcu -resdir="" -configs="" -cpus=0 -ds=`date +%Y.%m.%d-%H:%M:%S` -kversion="" - -. functions.sh - -usage () { - echo "Usage: $scriptname optional arguments:" - echo " --bootargs kernel-boot-arguments" - echo " --bootimage relative-path-to-kernel-boot-image" - echo " --buildonly" - echo " --configs \"config-file list\"" - echo " --cpus N" - echo " --datestamp string" - echo " --defconfig string" - echo " --dryrun sched|script" - echo " --duration minutes" - echo " --interactive" - echo " --kmake-arg kernel-make-arguments" - echo " --kversion vN.NN" - echo " --mac nn:nn:nn:nn:nn:nn" - echo " --no-initrd" - echo " --qemu-args qemu-system-..." - echo " --qemu-cmd qemu-system-..." - echo " --results absolute-pathname" - echo " --torture rcu" - exit 1 -} - -while test $# -gt 0 -do - case "$1" in - --bootargs) - checkarg --bootargs "(list of kernel boot arguments)" "$#" "$2" '.*' '^--' - TORTURE_BOOTARGS="$2" - shift - ;; - --bootimage) - checkarg --bootimage "(relative path to kernel boot image)" "$#" "$2" '[a-zA-Z0-9][a-zA-Z0-9_]*' '^--' - TORTURE_BOOT_IMAGE="$2" - shift - ;; - --buildonly) - TORTURE_BUILDONLY=1 - ;; - --configs) - checkarg --configs "(list of config files)" "$#" "$2" '^[^/]*$' '^--' - configs="$2" - shift - ;; - --cpus) - checkarg --cpus "(number)" "$#" "$2" '^[0-9]*$' '^--' - cpus=$2 - shift - ;; - --datestamp) - checkarg --datestamp "(relative pathname)" "$#" "$2" '^[^/]*$' '^--' - ds=$2 - shift - ;; - --defconfig) - checkarg --defconfig "defconfigtype" "$#" "$2" '^[^/][^/]*$' '^--' - TORTURE_DEFCONFIG=$2 - shift - ;; - --dryrun) - checkarg --dryrun "sched|script" $# "$2" 'sched\|script' '^--' - dryrun=$2 - shift - ;; - --duration) - checkarg --duration "(minutes)" $# "$2" '^[0-9]*$' '^error' - dur=$2 - shift - ;; - --interactive) - TORTURE_QEMU_INTERACTIVE=1; export TORTURE_QEMU_INTERACTIVE - ;; - --kmake-arg) - checkarg --kmake-arg "(kernel make arguments)" $# "$2" '.*' '^error$' - TORTURE_KMAKE_ARG="$2" - shift - ;; - --kversion) - checkarg --kversion "(kernel version)" $# "$2" '^v[0-9.]*$' '^error' - kversion=$2 - shift - ;; - --mac) - checkarg --mac "(MAC address)" $# "$2" '^\([0-9a-fA-F]\{2\}:\)\{5\}[0-9a-fA-F]\{2\}$' error - TORTURE_QEMU_MAC=$2 - shift - ;; - --no-initrd) - TORTURE_INITRD=""; export TORTURE_INITRD - ;; - --qemu-args) - checkarg --qemu-args "-qemu args" $# "$2" '^-' '^error' - TORTURE_QEMU_ARG="$2" - shift - ;; - --qemu-cmd) - checkarg --qemu-cmd "(qemu-system-...)" $# "$2" 'qemu-system-' '^--' - TORTURE_QEMU_CMD="$2" - shift - ;; - --results) - checkarg --results "(absolute pathname)" "$#" "$2" '^/' '^error' - resdir=$2 - shift - ;; - --torture) - checkarg --torture "(suite name)" "$#" "$2" '^\(lock\|rcu\)$' '^--' - TORTURE_SUITE=$2 - shift - ;; - *) - echo Unknown argument $1 - usage - ;; - esac - shift -done - -CONFIGFRAG=${KVM}/configs/${TORTURE_SUITE}; export CONFIGFRAG -KVPATH=${CONFIGFRAG}/$kversion; export KVPATH - -if test -z "$configs" -then - configs="`cat $CONFIGFRAG/$kversion/CFLIST`" -fi - -if test -z "$resdir" -then - resdir=$KVM/res -fi - -# Create a file of test-name/#cpus pairs, sorted by decreasing #cpus. -touch $T/cfgcpu -for CF in $configs -do - if test -f "$CONFIGFRAG/$kversion/$CF" - then - echo $CF `configNR_CPUS.sh $CONFIGFRAG/$kversion/$CF` >> $T/cfgcpu - else - echo "The --configs file $CF does not exist, terminating." - exit 1 - fi -done -sort -k2nr $T/cfgcpu > $T/cfgcpu.sort - -# Use a greedy bin-packing algorithm, sorting the list accordingly. -awk < $T/cfgcpu.sort > $T/cfgcpu.pack -v ncpus=$cpus ' -BEGIN { - njobs = 0; -} - -{ - # Read file of tests and corresponding required numbers of CPUs. - cf[njobs] = $1; - cpus[njobs] = $2; - njobs++; -} - -END { - alldone = 0; - batch = 0; - nc = -1; - - # Each pass through the following loop creates on test batch - # that can be executed concurrently given ncpus. Note that a - # given test that requires more than the available CPUs will run in - # their own batch. Such tests just have to make do with what - # is available. - while (nc != ncpus) { - batch++; - nc = ncpus; - - # Each pass through the following loop considers one - # test for inclusion in the current batch. - for (i = 0; i < njobs; i++) { - if (done[i]) - continue; # Already part of a batch. - if (nc >= cpus[i] || nc == ncpus) { - - # This test fits into the current batch. - done[i] = batch; - nc -= cpus[i]; - if (nc <= 0) - break; # Too-big test in its own batch. - } - } - } - - # Dump out the tests in batch order. - for (b = 1; b <= batch; b++) - for (i = 0; i < njobs; i++) - if (done[i] == b) - print cf[i], cpus[i]; -}' - -# Generate a script to execute the tests in appropriate batches. -cat << ___EOF___ > $T/script -CONFIGFRAG="$CONFIGFRAG"; export CONFIGFRAG -KVM="$KVM"; export KVM -KVPATH="$KVPATH"; export KVPATH -PATH="$PATH"; export PATH -TORTURE_BOOT_IMAGE="$TORTURE_BOOT_IMAGE"; export TORTURE_BOOT_IMAGE -TORTURE_BUILDONLY="$TORTURE_BUILDONLY"; export TORTURE_BUILDONLY -TORTURE_DEFCONFIG="$TORTURE_DEFCONFIG"; export TORTURE_DEFCONFIG -TORTURE_INITRD="$TORTURE_INITRD"; export TORTURE_INITRD -TORTURE_KMAKE_ARG="$TORTURE_KMAKE_ARG"; export TORTURE_KMAKE_ARG -TORTURE_QEMU_CMD="$TORTURE_QEMU_CMD"; export TORTURE_QEMU_CMD -TORTURE_QEMU_INTERACTIVE="$TORTURE_QEMU_INTERACTIVE"; export TORTURE_QEMU_INTERACTIVE -TORTURE_QEMU_MAC="$TORTURE_QEMU_MAC"; export TORTURE_QEMU_MAC -TORTURE_SUITE="$TORTURE_SUITE"; export TORTURE_SUITE -if ! test -e $resdir -then - mkdir -p "$resdir" || : -fi -mkdir $resdir/$ds -echo Results directory: $resdir/$ds -echo $scriptname $args -touch $resdir/$ds/log -echo $scriptname $args >> $resdir/$ds/log -echo ${TORTURE_SUITE} > $resdir/$ds/TORTURE_SUITE -pwd > $resdir/$ds/testid.txt -if test -d .git -then - git status >> $resdir/$ds/testid.txt - git rev-parse HEAD >> $resdir/$ds/testid.txt - if ! git diff HEAD > $T/git-diff 2>&1 - then - cp $T/git-diff $resdir/$ds - fi -fi -___EOF___ -awk < $T/cfgcpu.pack \ - -v CONFIGDIR="$CONFIGFRAG/$kversion/" \ - -v KVM="$KVM" \ - -v ncpus=$cpus \ - -v rd=$resdir/$ds/ \ - -v dur=$dur \ - -v TORTURE_QEMU_ARG="$TORTURE_QEMU_ARG" \ - -v TORTURE_BOOTARGS="$TORTURE_BOOTARGS" \ -'BEGIN { - i = 0; -} - -{ - cf[i] = $1; - cpus[i] = $2; - i++; -} - -# Dump out the scripting required to run one test batch. -function dump(first, pastlast) -{ - print "echo ----Start batch: `date`"; - print "echo ----Start batch: `date` >> " rd "/log"; - jn=1 - for (j = first; j < pastlast; j++) { - builddir=KVM "/b" jn - cpusr[jn] = cpus[j]; - if (cfrep[cf[j]] == "") { - cfr[jn] = cf[j]; - cfrep[cf[j]] = 1; - } else { - cfrep[cf[j]]++; - cfr[jn] = cf[j] "." cfrep[cf[j]]; - } - if (cpusr[jn] > ncpus && ncpus != 0) - ovf = "(!)"; - else - ovf = ""; - print "echo ", cfr[jn], cpusr[jn] ovf ": Starting build. `date`"; - print "echo ", cfr[jn], cpusr[jn] ovf ": Starting build. `date` >> " rd "/log"; - print "rm -f " builddir ".*"; - print "touch " builddir ".wait"; - print "mkdir " builddir " > /dev/null 2>&1 || :"; - print "mkdir " rd cfr[jn] " || :"; - print "kvm-test-1-run.sh " CONFIGDIR cf[j], builddir, rd cfr[jn], dur " \"" TORTURE_QEMU_ARG "\" \"" TORTURE_BOOTARGS "\" > " rd cfr[jn] "/kvm-test-1-run.sh.out 2>&1 &" - print "echo ", cfr[jn], cpusr[jn] ovf ": Waiting for build to complete. `date`"; - print "echo ", cfr[jn], cpusr[jn] ovf ": Waiting for build to complete. `date` >> " rd "/log"; - print "while test -f " builddir ".wait" - print "do" - print "\tsleep 1" - print "done" - print "echo ", cfr[jn], cpusr[jn] ovf ": Build complete. `date`"; - print "echo ", cfr[jn], cpusr[jn] ovf ": Build complete. `date` >> " rd "/log"; - jn++; - } - for (j = 1; j < jn; j++) { - builddir=KVM "/b" j - print "rm -f " builddir ".ready" - print "echo ----", cfr[j], cpusr[j] ovf ": Starting kernel. `date`"; - print "echo ----", cfr[j], cpusr[j] ovf ": Starting kernel. `date` >> " rd "/log"; - } - print "wait" - print "echo ---- All kernel runs complete. `date`"; - print "echo ---- All kernel runs complete. `date` >> " rd "/log"; - for (j = 1; j < jn; j++) { - builddir=KVM "/b" j - print "echo ----", cfr[j], cpusr[j] ovf ": Build/run results:"; - print "echo ----", cfr[j], cpusr[j] ovf ": Build/run results: >> " rd "/log"; - print "cat " rd cfr[j] "/kvm-test-1-run.sh.out"; - print "cat " rd cfr[j] "/kvm-test-1-run.sh.out >> " rd "/log"; - } -} - -END { - njobs = i; - nc = ncpus; - first = 0; - - # Each pass through the following loop considers one test. - for (i = 0; i < njobs; i++) { - if (ncpus == 0) { - # Sequential test specified, each test its own batch. - dump(i, i + 1); - first = i; - } else if (nc < cpus[i] && i != 0) { - # Out of CPUs, dump out a batch. - dump(first, i); - first = i; - nc = ncpus; - } - # Account for the CPUs needed by the current test. - nc -= cpus[i]; - } - # Dump the last batch. - if (ncpus != 0) - dump(first, i); -}' >> $T/script - -cat << ___EOF___ >> $T/script -echo -echo -echo " --- `date` Test summary:" -echo Results directory: $resdir/$ds -if test -z "$TORTURE_BUILDONLY" -then - kvm-recheck.sh $resdir/$ds -fi -___EOF___ - -if test "$dryrun" = script -then - cat $T/script - exit 0 -elif test "$dryrun" = sched -then - # Extract the test run schedule from the script. - egrep 'Start batch|Starting build\.' $T/script | - grep -v ">>" | - sed -e 's/:.*$//' -e 's/^echo //' - exit 0 -else - # Not a dryru, so run the script. - sh $T/script -fi - -# Tracing: trace_event=rcu:rcu_grace_period,rcu:rcu_future_grace_period,rcu:rcu_grace_period_init,rcu:rcu_nocb_wake,rcu:rcu_preempt_task,rcu:rcu_unlock_preempted_task,rcu:rcu_quiescent_state_report,rcu:rcu_fqs,rcu:rcu_callback,rcu:rcu_kfree_callback,rcu:rcu_batch_start,rcu:rcu_invoke_callback,rcu:rcu_invoke_kfree_callback,rcu:rcu_batch_end,rcu:rcu_torture_read,rcu:rcu_barrier diff --git a/rcutorture/bin/parse-build.sh b/rcutorture/bin/parse-build.sh deleted file mode 100755 index 5432309..0000000 --- a/rcutorture/bin/parse-build.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/sh -# -# Check the build output from an rcutorture run for goodness. -# The "file" is a pathname on the local system, and "title" is -# a text string for error-message purposes. -# -# The file must contain kernel build output. -# -# Usage: -# sh parse-build.sh file title -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, you can access it online at -# http://www.gnu.org/licenses/gpl-2.0.html. -# -# Copyright (C) IBM Corporation, 2011 -# -# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com> - -T=$1 -title=$2 - -. functions.sh - -if grep -q CC < $T -then - : -else - print_bug $title no build - exit 1 -fi - -if grep -q "error:" < $T -then - print_bug $title build errors: - grep "error:" < $T - exit 2 -fi -exit 0 - -if egrep -q "rcu[^/]*\.c.*warning:|rcu.*\.h.*warning:" < $T -then - print_warning $title build errors: - egrep "rcu[^/]*\.c.*warning:|rcu.*\.h.*warning:" < $T - exit 2 -fi -exit 0 diff --git a/rcutorture/bin/parse-console.sh b/rcutorture/bin/parse-console.sh deleted file mode 100755 index 4185d4c..0000000 --- a/rcutorture/bin/parse-console.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/sh -# -# Check the console output from an rcutorture run for oopses. -# The "file" is a pathname on the local system, and "title" is -# a text string for error-message purposes. -# -# Usage: -# sh parse-console.sh file title -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, you can access it online at -# http://www.gnu.org/licenses/gpl-2.0.html. -# -# Copyright (C) IBM Corporation, 2011 -# -# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com> - -T=/tmp/abat-chk-badness.sh.$$ -trap 'rm -f $T' 0 - -file="$1" -title="$2" - -. functions.sh - -egrep 'Badness|WARNING:|Warn|BUG|===========|Call Trace:|Oops:' < $file | grep -v 'ODEBUG: ' | grep -v 'Warning: unable to open an initial console' > $T -if test -s $T -then - print_warning Assertion failure in $file $title - cat $T -fi diff --git a/rcutorture/bin/parse-torture.sh b/rcutorture/bin/parse-torture.sh deleted file mode 100755 index 3455560..0000000 --- a/rcutorture/bin/parse-torture.sh +++ /dev/null @@ -1,106 +0,0 @@ -#!/bin/sh -# -# Check the console output from a torture run for goodness. -# The "file" is a pathname on the local system, and "title" is -# a text string for error-message purposes. -# -# The file must contain torture output, but can be interspersed -# with other dmesg text, as in console-log output. -# -# Usage: -# sh parse-torture.sh file title -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, you can access it online at -# http://www.gnu.org/licenses/gpl-2.0.html. -# -# Copyright (C) IBM Corporation, 2011 -# -# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com> - -T=/tmp/parse-torture.sh.$$ -file="$1" -title="$2" - -trap 'rm -f $T.seq' 0 - -. functions.sh - -# check for presence of torture output file. - -if test -f "$file" -a -r "$file" -then - : -else - echo $title unreadable torture output file: $file - exit 1 -fi - -# check for abject failure - -if grep -q FAILURE $file || grep -q -e '-torture.*!!!' $file -then - nerrs=`grep --binary-files=text '!!!' $file | tail -1 | awk '{for (i=NF-8;i<=NF;i++) sum+=$i; } END {print sum}'` - print_bug $title FAILURE, $nerrs instances - echo " " $url - exit -fi - -grep --binary-files=text 'torture:.*ver:' $file | grep --binary-files=text -v '(null)' | sed -e 's/^(initramfs)[^]]*] //' -e 's/^\[[^]]*] //' | -awk ' -BEGIN { - ver = 0; - badseq = 0; - } - - { - if (!badseq && ($5 + 0 != $5 || $5 <= ver)) { - badseqno1 = ver; - badseqno2 = $5; - badseqnr = NR; - badseq = 1; - } - ver = $5 - } - -END { - if (badseq) { - if (badseqno1 == badseqno2 && badseqno2 == ver) - print "GP HANG at " ver " torture stat " badseqnr; - else - print "BAD SEQ " badseqno1 ":" badseqno2 " last:" ver " version " badseqnr; - } - }' > $T.seq - -if grep -q SUCCESS $file -then - if test -s $T.seq - then - print_warning $title $title `cat $T.seq` - echo " " $file - exit 2 - fi -else - if grep -q "_HOTPLUG:" $file - then - print_warning HOTPLUG FAILURES $title `cat $T.seq` - echo " " $file - exit 3 - fi - echo $title no success message, `grep --binary-files=text 'ver:' $file | wc -l` successful version messages - if test -s $T.seq - then - print_warning $title `cat $T.seq` - fi - exit 2 -fi diff --git a/rcutorture/configs/lock/BUSTED b/rcutorture/configs/lock/BUSTED deleted file mode 100644 index 1d1da14..0000000 --- a/rcutorture/configs/lock/BUSTED +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG_SMP=y -CONFIG_NR_CPUS=4 -CONFIG_HOTPLUG_CPU=y -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y diff --git a/rcutorture/configs/lock/BUSTED.boot b/rcutorture/configs/lock/BUSTED.boot deleted file mode 100644 index 6386c15..0000000 --- a/rcutorture/configs/lock/BUSTED.boot +++ /dev/null @@ -1 +0,0 @@ -locktorture.torture_type=lock_busted diff --git a/rcutorture/configs/lock/CFLIST b/rcutorture/configs/lock/CFLIST deleted file mode 100644 index a061b22..0000000 --- a/rcutorture/configs/lock/CFLIST +++ /dev/null @@ -1 +0,0 @@ -LOCK01 diff --git a/rcutorture/configs/lock/CFcommon b/rcutorture/configs/lock/CFcommon deleted file mode 100644 index e372dc2..0000000 --- a/rcutorture/configs/lock/CFcommon +++ /dev/null @@ -1,2 +0,0 @@ -CONFIG_LOCK_TORTURE_TEST=y -CONFIG_PRINTK_TIME=y diff --git a/rcutorture/configs/lock/LOCK01 b/rcutorture/configs/lock/LOCK01 deleted file mode 100644 index a9625e3..0000000 --- a/rcutorture/configs/lock/LOCK01 +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG_SMP=y -CONFIG_NR_CPUS=8 -CONFIG_HOTPLUG_CPU=y -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y diff --git a/rcutorture/configs/lock/ver_functions.sh b/rcutorture/configs/lock/ver_functions.sh deleted file mode 100644 index 9746ea1..0000000 --- a/rcutorture/configs/lock/ver_functions.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash -# -# Kernel-version-dependent shell functions for the rest of the scripts. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, you can access it online at -# http://www.gnu.org/licenses/gpl-2.0.html. -# -# Copyright (C) IBM Corporation, 2014 -# -# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com> - -# locktorture_param_onoff bootparam-string config-file -# -# Adds onoff locktorture module parameters to kernels having it. -locktorture_param_onoff () { - if ! bootparam_hotplug_cpu "$1" && configfrag_hotplug_cpu "$2" - then - echo CPU-hotplug kernel, adding locktorture onoff. 1>&2 - echo locktorture.onoff_interval=3 locktorture.onoff_holdoff=30 - fi -} - -# per_version_boot_params bootparam-string config-file seconds -# -# Adds per-version torture-module parameters to kernels supporting them. -per_version_boot_params () { - echo $1 `locktorture_param_onoff "$1" "$2"` \ - locktorture.stat_interval=15 \ - locktorture.shutdown_secs=$3 \ - locktorture.locktorture_runnable=1 \ - locktorture.verbose=1 -} diff --git a/rcutorture/configs/rcu/BUSTED b/rcutorture/configs/rcu/BUSTED deleted file mode 100644 index 48d8a24..0000000 --- a/rcutorture/configs/rcu/BUSTED +++ /dev/null @@ -1,7 +0,0 @@ -CONFIG_RCU_TRACE=n -CONFIG_SMP=y -CONFIG_NR_CPUS=4 -CONFIG_HOTPLUG_CPU=y -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y diff --git a/rcutorture/configs/rcu/BUSTED.boot b/rcutorture/configs/rcu/BUSTED.boot deleted file mode 100644 index 6804f9d..0000000 --- a/rcutorture/configs/rcu/BUSTED.boot +++ /dev/null @@ -1 +0,0 @@ -rcutorture.torture_type=rcu_busted diff --git a/rcutorture/configs/rcu/CFLIST b/rcutorture/configs/rcu/CFLIST deleted file mode 100644 index cd3d29c..0000000 --- a/rcutorture/configs/rcu/CFLIST +++ /dev/null @@ -1,13 +0,0 @@ -TREE01 -TREE02 -TREE03 -TREE04 -TREE05 -TREE06 -TREE07 -TREE08 -TREE09 -SRCU-N -SRCU-P -TINY01 -TINY02 diff --git a/rcutorture/configs/rcu/CFcommon b/rcutorture/configs/rcu/CFcommon deleted file mode 100644 index d2d2a86..0000000 --- a/rcutorture/configs/rcu/CFcommon +++ /dev/null @@ -1,2 +0,0 @@ -CONFIG_RCU_TORTURE_TEST=y -CONFIG_PRINTK_TIME=y diff --git a/rcutorture/configs/rcu/SRCU-N b/rcutorture/configs/rcu/SRCU-N deleted file mode 100644 index 9fbb41b..0000000 --- a/rcutorture/configs/rcu/SRCU-N +++ /dev/null @@ -1,7 +0,0 @@ -CONFIG_RCU_TRACE=n -CONFIG_SMP=y -CONFIG_NR_CPUS=4 -CONFIG_HOTPLUG_CPU=y -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n diff --git a/rcutorture/configs/rcu/SRCU-N.boot b/rcutorture/configs/rcu/SRCU-N.boot deleted file mode 100644 index 238bfe3..0000000 --- a/rcutorture/configs/rcu/SRCU-N.boot +++ /dev/null @@ -1 +0,0 @@ -rcutorture.torture_type=srcu diff --git a/rcutorture/configs/rcu/SRCU-P b/rcutorture/configs/rcu/SRCU-P deleted file mode 100644 index 4b6f272..0000000 --- a/rcutorture/configs/rcu/SRCU-P +++ /dev/null @@ -1,7 +0,0 @@ -CONFIG_RCU_TRACE=n -CONFIG_SMP=y -CONFIG_NR_CPUS=8 -CONFIG_HOTPLUG_CPU=y -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y diff --git a/rcutorture/configs/rcu/SRCU-P.boot b/rcutorture/configs/rcu/SRCU-P.boot deleted file mode 100644 index 238bfe3..0000000 --- a/rcutorture/configs/rcu/SRCU-P.boot +++ /dev/null @@ -1 +0,0 @@ -rcutorture.torture_type=srcu diff --git a/rcutorture/configs/rcu/TINY01 b/rcutorture/configs/rcu/TINY01 deleted file mode 100644 index 0a63e07..0000000 --- a/rcutorture/configs/rcu/TINY01 +++ /dev/null @@ -1,12 +0,0 @@ -CONFIG_SMP=n -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TINY_RCU=y -CONFIG_HZ_PERIODIC=n -CONFIG_NO_HZ_IDLE=y -CONFIG_NO_HZ_FULL=n -CONFIG_RCU_TRACE=n -CONFIG_DEBUG_LOCK_ALLOC=n -CONFIG_DEBUG_OBJECTS_RCU_HEAD=n -CONFIG_PREEMPT_COUNT=n diff --git a/rcutorture/configs/rcu/TINY02 b/rcutorture/configs/rcu/TINY02 deleted file mode 100644 index f4feaee..0000000 --- a/rcutorture/configs/rcu/TINY02 +++ /dev/null @@ -1,12 +0,0 @@ -CONFIG_SMP=n -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TINY_RCU=y -CONFIG_HZ_PERIODIC=y -CONFIG_NO_HZ_IDLE=n -CONFIG_NO_HZ_FULL=n -CONFIG_RCU_TRACE=y -CONFIG_DEBUG_LOCK_ALLOC=y -CONFIG_DEBUG_OBJECTS_RCU_HEAD=n -CONFIG_PREEMPT_COUNT=y diff --git a/rcutorture/configs/rcu/TREE01 b/rcutorture/configs/rcu/TREE01 deleted file mode 100644 index 9c827ec..0000000 --- a/rcutorture/configs/rcu/TREE01 +++ /dev/null @@ -1,22 +0,0 @@ -CONFIG_SMP=y -CONFIG_NR_CPUS=8 -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_HZ_PERIODIC=n -CONFIG_NO_HZ_IDLE=y -CONFIG_NO_HZ_FULL=n -CONFIG_RCU_FAST_NO_HZ=y -CONFIG_RCU_TRACE=y -CONFIG_HOTPLUG_CPU=y -CONFIG_RCU_FANOUT=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_RCU_NOCB_CPU=y -CONFIG_RCU_NOCB_CPU_ZERO=y -CONFIG_DEBUG_LOCK_ALLOC=n -CONFIG_PROVE_RCU_DELAY=n -CONFIG_RCU_CPU_STALL_INFO=n -CONFIG_RCU_CPU_STALL_VERBOSE=n -CONFIG_RCU_BOOST=n -CONFIG_DEBUG_OBJECTS_RCU_HEAD=n diff --git a/rcutorture/configs/rcu/TREE01.boot b/rcutorture/configs/rcu/TREE01.boot deleted file mode 100644 index 0fc8a34..0000000 --- a/rcutorture/configs/rcu/TREE01.boot +++ /dev/null @@ -1 +0,0 @@ -rcutorture.torture_type=rcu_bh diff --git a/rcutorture/configs/rcu/TREE02 b/rcutorture/configs/rcu/TREE02 deleted file mode 100644 index 1a777b5..0000000 --- a/rcutorture/configs/rcu/TREE02 +++ /dev/null @@ -1,25 +0,0 @@ -CONFIG_SMP=y -CONFIG_NR_CPUS=8 -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_HZ_PERIODIC=n -CONFIG_NO_HZ_IDLE=y -CONFIG_NO_HZ_FULL=n -CONFIG_RCU_FAST_NO_HZ=n -CONFIG_RCU_TRACE=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_RCU_FANOUT=3 -CONFIG_RCU_FANOUT_LEAF=3 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_RCU_NOCB_CPU=n -CONFIG_DEBUG_LOCK_ALLOC=y -CONFIG_PROVE_LOCKING=n -CONFIG_PROVE_RCU_DELAY=n -CONFIG_RCU_CPU_STALL_INFO=n -CONFIG_RCU_CPU_STALL_VERBOSE=y -CONFIG_RCU_BOOST=n -CONFIG_DEBUG_OBJECTS_RCU_HEAD=n diff --git a/rcutorture/configs/rcu/TREE02-T b/rcutorture/configs/rcu/TREE02-T deleted file mode 100644 index 61c8d9c..0000000 --- a/rcutorture/configs/rcu/TREE02-T +++ /dev/null @@ -1,25 +0,0 @@ -CONFIG_SMP=y -CONFIG_NR_CPUS=8 -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_HZ_PERIODIC=n -CONFIG_NO_HZ_IDLE=y -CONFIG_NO_HZ_FULL=n -CONFIG_RCU_FAST_NO_HZ=n -CONFIG_RCU_TRACE=y -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_RCU_FANOUT=3 -CONFIG_RCU_FANOUT_LEAF=3 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_RCU_NOCB_CPU=n -CONFIG_DEBUG_LOCK_ALLOC=y -CONFIG_PROVE_LOCKING=n -CONFIG_PROVE_RCU_DELAY=n -CONFIG_RCU_CPU_STALL_INFO=n -CONFIG_RCU_CPU_STALL_VERBOSE=y -CONFIG_RCU_BOOST=n -CONFIG_DEBUG_OBJECTS_RCU_HEAD=n diff --git a/rcutorture/configs/rcu/TREE03 b/rcutorture/configs/rcu/TREE03 deleted file mode 100644 index c1f111c..0000000 --- a/rcutorture/configs/rcu/TREE03 +++ /dev/null @@ -1,22 +0,0 @@ -CONFIG_SMP=y -CONFIG_NR_CPUS=8 -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_HZ_PERIODIC=y -CONFIG_NO_HZ_IDLE=n -CONFIG_NO_HZ_FULL=n -CONFIG_RCU_TRACE=y -CONFIG_HOTPLUG_CPU=y -CONFIG_RCU_FANOUT=4 -CONFIG_RCU_FANOUT_LEAF=4 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_RCU_NOCB_CPU=n -CONFIG_DEBUG_LOCK_ALLOC=n -CONFIG_PROVE_RCU_DELAY=n -CONFIG_RCU_CPU_STALL_INFO=n -CONFIG_RCU_CPU_STALL_VERBOSE=n -CONFIG_RCU_BOOST=y -CONFIG_RCU_BOOST_PRIO=2 -CONFIG_DEBUG_OBJECTS_RCU_HEAD=n diff --git a/rcutorture/configs/rcu/TREE04 b/rcutorture/configs/rcu/TREE04 deleted file mode 100644 index 7dbd27c..0000000 --- a/rcutorture/configs/rcu/TREE04 +++ /dev/null @@ -1,24 +0,0 @@ -CONFIG_SMP=y -CONFIG_NR_CPUS=8 -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_HZ_PERIODIC=n -CONFIG_NO_HZ_IDLE=n -CONFIG_NO_HZ_FULL=y -CONFIG_NO_HZ_FULL_ALL=y -CONFIG_RCU_FAST_NO_HZ=y -CONFIG_RCU_TRACE=y -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_RCU_FANOUT=2 -CONFIG_RCU_FANOUT_LEAF=2 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_RCU_NOCB_CPU=n -CONFIG_DEBUG_LOCK_ALLOC=n -CONFIG_PROVE_RCU_DELAY=n -CONFIG_RCU_CPU_STALL_INFO=y -CONFIG_RCU_CPU_STALL_VERBOSE=y -CONFIG_DEBUG_OBJECTS_RCU_HEAD=n diff --git a/rcutorture/configs/rcu/TREE04.boot b/rcutorture/configs/rcu/TREE04.boot deleted file mode 100644 index 0fc8a34..0000000 --- a/rcutorture/configs/rcu/TREE04.boot +++ /dev/null @@ -1 +0,0 @@ -rcutorture.torture_type=rcu_bh diff --git a/rcutorture/configs/rcu/TREE05 b/rcutorture/configs/rcu/TREE05 deleted file mode 100644 index d0f32e5..0000000 --- a/rcutorture/configs/rcu/TREE05 +++ /dev/null @@ -1,24 +0,0 @@ -CONFIG_SMP=y -CONFIG_NR_CPUS=8 -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_HZ_PERIODIC=n -CONFIG_NO_HZ_IDLE=y -CONFIG_NO_HZ_FULL=n -CONFIG_RCU_FAST_NO_HZ=n -CONFIG_RCU_TRACE=n -CONFIG_HOTPLUG_CPU=y -CONFIG_RCU_FANOUT=6 -CONFIG_RCU_FANOUT_LEAF=6 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_RCU_NOCB_CPU=y -CONFIG_RCU_NOCB_CPU_NONE=y -CONFIG_DEBUG_LOCK_ALLOC=y -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_PROVE_RCU_DELAY=y -CONFIG_RCU_CPU_STALL_INFO=n -CONFIG_RCU_CPU_STALL_VERBOSE=n -CONFIG_DEBUG_OBJECTS_RCU_HEAD=n diff --git a/rcutorture/configs/rcu/TREE05.boot b/rcutorture/configs/rcu/TREE05.boot deleted file mode 100644 index 3b42b8b..0000000 --- a/rcutorture/configs/rcu/TREE05.boot +++ /dev/null @@ -1 +0,0 @@ -rcutorture.torture_type=sched diff --git a/rcutorture/configs/rcu/TREE06 b/rcutorture/configs/rcu/TREE06 deleted file mode 100644 index 2e477df..0000000 --- a/rcutorture/configs/rcu/TREE06 +++ /dev/null @@ -1,25 +0,0 @@ -CONFIG_SMP=y -CONFIG_NR_CPUS=8 -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_HZ_PERIODIC=n -CONFIG_NO_HZ_IDLE=y -CONFIG_NO_HZ_FULL=n -CONFIG_RCU_FAST_NO_HZ=n -CONFIG_RCU_TRACE=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_RCU_FANOUT=6 -CONFIG_RCU_FANOUT_LEAF=6 -CONFIG_RCU_FANOUT_EXACT=y -CONFIG_RCU_NOCB_CPU=n -CONFIG_DEBUG_LOCK_ALLOC=y -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_PROVE_RCU_DELAY=n -CONFIG_RCU_CPU_STALL_INFO=n -CONFIG_RCU_CPU_STALL_VERBOSE=n -CONFIG_DEBUG_OBJECTS_RCU_HEAD=y diff --git a/rcutorture/configs/rcu/TREE07 b/rcutorture/configs/rcu/TREE07 deleted file mode 100644 index 042f86e..0000000 --- a/rcutorture/configs/rcu/TREE07 +++ /dev/null @@ -1,23 +0,0 @@ -CONFIG_SMP=y -CONFIG_NR_CPUS=16 -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_HZ_PERIODIC=n -CONFIG_NO_HZ_IDLE=n -CONFIG_NO_HZ_FULL=y -CONFIG_NO_HZ_FULL_ALL=y -CONFIG_NO_HZ_FULL_SYSIDLE=y -CONFIG_RCU_FAST_NO_HZ=n -CONFIG_RCU_TRACE=y -CONFIG_HOTPLUG_CPU=y -CONFIG_RCU_FANOUT=2 -CONFIG_RCU_FANOUT_LEAF=2 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_RCU_NOCB_CPU=n -CONFIG_DEBUG_LOCK_ALLOC=n -CONFIG_PROVE_RCU_DELAY=n -CONFIG_RCU_CPU_STALL_INFO=y -CONFIG_RCU_CPU_STALL_VERBOSE=n -CONFIG_DEBUG_OBJECTS_RCU_HEAD=n diff --git a/rcutorture/configs/rcu/TREE08 b/rcutorture/configs/rcu/TREE08 deleted file mode 100644 index 3438cee..0000000 --- a/rcutorture/configs/rcu/TREE08 +++ /dev/null @@ -1,25 +0,0 @@ -CONFIG_SMP=y -CONFIG_NR_CPUS=16 -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_HZ_PERIODIC=n -CONFIG_NO_HZ_IDLE=y -CONFIG_NO_HZ_FULL=n -CONFIG_RCU_FAST_NO_HZ=n -CONFIG_RCU_TRACE=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_RCU_FANOUT=3 -CONFIG_RCU_FANOUT_EXACT=y -CONFIG_RCU_FANOUT_LEAF=2 -CONFIG_RCU_NOCB_CPU=y -CONFIG_RCU_NOCB_CPU_ALL=y -CONFIG_DEBUG_LOCK_ALLOC=n -CONFIG_PROVE_RCU_DELAY=n -CONFIG_RCU_CPU_STALL_INFO=n -CONFIG_RCU_CPU_STALL_VERBOSE=n -CONFIG_RCU_BOOST=n -CONFIG_DEBUG_OBJECTS_RCU_HEAD=n diff --git a/rcutorture/configs/rcu/TREE08-T b/rcutorture/configs/rcu/TREE08-T deleted file mode 100644 index bf4523d..0000000 --- a/rcutorture/configs/rcu/TREE08-T +++ /dev/null @@ -1,25 +0,0 @@ -CONFIG_SMP=y -CONFIG_NR_CPUS=16 -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_HZ_PERIODIC=n -CONFIG_NO_HZ_IDLE=y -CONFIG_NO_HZ_FULL=n -CONFIG_RCU_FAST_NO_HZ=n -CONFIG_RCU_TRACE=y -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_RCU_FANOUT=3 -CONFIG_RCU_FANOUT_EXACT=y -CONFIG_RCU_FANOUT_LEAF=2 -CONFIG_RCU_NOCB_CPU=y -CONFIG_RCU_NOCB_CPU_ALL=y -CONFIG_DEBUG_LOCK_ALLOC=n -CONFIG_PROVE_RCU_DELAY=n -CONFIG_RCU_CPU_STALL_INFO=n -CONFIG_RCU_CPU_STALL_VERBOSE=n -CONFIG_RCU_BOOST=n -CONFIG_DEBUG_OBJECTS_RCU_HEAD=n diff --git a/rcutorture/configs/rcu/TREE08.boot b/rcutorture/configs/rcu/TREE08.boot deleted file mode 100644 index 3b42b8b..0000000 --- a/rcutorture/configs/rcu/TREE08.boot +++ /dev/null @@ -1 +0,0 @@ -rcutorture.torture_type=sched diff --git a/rcutorture/configs/rcu/TREE09 b/rcutorture/configs/rcu/TREE09 deleted file mode 100644 index 81e4f7c..0000000 --- a/rcutorture/configs/rcu/TREE09 +++ /dev/null @@ -1,20 +0,0 @@ -CONFIG_SMP=n -CONFIG_NR_CPUS=1 -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_HZ_PERIODIC=n -CONFIG_NO_HZ_IDLE=y -CONFIG_NO_HZ_FULL=n -CONFIG_RCU_TRACE=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_RCU_NOCB_CPU=n -CONFIG_DEBUG_LOCK_ALLOC=n -CONFIG_PROVE_RCU_DELAY=n -CONFIG_RCU_CPU_STALL_INFO=n -CONFIG_RCU_CPU_STALL_VERBOSE=n -CONFIG_RCU_BOOST=n -CONFIG_DEBUG_OBJECTS_RCU_HEAD=n diff --git a/rcutorture/configs/rcu/v0.0/CFLIST b/rcutorture/configs/rcu/v0.0/CFLIST deleted file mode 100644 index 1822394..0000000 --- a/rcutorture/configs/rcu/v0.0/CFLIST +++ /dev/null @@ -1,14 +0,0 @@ -P1-S-T-NH-SD-SMP-HP -P2-2-t-nh-sd-SMP-hp -P3-3-T-nh-SD-SMP-hp -P4-A-t-NH-sd-SMP-HP -P5-U-T-NH-sd-SMP-hp -N1-S-T-NH-SD-SMP-HP -N2-2-t-nh-sd-SMP-hp -N3-3-T-nh-SD-SMP-hp -N4-A-t-NH-sd-SMP-HP -N5-U-T-NH-sd-SMP-hp -PT1-nh -PT2-NH -NT1-nh -NT3-NH diff --git a/rcutorture/configs/rcu/v0.0/N1-S-T-NH-SD-SMP-HP b/rcutorture/configs/rcu/v0.0/N1-S-T-NH-SD-SMP-HP deleted file mode 100644 index d3ef873..0000000 --- a/rcutorture/configs/rcu/v0.0/N1-S-T-NH-SD-SMP-HP +++ /dev/null @@ -1,18 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=8 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=y -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v0.0/N2-2-t-nh-sd-SMP-hp b/rcutorture/configs/rcu/v0.0/N2-2-t-nh-sd-SMP-hp deleted file mode 100644 index 02e4185..0000000 --- a/rcutorture/configs/rcu/v0.0/N2-2-t-nh-sd-SMP-hp +++ /dev/null @@ -1,20 +0,0 @@ -CONFIG_RCU_TRACE=n -CONFIG_NO_HZ=n -CONFIG_SMP=y -CONFIG_RCU_FANOUT=4 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v0.0/N3-3-T-nh-SD-SMP-hp b/rcutorture/configs/rcu/v0.0/N3-3-T-nh-SD-SMP-hp deleted file mode 100644 index b3100f6..0000000 --- a/rcutorture/configs/rcu/v0.0/N3-3-T-nh-SD-SMP-hp +++ /dev/null @@ -1,22 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_NO_HZ=n -CONFIG_SMP=y -CONFIG_RCU_FANOUT=2 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v0.0/N4-A-t-NH-sd-SMP-HP b/rcutorture/configs/rcu/v0.0/N4-A-t-NH-sd-SMP-HP deleted file mode 100644 index c56b445..0000000 --- a/rcutorture/configs/rcu/v0.0/N4-A-t-NH-sd-SMP-HP +++ /dev/null @@ -1,18 +0,0 @@ -CONFIG_RCU_TRACE=n -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=6 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=y -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v0.0/N5-U-T-NH-sd-SMP-hp b/rcutorture/configs/rcu/v0.0/N5-U-T-NH-sd-SMP-hp deleted file mode 100644 index 90d924f..0000000 --- a/rcutorture/configs/rcu/v0.0/N5-U-T-NH-sd-SMP-hp +++ /dev/null @@ -1,22 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_DEBUG_KERNEL=y -CONFIG_RCU_CPU_STALL_INFO=y -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=6 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=y -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v0.0/NT1-nh b/rcutorture/configs/rcu/v0.0/NT1-nh deleted file mode 100644 index 023f312..0000000 --- a/rcutorture/configs/rcu/v0.0/NT1-nh +++ /dev/null @@ -1,23 +0,0 @@ -#CHECK#CONFIG_TINY_RCU=y -CONFIG_RCU_TRACE=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -# -CONFIG_SMP=n -# -CONFIG_HOTPLUG_CPU=n -# -CONFIG_NO_HZ=n -# -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v0.0/NT3-NH b/rcutorture/configs/rcu/v0.0/NT3-NH deleted file mode 100644 index 6fd0235..0000000 --- a/rcutorture/configs/rcu/v0.0/NT3-NH +++ /dev/null @@ -1,20 +0,0 @@ -#CHECK#CONFIG_TINY_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -# -CONFIG_SMP=n -# -CONFIG_HOTPLUG_CPU=n -# -CONFIG_NO_HZ=y -# -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v0.0/P1-S-T-NH-SD-SMP-HP b/rcutorture/configs/rcu/v0.0/P1-S-T-NH-SD-SMP-HP deleted file mode 100644 index f72402d..0000000 --- a/rcutorture/configs/rcu/v0.0/P1-S-T-NH-SD-SMP-HP +++ /dev/null @@ -1,19 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_RCU_CPU_STALL_INFO=y -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=8 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=y -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v0.0/P2-2-t-nh-sd-SMP-hp b/rcutorture/configs/rcu/v0.0/P2-2-t-nh-sd-SMP-hp deleted file mode 100644 index 0f3b667..0000000 --- a/rcutorture/configs/rcu/v0.0/P2-2-t-nh-sd-SMP-hp +++ /dev/null @@ -1,20 +0,0 @@ -CONFIG_RCU_TRACE=n -CONFIG_NO_HZ=n -CONFIG_SMP=y -CONFIG_RCU_FANOUT=4 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v0.0/P3-3-T-nh-SD-SMP-hp b/rcutorture/configs/rcu/v0.0/P3-3-T-nh-SD-SMP-hp deleted file mode 100644 index b035e14..0000000 --- a/rcutorture/configs/rcu/v0.0/P3-3-T-nh-SD-SMP-hp +++ /dev/null @@ -1,20 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_NO_HZ=n -CONFIG_SMP=y -CONFIG_RCU_FANOUT=2 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v0.0/P4-A-t-NH-sd-SMP-HP b/rcutorture/configs/rcu/v0.0/P4-A-t-NH-sd-SMP-HP deleted file mode 100644 index 3ccf6a9..0000000 --- a/rcutorture/configs/rcu/v0.0/P4-A-t-NH-sd-SMP-HP +++ /dev/null @@ -1,22 +0,0 @@ -CONFIG_RCU_TRACE=n -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=6 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=y -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_RT_MUTEXES=y -CONFIG_RCU_BOOST=y -CONFIG_RCU_BOOST_PRIO=2 -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v0.0/P5-U-T-NH-sd-SMP-hp b/rcutorture/configs/rcu/v0.0/P5-U-T-NH-sd-SMP-hp deleted file mode 100644 index ef624ce..0000000 --- a/rcutorture/configs/rcu/v0.0/P5-U-T-NH-sd-SMP-hp +++ /dev/null @@ -1,28 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_RCU_CPU_STALL_INFO=y -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=6 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=y -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_DEBUG_KERNEL=y -CONFIG_PROVE_RCU_DELAY=y -CONFIG_DEBUG_OBJECTS=y -CONFIG_DEBUG_OBJECTS_RCU_HEAD=y -CONFIG_RT_MUTEXES=y -CONFIG_RCU_BOOST=y -CONFIG_RCU_BOOST_PRIO=2 -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v0.0/PT1-nh b/rcutorture/configs/rcu/v0.0/PT1-nh deleted file mode 100644 index e3361c3..0000000 --- a/rcutorture/configs/rcu/v0.0/PT1-nh +++ /dev/null @@ -1,23 +0,0 @@ -CONFIG_TINY_PREEMPT_RCU=y -CONFIG_RCU_BOOST=y -CONFIG_RCU_BOOST_PRIO=2 -CONFIG_RCU_TRACE=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -# -CONFIG_SMP=n -# -CONFIG_HOTPLUG_CPU=n -# -CONFIG_NO_HZ=n -# -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v0.0/PT2-NH b/rcutorture/configs/rcu/v0.0/PT2-NH deleted file mode 100644 index 64abfc3..0000000 --- a/rcutorture/configs/rcu/v0.0/PT2-NH +++ /dev/null @@ -1,22 +0,0 @@ -CONFIG_TINY_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -# -CONFIG_SMP=n -# -CONFIG_HOTPLUG_CPU=n -# -CONFIG_NO_HZ=y -# -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v0.0/ver_functions.sh b/rcutorture/configs/rcu/v0.0/ver_functions.sh deleted file mode 100644 index 5ace37a..0000000 --- a/rcutorture/configs/rcu/v0.0/ver_functions.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash -# -# Kernel-version-dependent shell functions for the rest of the scripts. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, you can access it online at -# http://www.gnu.org/licenses/gpl-2.0.html. -# -# Copyright (C) IBM Corporation, 2013 -# -# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com> - -# per_version_boot_params bootparam-string config-file seconds -# -# Adds per-version torture-module parameters to kernels supporting them. -# Which old kernels do not. -per_version_boot_params () { - echo rcutorture.stat_interval=15 \ - rcutorture.shutdown_secs=$3 \ - rcutorture.rcutorture_runnable=1 \ - rcutorture.test_no_idle_hz=1 \ - rcutorture.verbose=1 -} diff --git a/rcutorture/configs/rcu/v3.12/CFLIST b/rcutorture/configs/rcu/v3.12/CFLIST deleted file mode 100644 index da4cbc6..0000000 --- a/rcutorture/configs/rcu/v3.12/CFLIST +++ /dev/null @@ -1,17 +0,0 @@ -sysidleY.2013.06.19a -sysidleN.2013.06.19a -P1-S-T-NH-SD-SMP-HP -P2-2-t-nh-sd-SMP-hp -P3-3-T-nh-SD-SMP-hp -P4-A-t-NH-sd-SMP-HP -P5-U-T-NH-sd-SMP-hp -P6---t-nh-SD-smp-hp -N1-S-T-NH-SD-SMP-HP -N2-2-t-nh-sd-SMP-hp -N3-3-T-nh-SD-SMP-hp -N4-A-t-NH-sd-SMP-HP -N5-U-T-NH-sd-SMP-hp -PT1-nh -PT2-NH -NT1-nh -NT3-NH diff --git a/rcutorture/configs/rcu/v3.12/N1-S-T-NH-SD-SMP-HP b/rcutorture/configs/rcu/v3.12/N1-S-T-NH-SD-SMP-HP deleted file mode 100644 index d81e11d..0000000 --- a/rcutorture/configs/rcu/v3.12/N1-S-T-NH-SD-SMP-HP +++ /dev/null @@ -1,19 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_RCU_FAST_NO_HZ=y -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=8 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=y -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.12/N2-2-t-nh-sd-SMP-hp b/rcutorture/configs/rcu/v3.12/N2-2-t-nh-sd-SMP-hp deleted file mode 100644 index 02e4185..0000000 --- a/rcutorture/configs/rcu/v3.12/N2-2-t-nh-sd-SMP-hp +++ /dev/null @@ -1,20 +0,0 @@ -CONFIG_RCU_TRACE=n -CONFIG_NO_HZ=n -CONFIG_SMP=y -CONFIG_RCU_FANOUT=4 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.12/N3-3-T-nh-SD-SMP-hp b/rcutorture/configs/rcu/v3.12/N3-3-T-nh-SD-SMP-hp deleted file mode 100644 index b3100f6..0000000 --- a/rcutorture/configs/rcu/v3.12/N3-3-T-nh-SD-SMP-hp +++ /dev/null @@ -1,22 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_NO_HZ=n -CONFIG_SMP=y -CONFIG_RCU_FANOUT=2 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.12/N4-A-t-NH-sd-SMP-HP b/rcutorture/configs/rcu/v3.12/N4-A-t-NH-sd-SMP-HP deleted file mode 100644 index c56b445..0000000 --- a/rcutorture/configs/rcu/v3.12/N4-A-t-NH-sd-SMP-HP +++ /dev/null @@ -1,18 +0,0 @@ -CONFIG_RCU_TRACE=n -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=6 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=y -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.12/N5-U-T-NH-sd-SMP-hp b/rcutorture/configs/rcu/v3.12/N5-U-T-NH-sd-SMP-hp deleted file mode 100644 index 90d924f..0000000 --- a/rcutorture/configs/rcu/v3.12/N5-U-T-NH-sd-SMP-hp +++ /dev/null @@ -1,22 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_DEBUG_KERNEL=y -CONFIG_RCU_CPU_STALL_INFO=y -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=6 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=y -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.12/N6---t-nh-SD-smp-hp b/rcutorture/configs/rcu/v3.12/N6---t-nh-SD-smp-hp deleted file mode 100644 index 0ccc36d..0000000 --- a/rcutorture/configs/rcu/v3.12/N6---t-nh-SD-smp-hp +++ /dev/null @@ -1,19 +0,0 @@ -CONFIG_RCU_TRACE=n -CONFIG_NO_HZ=n -CONFIG_SMP=y -CONFIG_NR_CPUS=1 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.12/N7-4-T-NH-SD-SMP-HP b/rcutorture/configs/rcu/v3.12/N7-4-T-NH-SD-SMP-HP deleted file mode 100644 index 3f640cf..0000000 --- a/rcutorture/configs/rcu/v3.12/N7-4-T-NH-SD-SMP-HP +++ /dev/null @@ -1,26 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_DEBUG_KERNEL=y -CONFIG_RCU_CPU_STALL_INFO=y -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=2 -CONFIG_NR_CPUS=16 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=y -CONFIG_RCU_NOCB_CPU=y -CONFIG_RCU_NOCB_CPU_NONE=y -CONFIG_RCU_NOCB_CPU_ZERO=n -CONFIG_RCU_NOCB_CPU_ALL=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.12/N8-2-T-NH-SD-SMP-HP b/rcutorture/configs/rcu/v3.12/N8-2-T-NH-SD-SMP-HP deleted file mode 100644 index 285da2d..0000000 --- a/rcutorture/configs/rcu/v3.12/N8-2-T-NH-SD-SMP-HP +++ /dev/null @@ -1,22 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_DEBUG_KERNEL=y -CONFIG_RCU_CPU_STALL_INFO=y -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=14 -CONFIG_NR_CPUS=16 -CONFIG_RCU_FANOUT_EXACT=y -CONFIG_HOTPLUG_CPU=y -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.12/NT1-nh b/rcutorture/configs/rcu/v3.12/NT1-nh deleted file mode 100644 index 023f312..0000000 --- a/rcutorture/configs/rcu/v3.12/NT1-nh +++ /dev/null @@ -1,23 +0,0 @@ -#CHECK#CONFIG_TINY_RCU=y -CONFIG_RCU_TRACE=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -# -CONFIG_SMP=n -# -CONFIG_HOTPLUG_CPU=n -# -CONFIG_NO_HZ=n -# -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.12/NT3-NH b/rcutorture/configs/rcu/v3.12/NT3-NH deleted file mode 100644 index 6fd0235..0000000 --- a/rcutorture/configs/rcu/v3.12/NT3-NH +++ /dev/null @@ -1,20 +0,0 @@ -#CHECK#CONFIG_TINY_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -# -CONFIG_SMP=n -# -CONFIG_HOTPLUG_CPU=n -# -CONFIG_NO_HZ=y -# -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.12/P1-S-T-NH-SD-SMP-HP b/rcutorture/configs/rcu/v3.12/P1-S-T-NH-SD-SMP-HP deleted file mode 100644 index 9647c44..0000000 --- a/rcutorture/configs/rcu/v3.12/P1-S-T-NH-SD-SMP-HP +++ /dev/null @@ -1,20 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_RCU_CPU_STALL_INFO=y -CONFIG_NO_HZ=y -CONFIG_RCU_FAST_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=8 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=y -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.12/P2-2-t-nh-sd-SMP-hp b/rcutorture/configs/rcu/v3.12/P2-2-t-nh-sd-SMP-hp deleted file mode 100644 index 0f3b667..0000000 --- a/rcutorture/configs/rcu/v3.12/P2-2-t-nh-sd-SMP-hp +++ /dev/null @@ -1,20 +0,0 @@ -CONFIG_RCU_TRACE=n -CONFIG_NO_HZ=n -CONFIG_SMP=y -CONFIG_RCU_FANOUT=4 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.12/P3-3-T-nh-SD-SMP-hp b/rcutorture/configs/rcu/v3.12/P3-3-T-nh-SD-SMP-hp deleted file mode 100644 index b035e14..0000000 --- a/rcutorture/configs/rcu/v3.12/P3-3-T-nh-SD-SMP-hp +++ /dev/null @@ -1,20 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_NO_HZ=n -CONFIG_SMP=y -CONFIG_RCU_FANOUT=2 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.12/P4-A-t-NH-sd-SMP-HP b/rcutorture/configs/rcu/v3.12/P4-A-t-NH-sd-SMP-HP deleted file mode 100644 index 3ccf6a9..0000000 --- a/rcutorture/configs/rcu/v3.12/P4-A-t-NH-sd-SMP-HP +++ /dev/null @@ -1,22 +0,0 @@ -CONFIG_RCU_TRACE=n -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=6 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=y -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_RT_MUTEXES=y -CONFIG_RCU_BOOST=y -CONFIG_RCU_BOOST_PRIO=2 -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.12/P5-U-T-NH-sd-SMP-hp b/rcutorture/configs/rcu/v3.12/P5-U-T-NH-sd-SMP-hp deleted file mode 100644 index ef624ce..0000000 --- a/rcutorture/configs/rcu/v3.12/P5-U-T-NH-sd-SMP-hp +++ /dev/null @@ -1,28 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_RCU_CPU_STALL_INFO=y -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=6 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=y -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_DEBUG_KERNEL=y -CONFIG_PROVE_RCU_DELAY=y -CONFIG_DEBUG_OBJECTS=y -CONFIG_DEBUG_OBJECTS_RCU_HEAD=y -CONFIG_RT_MUTEXES=y -CONFIG_RCU_BOOST=y -CONFIG_RCU_BOOST_PRIO=2 -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.12/P6---t-nh-SD-smp-hp b/rcutorture/configs/rcu/v3.12/P6---t-nh-SD-smp-hp deleted file mode 100644 index f4c9175..0000000 --- a/rcutorture/configs/rcu/v3.12/P6---t-nh-SD-smp-hp +++ /dev/null @@ -1,18 +0,0 @@ -CONFIG_RCU_TRACE=n -CONFIG_NO_HZ=n -CONFIG_SMP=n -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -CONFIG_TREE_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-HP b/rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-HP deleted file mode 100644 index 77a8c5b..0000000 --- a/rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-HP +++ /dev/null @@ -1,30 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=2 -CONFIG_NR_CPUS=16 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=y -CONFIG_RCU_NOCB_CPU=y -CONFIG_RCU_NOCB_CPU_NONE=n -CONFIG_RCU_NOCB_CPU_ZERO=n -CONFIG_RCU_NOCB_CPU_ALL=y -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_DEBUG_KERNEL=y -CONFIG_DEBUG_OBJECTS=y -CONFIG_DEBUG_OBJECTS_RCU_HEAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_SLUB=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-HP-all b/rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-HP-all deleted file mode 100644 index 0eecebc..0000000 --- a/rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-HP-all +++ /dev/null @@ -1,30 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=2 -CONFIG_NR_CPUS=16 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=y -CONFIG_RCU_NOCB_CPU=y -CONFIG_RCU_NOCB_CPU_NONE=y -CONFIG_RCU_NOCB_CPU_ZERO=n -CONFIG_RCU_NOCB_CPU_ALL=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_DEBUG_KERNEL=y -CONFIG_DEBUG_OBJECTS=y -CONFIG_DEBUG_OBJECTS_RCU_HEAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_SLUB=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-HP-none b/rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-HP-none deleted file mode 100644 index 0eecebc..0000000 --- a/rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-HP-none +++ /dev/null @@ -1,30 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=2 -CONFIG_NR_CPUS=16 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=y -CONFIG_RCU_NOCB_CPU=y -CONFIG_RCU_NOCB_CPU_NONE=y -CONFIG_RCU_NOCB_CPU_ZERO=n -CONFIG_RCU_NOCB_CPU_ALL=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_DEBUG_KERNEL=y -CONFIG_DEBUG_OBJECTS=y -CONFIG_DEBUG_OBJECTS_RCU_HEAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_SLUB=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-hp b/rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-hp deleted file mode 100644 index 588bc70..0000000 --- a/rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-hp +++ /dev/null @@ -1,30 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=2 -CONFIG_NR_CPUS=16 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=n -CONFIG_RCU_NOCB_CPU=y -CONFIG_RCU_NOCB_CPU_NONE=n -CONFIG_RCU_NOCB_CPU_ZERO=y -CONFIG_RCU_NOCB_CPU_ALL=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_DEBUG_KERNEL=y -CONFIG_DEBUG_OBJECTS=y -CONFIG_DEBUG_OBJECTS_RCU_HEAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_SLUB=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.12/PT1-nh b/rcutorture/configs/rcu/v3.12/PT1-nh deleted file mode 100644 index e3361c3..0000000 --- a/rcutorture/configs/rcu/v3.12/PT1-nh +++ /dev/null @@ -1,23 +0,0 @@ -CONFIG_TINY_PREEMPT_RCU=y -CONFIG_RCU_BOOST=y -CONFIG_RCU_BOOST_PRIO=2 -CONFIG_RCU_TRACE=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -# -CONFIG_SMP=n -# -CONFIG_HOTPLUG_CPU=n -# -CONFIG_NO_HZ=n -# -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.12/PT2-NH b/rcutorture/configs/rcu/v3.12/PT2-NH deleted file mode 100644 index 64abfc3..0000000 --- a/rcutorture/configs/rcu/v3.12/PT2-NH +++ /dev/null @@ -1,22 +0,0 @@ -CONFIG_TINY_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -# -CONFIG_SMP=n -# -CONFIG_HOTPLUG_CPU=n -# -CONFIG_NO_HZ=y -# -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.3/CFLIST b/rcutorture/configs/rcu/v3.3/CFLIST deleted file mode 100644 index 1822394..0000000 --- a/rcutorture/configs/rcu/v3.3/CFLIST +++ /dev/null @@ -1,14 +0,0 @@ -P1-S-T-NH-SD-SMP-HP -P2-2-t-nh-sd-SMP-hp -P3-3-T-nh-SD-SMP-hp -P4-A-t-NH-sd-SMP-HP -P5-U-T-NH-sd-SMP-hp -N1-S-T-NH-SD-SMP-HP -N2-2-t-nh-sd-SMP-hp -N3-3-T-nh-SD-SMP-hp -N4-A-t-NH-sd-SMP-HP -N5-U-T-NH-sd-SMP-hp -PT1-nh -PT2-NH -NT1-nh -NT3-NH diff --git a/rcutorture/configs/rcu/v3.3/N1-S-T-NH-SD-SMP-HP b/rcutorture/configs/rcu/v3.3/N1-S-T-NH-SD-SMP-HP deleted file mode 100644 index d81e11d..0000000 --- a/rcutorture/configs/rcu/v3.3/N1-S-T-NH-SD-SMP-HP +++ /dev/null @@ -1,19 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_RCU_FAST_NO_HZ=y -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=8 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=y -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.3/N2-2-t-nh-sd-SMP-hp b/rcutorture/configs/rcu/v3.3/N2-2-t-nh-sd-SMP-hp deleted file mode 100644 index 02e4185..0000000 --- a/rcutorture/configs/rcu/v3.3/N2-2-t-nh-sd-SMP-hp +++ /dev/null @@ -1,20 +0,0 @@ -CONFIG_RCU_TRACE=n -CONFIG_NO_HZ=n -CONFIG_SMP=y -CONFIG_RCU_FANOUT=4 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.3/N3-3-T-nh-SD-SMP-hp b/rcutorture/configs/rcu/v3.3/N3-3-T-nh-SD-SMP-hp deleted file mode 100644 index b3100f6..0000000 --- a/rcutorture/configs/rcu/v3.3/N3-3-T-nh-SD-SMP-hp +++ /dev/null @@ -1,22 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_NO_HZ=n -CONFIG_SMP=y -CONFIG_RCU_FANOUT=2 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.3/N4-A-t-NH-sd-SMP-HP b/rcutorture/configs/rcu/v3.3/N4-A-t-NH-sd-SMP-HP deleted file mode 100644 index c56b445..0000000 --- a/rcutorture/configs/rcu/v3.3/N4-A-t-NH-sd-SMP-HP +++ /dev/null @@ -1,18 +0,0 @@ -CONFIG_RCU_TRACE=n -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=6 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=y -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.3/N5-U-T-NH-sd-SMP-hp b/rcutorture/configs/rcu/v3.3/N5-U-T-NH-sd-SMP-hp deleted file mode 100644 index 90d924f..0000000 --- a/rcutorture/configs/rcu/v3.3/N5-U-T-NH-sd-SMP-hp +++ /dev/null @@ -1,22 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_DEBUG_KERNEL=y -CONFIG_RCU_CPU_STALL_INFO=y -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=6 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=y -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.3/NT1-nh b/rcutorture/configs/rcu/v3.3/NT1-nh deleted file mode 100644 index 023f312..0000000 --- a/rcutorture/configs/rcu/v3.3/NT1-nh +++ /dev/null @@ -1,23 +0,0 @@ -#CHECK#CONFIG_TINY_RCU=y -CONFIG_RCU_TRACE=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -# -CONFIG_SMP=n -# -CONFIG_HOTPLUG_CPU=n -# -CONFIG_NO_HZ=n -# -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.3/NT3-NH b/rcutorture/configs/rcu/v3.3/NT3-NH deleted file mode 100644 index 6fd0235..0000000 --- a/rcutorture/configs/rcu/v3.3/NT3-NH +++ /dev/null @@ -1,20 +0,0 @@ -#CHECK#CONFIG_TINY_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -# -CONFIG_SMP=n -# -CONFIG_HOTPLUG_CPU=n -# -CONFIG_NO_HZ=y -# -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.3/P1-S-T-NH-SD-SMP-HP b/rcutorture/configs/rcu/v3.3/P1-S-T-NH-SD-SMP-HP deleted file mode 100644 index 9647c44..0000000 --- a/rcutorture/configs/rcu/v3.3/P1-S-T-NH-SD-SMP-HP +++ /dev/null @@ -1,20 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_RCU_CPU_STALL_INFO=y -CONFIG_NO_HZ=y -CONFIG_RCU_FAST_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=8 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=y -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.3/P2-2-t-nh-sd-SMP-hp b/rcutorture/configs/rcu/v3.3/P2-2-t-nh-sd-SMP-hp deleted file mode 100644 index 0f3b667..0000000 --- a/rcutorture/configs/rcu/v3.3/P2-2-t-nh-sd-SMP-hp +++ /dev/null @@ -1,20 +0,0 @@ -CONFIG_RCU_TRACE=n -CONFIG_NO_HZ=n -CONFIG_SMP=y -CONFIG_RCU_FANOUT=4 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.3/P3-3-T-nh-SD-SMP-hp b/rcutorture/configs/rcu/v3.3/P3-3-T-nh-SD-SMP-hp deleted file mode 100644 index b035e14..0000000 --- a/rcutorture/configs/rcu/v3.3/P3-3-T-nh-SD-SMP-hp +++ /dev/null @@ -1,20 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_NO_HZ=n -CONFIG_SMP=y -CONFIG_RCU_FANOUT=2 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.3/P4-A-t-NH-sd-SMP-HP b/rcutorture/configs/rcu/v3.3/P4-A-t-NH-sd-SMP-HP deleted file mode 100644 index 3ccf6a9..0000000 --- a/rcutorture/configs/rcu/v3.3/P4-A-t-NH-sd-SMP-HP +++ /dev/null @@ -1,22 +0,0 @@ -CONFIG_RCU_TRACE=n -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=6 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=y -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_RT_MUTEXES=y -CONFIG_RCU_BOOST=y -CONFIG_RCU_BOOST_PRIO=2 -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.3/P5-U-T-NH-sd-SMP-hp b/rcutorture/configs/rcu/v3.3/P5-U-T-NH-sd-SMP-hp deleted file mode 100644 index ef624ce..0000000 --- a/rcutorture/configs/rcu/v3.3/P5-U-T-NH-sd-SMP-hp +++ /dev/null @@ -1,28 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_RCU_CPU_STALL_INFO=y -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=6 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=y -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_DEBUG_KERNEL=y -CONFIG_PROVE_RCU_DELAY=y -CONFIG_DEBUG_OBJECTS=y -CONFIG_DEBUG_OBJECTS_RCU_HEAD=y -CONFIG_RT_MUTEXES=y -CONFIG_RCU_BOOST=y -CONFIG_RCU_BOOST_PRIO=2 -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.3/PT1-nh b/rcutorture/configs/rcu/v3.3/PT1-nh deleted file mode 100644 index e3361c3..0000000 --- a/rcutorture/configs/rcu/v3.3/PT1-nh +++ /dev/null @@ -1,23 +0,0 @@ -CONFIG_TINY_PREEMPT_RCU=y -CONFIG_RCU_BOOST=y -CONFIG_RCU_BOOST_PRIO=2 -CONFIG_RCU_TRACE=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -# -CONFIG_SMP=n -# -CONFIG_HOTPLUG_CPU=n -# -CONFIG_NO_HZ=n -# -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.3/PT2-NH b/rcutorture/configs/rcu/v3.3/PT2-NH deleted file mode 100644 index 64abfc3..0000000 --- a/rcutorture/configs/rcu/v3.3/PT2-NH +++ /dev/null @@ -1,22 +0,0 @@ -CONFIG_TINY_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -# -CONFIG_SMP=n -# -CONFIG_HOTPLUG_CPU=n -# -CONFIG_NO_HZ=y -# -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.3/ver_functions.sh b/rcutorture/configs/rcu/v3.3/ver_functions.sh deleted file mode 100644 index bae5569..0000000 --- a/rcutorture/configs/rcu/v3.3/ver_functions.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash -# -# Kernel-version-dependent shell functions for the rest of the scripts. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, you can access it online at -# http://www.gnu.org/licenses/gpl-2.0.html. -# -# Copyright (C) IBM Corporation, 2013 -# -# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com> - -# rcutorture_param_onoff bootparam-string config-file -# -# Adds onoff rcutorture module parameters to kernels having it. -rcutorture_param_onoff () { - if ! bootparam_hotplug_cpu "$1" && configfrag_hotplug_cpu "$2" - then - echo CPU-hotplug kernel, adding rcutorture onoff. 1>&2 - echo rcutorture.onoff_interval=3 rcutorture.onoff_holdoff=30 - fi -} - -# per_version_boot_params bootparam-string config-file seconds -# -# Adds per-version torture-module parameters to kernels supporting them. -per_version_boot_params () { - echo $1 `rcutorture_param_onoff "$1" "$2"` \ - rcutorture.stat_interval=15 \ - rcutorture.shutdown_secs=$3 \ - rcutorture.rcutorture_runnable=1 \ - rcutorture.test_no_idle_hz=1 \ - rcutorture.verbose=1 -} diff --git a/rcutorture/configs/rcu/v3.5/CFLIST b/rcutorture/configs/rcu/v3.5/CFLIST deleted file mode 100644 index 1822394..0000000 --- a/rcutorture/configs/rcu/v3.5/CFLIST +++ /dev/null @@ -1,14 +0,0 @@ -P1-S-T-NH-SD-SMP-HP -P2-2-t-nh-sd-SMP-hp -P3-3-T-nh-SD-SMP-hp -P4-A-t-NH-sd-SMP-HP -P5-U-T-NH-sd-SMP-hp -N1-S-T-NH-SD-SMP-HP -N2-2-t-nh-sd-SMP-hp -N3-3-T-nh-SD-SMP-hp -N4-A-t-NH-sd-SMP-HP -N5-U-T-NH-sd-SMP-hp -PT1-nh -PT2-NH -NT1-nh -NT3-NH diff --git a/rcutorture/configs/rcu/v3.5/N1-S-T-NH-SD-SMP-HP b/rcutorture/configs/rcu/v3.5/N1-S-T-NH-SD-SMP-HP deleted file mode 100644 index d81e11d..0000000 --- a/rcutorture/configs/rcu/v3.5/N1-S-T-NH-SD-SMP-HP +++ /dev/null @@ -1,19 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_RCU_FAST_NO_HZ=y -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=8 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=y -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.5/N2-2-t-nh-sd-SMP-hp b/rcutorture/configs/rcu/v3.5/N2-2-t-nh-sd-SMP-hp deleted file mode 100644 index 02e4185..0000000 --- a/rcutorture/configs/rcu/v3.5/N2-2-t-nh-sd-SMP-hp +++ /dev/null @@ -1,20 +0,0 @@ -CONFIG_RCU_TRACE=n -CONFIG_NO_HZ=n -CONFIG_SMP=y -CONFIG_RCU_FANOUT=4 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.5/N3-3-T-nh-SD-SMP-hp b/rcutorture/configs/rcu/v3.5/N3-3-T-nh-SD-SMP-hp deleted file mode 100644 index b3100f6..0000000 --- a/rcutorture/configs/rcu/v3.5/N3-3-T-nh-SD-SMP-hp +++ /dev/null @@ -1,22 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_NO_HZ=n -CONFIG_SMP=y -CONFIG_RCU_FANOUT=2 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.5/N4-A-t-NH-sd-SMP-HP b/rcutorture/configs/rcu/v3.5/N4-A-t-NH-sd-SMP-HP deleted file mode 100644 index c56b445..0000000 --- a/rcutorture/configs/rcu/v3.5/N4-A-t-NH-sd-SMP-HP +++ /dev/null @@ -1,18 +0,0 @@ -CONFIG_RCU_TRACE=n -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=6 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=y -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.5/N5-U-T-NH-sd-SMP-hp b/rcutorture/configs/rcu/v3.5/N5-U-T-NH-sd-SMP-hp deleted file mode 100644 index 90d924f..0000000 --- a/rcutorture/configs/rcu/v3.5/N5-U-T-NH-sd-SMP-hp +++ /dev/null @@ -1,22 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_DEBUG_KERNEL=y -CONFIG_RCU_CPU_STALL_INFO=y -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=6 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=y -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -#CHECK#CONFIG_TREE_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.5/NT1-nh b/rcutorture/configs/rcu/v3.5/NT1-nh deleted file mode 100644 index 023f312..0000000 --- a/rcutorture/configs/rcu/v3.5/NT1-nh +++ /dev/null @@ -1,23 +0,0 @@ -#CHECK#CONFIG_TINY_RCU=y -CONFIG_RCU_TRACE=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -# -CONFIG_SMP=n -# -CONFIG_HOTPLUG_CPU=n -# -CONFIG_NO_HZ=n -# -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.5/NT3-NH b/rcutorture/configs/rcu/v3.5/NT3-NH deleted file mode 100644 index 6fd0235..0000000 --- a/rcutorture/configs/rcu/v3.5/NT3-NH +++ /dev/null @@ -1,20 +0,0 @@ -#CHECK#CONFIG_TINY_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -# -CONFIG_SMP=n -# -CONFIG_HOTPLUG_CPU=n -# -CONFIG_NO_HZ=y -# -CONFIG_PREEMPT_NONE=y -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=n -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.5/P1-S-T-NH-SD-SMP-HP b/rcutorture/configs/rcu/v3.5/P1-S-T-NH-SD-SMP-HP deleted file mode 100644 index 9647c44..0000000 --- a/rcutorture/configs/rcu/v3.5/P1-S-T-NH-SD-SMP-HP +++ /dev/null @@ -1,20 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_RCU_CPU_STALL_INFO=y -CONFIG_NO_HZ=y -CONFIG_RCU_FAST_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=8 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=y -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.5/P2-2-t-nh-sd-SMP-hp b/rcutorture/configs/rcu/v3.5/P2-2-t-nh-sd-SMP-hp deleted file mode 100644 index 0f3b667..0000000 --- a/rcutorture/configs/rcu/v3.5/P2-2-t-nh-sd-SMP-hp +++ /dev/null @@ -1,20 +0,0 @@ -CONFIG_RCU_TRACE=n -CONFIG_NO_HZ=n -CONFIG_SMP=y -CONFIG_RCU_FANOUT=4 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.5/P3-3-T-nh-SD-SMP-hp b/rcutorture/configs/rcu/v3.5/P3-3-T-nh-SD-SMP-hp deleted file mode 100644 index b035e14..0000000 --- a/rcutorture/configs/rcu/v3.5/P3-3-T-nh-SD-SMP-hp +++ /dev/null @@ -1,20 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_NO_HZ=n -CONFIG_SMP=y -CONFIG_RCU_FANOUT=2 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.5/P4-A-t-NH-sd-SMP-HP b/rcutorture/configs/rcu/v3.5/P4-A-t-NH-sd-SMP-HP deleted file mode 100644 index 3ccf6a9..0000000 --- a/rcutorture/configs/rcu/v3.5/P4-A-t-NH-sd-SMP-HP +++ /dev/null @@ -1,22 +0,0 @@ -CONFIG_RCU_TRACE=n -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=6 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=n -CONFIG_HOTPLUG_CPU=y -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_RT_MUTEXES=y -CONFIG_RCU_BOOST=y -CONFIG_RCU_BOOST_PRIO=2 -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.5/P5-U-T-NH-sd-SMP-hp b/rcutorture/configs/rcu/v3.5/P5-U-T-NH-sd-SMP-hp deleted file mode 100644 index ef624ce..0000000 --- a/rcutorture/configs/rcu/v3.5/P5-U-T-NH-sd-SMP-hp +++ /dev/null @@ -1,28 +0,0 @@ -CONFIG_RCU_TRACE=y -CONFIG_RCU_CPU_STALL_INFO=y -CONFIG_NO_HZ=y -CONFIG_SMP=y -CONFIG_RCU_FANOUT=6 -CONFIG_NR_CPUS=8 -CONFIG_RCU_FANOUT_EXACT=y -CONFIG_HOTPLUG_CPU=n -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -#CHECK#CONFIG_TREE_PREEMPT_RCU=y -CONFIG_DEBUG_KERNEL=y -CONFIG_PROVE_RCU_DELAY=y -CONFIG_DEBUG_OBJECTS=y -CONFIG_DEBUG_OBJECTS_RCU_HEAD=y -CONFIG_RT_MUTEXES=y -CONFIG_RCU_BOOST=y -CONFIG_RCU_BOOST_PRIO=2 -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.5/PT1-nh b/rcutorture/configs/rcu/v3.5/PT1-nh deleted file mode 100644 index e3361c3..0000000 --- a/rcutorture/configs/rcu/v3.5/PT1-nh +++ /dev/null @@ -1,23 +0,0 @@ -CONFIG_TINY_PREEMPT_RCU=y -CONFIG_RCU_BOOST=y -CONFIG_RCU_BOOST_PRIO=2 -CONFIG_RCU_TRACE=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -# -CONFIG_SMP=n -# -CONFIG_HOTPLUG_CPU=n -# -CONFIG_NO_HZ=n -# -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.5/PT2-NH b/rcutorture/configs/rcu/v3.5/PT2-NH deleted file mode 100644 index 64abfc3..0000000 --- a/rcutorture/configs/rcu/v3.5/PT2-NH +++ /dev/null @@ -1,22 +0,0 @@ -CONFIG_TINY_PREEMPT_RCU=y -CONFIG_RCU_TORTURE_TEST=m -CONFIG_MODULE_UNLOAD=y -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -# -CONFIG_SMP=n -# -CONFIG_HOTPLUG_CPU=n -# -CONFIG_NO_HZ=y -# -CONFIG_PREEMPT_NONE=n -CONFIG_PREEMPT_VOLUNTARY=n -CONFIG_PREEMPT=y -CONFIG_PROVE_LOCKING=y -CONFIG_PROVE_RCU=y -CONFIG_SYSFS_DEPRECATED_V2=y -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_PRINTK_TIME=y - diff --git a/rcutorture/configs/rcu/v3.5/ver_functions.sh b/rcutorture/configs/rcu/v3.5/ver_functions.sh deleted file mode 100644 index 8977d8d..0000000 --- a/rcutorture/configs/rcu/v3.5/ver_functions.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash -# -# Kernel-version-dependent shell functions for the rest of the scripts. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, you can access it online at -# http://www.gnu.org/licenses/gpl-2.0.html. -# -# Copyright (C) IBM Corporation, 2013 -# -# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com> - -# rcutorture_param_n_barrier_cbs bootparam-string -# -# Adds n_barrier_cbs rcutorture module parameter to kernels having it. -rcutorture_param_n_barrier_cbs () { - if echo $1 | grep -q "rcutorture\.n_barrier_cbs" - then - : - else - echo rcutorture.n_barrier_cbs=4 - fi -} - -# rcutorture_param_onoff bootparam-string config-file -# -# Adds onoff rcutorture module parameters to kernels having it. -rcutorture_param_onoff () { - if ! bootparam_hotplug_cpu "$1" && configfrag_hotplug_cpu "$2" - then - echo CPU-hotplug kernel, adding rcutorture onoff. 1>&2 - echo rcutorture.onoff_interval=3 rcutorture.onoff_holdoff=30 - fi -} - -# per_version_boot_params bootparam-string config-file seconds -# -# Adds per-version torture-module parameters to kernels supporting them. -per_version_boot_params () { - echo $1 `rcutorture_param_onoff "$1" "$2"` \ - `rcutorture_param_n_barrier_cbs "$1"` \ - rcutorture.stat_interval=15 \ - rcutorture.shutdown_secs=$3 \ - rcutorture.rcutorture_runnable=1 \ - rcutorture.test_no_idle_hz=1 \ - rcutorture.verbose=1 -} diff --git a/rcutorture/configs/rcu/ver_functions.sh b/rcutorture/configs/rcu/ver_functions.sh deleted file mode 100644 index 8977d8d..0000000 --- a/rcutorture/configs/rcu/ver_functions.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash -# -# Kernel-version-dependent shell functions for the rest of the scripts. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, you can access it online at -# http://www.gnu.org/licenses/gpl-2.0.html. -# -# Copyright (C) IBM Corporation, 2013 -# -# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com> - -# rcutorture_param_n_barrier_cbs bootparam-string -# -# Adds n_barrier_cbs rcutorture module parameter to kernels having it. -rcutorture_param_n_barrier_cbs () { - if echo $1 | grep -q "rcutorture\.n_barrier_cbs" - then - : - else - echo rcutorture.n_barrier_cbs=4 - fi -} - -# rcutorture_param_onoff bootparam-string config-file -# -# Adds onoff rcutorture module parameters to kernels having it. -rcutorture_param_onoff () { - if ! bootparam_hotplug_cpu "$1" && configfrag_hotplug_cpu "$2" - then - echo CPU-hotplug kernel, adding rcutorture onoff. 1>&2 - echo rcutorture.onoff_interval=3 rcutorture.onoff_holdoff=30 - fi -} - -# per_version_boot_params bootparam-string config-file seconds -# -# Adds per-version torture-module parameters to kernels supporting them. -per_version_boot_params () { - echo $1 `rcutorture_param_onoff "$1" "$2"` \ - `rcutorture_param_n_barrier_cbs "$1"` \ - rcutorture.stat_interval=15 \ - rcutorture.shutdown_secs=$3 \ - rcutorture.rcutorture_runnable=1 \ - rcutorture.test_no_idle_hz=1 \ - rcutorture.verbose=1 -} diff --git a/rcutorture/doc/TINY_RCU.txt b/rcutorture/doc/TINY_RCU.txt deleted file mode 100644 index 28db67b..0000000 --- a/rcutorture/doc/TINY_RCU.txt +++ /dev/null @@ -1,40 +0,0 @@ -This document gives a brief rationale for the TINY_RCU test cases. - - -Kconfig Parameters: - -CONFIG_DEBUG_LOCK_ALLOC -- Do all three and none of the three. -CONFIG_PREEMPT_COUNT -CONFIG_RCU_TRACE - -The theory here is that randconfig testing will hit the other six possible -combinations of these parameters. - - -Kconfig Parameters Ignored: - -CONFIG_DEBUG_OBJECTS_RCU_HEAD -CONFIG_PROVE_RCU - - In common code tested by TREE_RCU test cases. - -CONFIG_NO_HZ_FULL_SYSIDLE -CONFIG_RCU_NOCB_CPU -CONFIG_RCU_USER_QS - - Meaningless for TINY_RCU. - -CONFIG_RCU_STALL_COMMON -CONFIG_RCU_TORTURE_TEST - - Redundant with CONFIG_RCU_TRACE. - -CONFIG_HOTPLUG_CPU -CONFIG_PREEMPT -CONFIG_PREEMPT_RCU -CONFIG_SMP -CONFIG_TINY_RCU -CONFIG_TREE_PREEMPT_RCU -CONFIG_TREE_RCU - - All forced by CONFIG_TINY_RCU. diff --git a/rcutorture/doc/TREE_RCU-kconfig.txt b/rcutorture/doc/TREE_RCU-kconfig.txt deleted file mode 100644 index adbb76c..0000000 --- a/rcutorture/doc/TREE_RCU-kconfig.txt +++ /dev/null @@ -1,95 +0,0 @@ -This document gives a brief rationale for the TREE_RCU-related test -cases, a group that includes TREE_PREEMPT_RCU. - - -Kconfig Parameters: - -CONFIG_DEBUG_LOCK_ALLOC -- Do three, covering CONFIG_PROVE_LOCKING & not. -CONFIG_DEBUG_OBJECTS_RCU_HEAD -- Do one. -CONFIG_HOTPLUG_CPU -- Do half. (Every second.) -CONFIG_HZ_PERIODIC -- Do one. -CONFIG_NO_HZ_IDLE -- Do those not otherwise specified. (Groups of two.) -CONFIG_NO_HZ_FULL -- Do two, one with CONFIG_NO_HZ_FULL_SYSIDLE. -CONFIG_NO_HZ_FULL_SYSIDLE -- Do one. -CONFIG_PREEMPT -- Do half. (First three and #8.) -CONFIG_PROVE_LOCKING -- Do all but two, covering CONFIG_PROVE_RCU and not. -CONFIG_PROVE_RCU -- Do all but one under CONFIG_PROVE_LOCKING. -CONFIG_PROVE_RCU_DELAY -- Do one. -CONFIG_RCU_BOOST -- one of TREE_PREEMPT_RCU. -CONFIG_RCU_BOOST_PRIO -- set to 2 for _BOOST testing. -CONFIG_RCU_CPU_STALL_INFO -- do one with and without _VERBOSE. -CONFIG_RCU_CPU_STALL_VERBOSE -- do one with and without _INFO. -CONFIG_RCU_FANOUT -- Cover hierarchy as currently, but overlap with others. -CONFIG_RCU_FANOUT_EXACT -- Do one. -CONFIG_RCU_FANOUT_LEAF -- Do one non-default. -CONFIG_RCU_FAST_NO_HZ -- Do one, but not with CONFIG_RCU_NOCB_CPU_ALL. -CONFIG_RCU_NOCB_CPU -- Do three, see below. -CONFIG_RCU_NOCB_CPU_ALL -- Do one. -CONFIG_RCU_NOCB_CPU_NONE -- Do one. -CONFIG_RCU_NOCB_CPU_ZERO -- Do one. -CONFIG_RCU_TRACE -- Do half. -CONFIG_SMP -- Need one !SMP for TREE_PREEMPT_RCU. -RCU-bh: Do one with PREEMPT and one with !PREEMPT. -RCU-sched: Do one with PREEMPT but not BOOST. - - -Hierarchy: - -TREE01. CONFIG_NR_CPUS=8, CONFIG_RCU_FANOUT=8, CONFIG_RCU_FANOUT_EXACT=n. -TREE02. CONFIG_NR_CPUS=8, CONFIG_RCU_FANOUT=3, CONFIG_RCU_FANOUT_EXACT=n, - CONFIG_RCU_FANOUT_LEAF=3. -TREE03. CONFIG_NR_CPUS=8, CONFIG_RCU_FANOUT=4, CONFIG_RCU_FANOUT_EXACT=n, - CONFIG_RCU_FANOUT_LEAF=4. -TREE04. CONFIG_NR_CPUS=8, CONFIG_RCU_FANOUT=2, CONFIG_RCU_FANOUT_EXACT=n, - CONFIG_RCU_FANOUT_LEAF=2. -TREE05. CONFIG_NR_CPUS=8, CONFIG_RCU_FANOUT=6, CONFIG_RCU_FANOUT_EXACT=n - CONFIG_RCU_FANOUT_LEAF=6. -TREE06. CONFIG_NR_CPUS=8, CONFIG_RCU_FANOUT=6, CONFIG_RCU_FANOUT_EXACT=y - CONFIG_RCU_FANOUT_LEAF=6. -TREE07. CONFIG_NR_CPUS=16, CONFIG_RCU_FANOUT=2, CONFIG_RCU_FANOUT_EXACT=n, - CONFIG_RCU_FANOUT_LEAF=2. -TREE08. CONFIG_NR_CPUS=16, CONFIG_RCU_FANOUT=3, CONFIG_RCU_FANOUT_EXACT=y, - CONFIG_RCU_FANOUT_LEAF=2. -TREE09. CONFIG_NR_CPUS=1. - - -Kconfig Parameters Ignored: - -CONFIG_64BIT - - Used only to check CONFIG_RCU_FANOUT value, inspection suffices. - -CONFIG_NO_HZ_FULL_SYSIDLE_SMALL - - Defer until Frederic uses this. - -CONFIG_PREEMPT_COUNT -CONFIG_PREEMPT_RCU - - Redundant with CONFIG_PREEMPT, ignore. - -CONFIG_RCU_BOOST_DELAY - - Inspection suffices, ignore. - -CONFIG_RCU_CPU_STALL_TIMEOUT - - Inspection suffices, ignore. - -CONFIG_RCU_STALL_COMMON - - Implied by TREE_RCU and TREE_PREEMPT_RCU. - -CONFIG_RCU_TORTURE_TEST -CONFIG_RCU_TORTURE_TEST_RUNNABLE - - Always used in KVM testing. - -CONFIG_RCU_USER_QS - - Redundant with CONFIG_NO_HZ_FULL. - -CONFIG_TREE_PREEMPT_RCU -CONFIG_TREE_RCU - - These are controlled by CONFIG_PREEMPT. diff --git a/rcutorture/doc/initrd.txt b/rcutorture/doc/initrd.txt deleted file mode 100644 index 49d134c..0000000 --- a/rcutorture/doc/initrd.txt +++ /dev/null @@ -1,90 +0,0 @@ -This document describes one way to create the initrd directory hierarchy -in order to allow an initrd to be built into your kernel. The trick -here is to steal the initrd file used on your Linux laptop, Ubuntu in -this case. There are probably much better ways of doing this. - -That said, here are the commands: - ------------------------------------------------------------------------- -zcat /initrd.img > /tmp/initrd.img.zcat -mkdir initrd -cd initrd -cpio -id < /tmp/initrd.img.zcat ------------------------------------------------------------------------- - -Interestingly enough, if you are running rcutorture, you don't really -need userspace in many cases. Running without userspace has the -advantage of allowing you to test your kernel independently of the -distro in place, the root-filesystem layout, and so on. To make this -happen, put the following script in the initrd's tree's "/init" file, -with 0755 mode. - ------------------------------------------------------------------------- -#!/bin/sh - -[ -d /dev ] || mkdir -m 0755 /dev -[ -d /root ] || mkdir -m 0700 /root -[ -d /sys ] || mkdir /sys -[ -d /proc ] || mkdir /proc -[ -d /tmp ] || mkdir /tmp -mkdir -p /var/lock -mount -t sysfs -o nodev,noexec,nosuid sysfs /sys -mount -t proc -o nodev,noexec,nosuid proc /proc -# Some things don't work properly without /etc/mtab. -ln -sf /proc/mounts /etc/mtab - -# Note that this only becomes /dev on the real filesystem if udev's scripts -# are used; which they will be, but it's worth pointing out -if ! mount -t devtmpfs -o mode=0755 udev /dev; then - echo "W: devtmpfs not available, falling back to tmpfs for /dev" - mount -t tmpfs -o mode=0755 udev /dev - [ -e /dev/console ] || mknod --mode=600 /dev/console c 5 1 - [ -e /dev/kmsg ] || mknod --mode=644 /dev/kmsg c 1 11 - [ -e /dev/null ] || mknod --mode=666 /dev/null c 1 3 -fi - -mkdir /dev/pts -mount -t devpts -o noexec,nosuid,gid=5,mode=0620 devpts /dev/pts || true -mount -t tmpfs -o "nosuid,size=20%,mode=0755" tmpfs /run -mkdir /run/initramfs -# compatibility symlink for the pre-oneiric locations -ln -s /run/initramfs /dev/.initramfs - -# Export relevant variables -export ROOT= -export ROOTDELAY= -export ROOTFLAGS= -export ROOTFSTYPE= -export IP= -export BOOT= -export BOOTIF= -export UBIMTD= -export break= -export init=/sbin/init -export quiet=n -export readonly=y -export rootmnt=/root -export debug= -export panic= -export blacklist= -export resume= -export resume_offset= -export recovery= - -for i in /sys/devices/system/cpu/cpu*/online -do - case $i in - '/sys/devices/system/cpu/cpu0/online') - ;; - '/sys/devices/system/cpu/cpu*/online') - ;; - *) - echo 1 > $i - ;; - esac -done - -while : -do - sleep 10 -done diff --git a/rcutorture/doc/rcu-test-image.txt b/rcutorture/doc/rcu-test-image.txt deleted file mode 100644 index 66efb59..0000000 --- a/rcutorture/doc/rcu-test-image.txt +++ /dev/null @@ -1,42 +0,0 @@ -This document describes one way to created the rcu-test-image file -that contains the filesystem used by the guest-OS kernel. There are -probably much better ways of doing this, and this filesystem could no -doubt be smaller. It is probably also possible to simply download -an appropriate image from any number of places. - -That said, here are the commands: - ------------------------------------------------------------------------- -dd if=/dev/zero of=rcu-test-image bs=400M count=1 -mkfs.ext3 ./rcu-test-image -sudo mount -o loop ./rcu-test-image /mnt - -# Replace "precise" below with your favorite Ubuntu release. -# Empirical evidence says this image will work for 64-bit, but... -# Note that debootstrap does take a few minutes to run. Or longer. -sudo debootstrap --verbose --arch i386 precise /mnt http://archive.ubuntu.com/ubuntu -cat << '___EOF___' | sudo dd of=/mnt/etc/fstab -# UNCONFIGURED FSTAB FOR BASE SYSTEM -# -/dev/vda / ext3 defaults 1 1 -dev /dev tmpfs rw 0 0 -tmpfs /dev/shm tmpfs defaults 0 0 -devpts /dev/pts devpts gid=5,mode=620 0 0 -sysfs /sys sysfs defaults 0 0 -proc /proc proc defaults 0 0 -___EOF___ -sudo umount /mnt ------------------------------------------------------------------------- - - -References: - - http://sripathikodi.blogspot.com/2010/02/creating-kvm-bootable-fedora-system.html - https://help.ubuntu.com/community/KVM/CreateGuests - https://help.ubuntu.com/community/JeOSVMBuilder - http://wiki.libvirt.org/page/UbuntuKVMWalkthrough - http://www.moe.co.uk/2011/01/07/pci_add_option_rom-failed-to-find-romfile-pxe-rtl8139-bin/ -- "apt-get install kvm-pxe" - http://www.landley.net/writing/rootfs-howto.html - http://en.wikipedia.org/wiki/Initrd - http://en.wikipedia.org/wiki/Cpio - http://wiki.libvirt.org/page/UbuntuKVMWalkthrough diff --git a/sysctl/Makefile b/sysctl/Makefile deleted file mode 100644 index 0a92ada..0000000 --- a/sysctl/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# Makefile for sysctl selftests. -# Expects kernel.sysctl_writes_strict=1. - -# No binaries, but make sure arg-less "make" doesn't trigger "run_tests". -all: - -# Allow specific tests to be selected. -test_num: - @/bin/sh ./run_numerictests - -test_string: - @/bin/sh ./run_stringtests - -run_tests: all test_num test_string - -# Nothing to clean up. -clean: - -.PHONY: all run_tests clean test_num test_string diff --git a/sysctl/common_tests b/sysctl/common_tests deleted file mode 100644 index 17d534b..0000000 --- a/sysctl/common_tests +++ /dev/null @@ -1,109 +0,0 @@ -#!/bin/sh - -TEST_FILE=$(mktemp) - -echo "== Testing sysctl behavior against ${TARGET} ==" - -set_orig() -{ - echo "${ORIG}" > "${TARGET}" -} - -set_test() -{ - echo "${TEST_STR}" > "${TARGET}" -} - -verify() -{ - local seen - seen=$(cat "$1") - if [ "${seen}" != "${TEST_STR}" ]; then - return 1 - fi - return 0 -} - -trap 'set_orig; rm -f "${TEST_FILE}"' EXIT - -rc=0 - -echo -n "Writing test file ... " -echo "${TEST_STR}" > "${TEST_FILE}" -if ! verify "${TEST_FILE}"; then - echo "FAIL" >&2 - exit 1 -else - echo "ok" -fi - -echo -n "Checking sysctl is not set to test value ... " -if verify "${TARGET}"; then - echo "FAIL" >&2 - exit 1 -else - echo "ok" -fi - -echo -n "Writing sysctl from shell ... " -set_test -if ! verify "${TARGET}"; then - echo "FAIL" >&2 - exit 1 -else - echo "ok" -fi - -echo -n "Resetting sysctl to original value ... " -set_orig -if verify "${TARGET}"; then - echo "FAIL" >&2 - exit 1 -else - echo "ok" -fi - -# Now that we've validated the sanity of "set_test" and "set_orig", -# we can use those functions to set starting states before running -# specific behavioral tests. - -echo -n "Writing entire sysctl in single write ... " -set_orig -dd if="${TEST_FILE}" of="${TARGET}" bs=4096 2>/dev/null -if ! verify "${TARGET}"; then - echo "FAIL" >&2 - rc=1 -else - echo "ok" -fi - -echo -n "Writing middle of sysctl after synchronized seek ... " -set_test -dd if="${TEST_FILE}" of="${TARGET}" bs=1 seek=1 skip=1 2>/dev/null -if ! verify "${TARGET}"; then - echo "FAIL" >&2 - rc=1 -else - echo "ok" -fi - -echo -n "Writing beyond end of sysctl ... " -set_orig -dd if="${TEST_FILE}" of="${TARGET}" bs=20 seek=2 2>/dev/null -if verify "${TARGET}"; then - echo "FAIL" >&2 - rc=1 -else - echo "ok" -fi - -echo -n "Writing sysctl with multiple long writes ... " -set_orig -(perl -e 'print "A" x 50;'; echo "${TEST_STR}") | \ - dd of="${TARGET}" bs=50 2>/dev/null -if verify "${TARGET}"; then - echo "FAIL" >&2 - rc=1 -else - echo "ok" -fi diff --git a/sysctl/run_numerictests b/sysctl/run_numerictests deleted file mode 100644 index 8510f93..0000000 --- a/sysctl/run_numerictests +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -SYSCTL="/proc/sys" -TARGET="${SYSCTL}/vm/swappiness" -ORIG=$(cat "${TARGET}") -TEST_STR=$(( $ORIG + 1 )) - -. ./common_tests - -exit $rc diff --git a/sysctl/run_stringtests b/sysctl/run_stringtests deleted file mode 100644 index 90a9293..0000000 --- a/sysctl/run_stringtests +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/sh - -SYSCTL="/proc/sys" -TARGET="${SYSCTL}/kernel/domainname" -ORIG=$(cat "${TARGET}") -TEST_STR="Testing sysctl" - -. ./common_tests - -# Only string sysctls support seeking/appending. -MAXLEN=65 - -echo -n "Writing entire sysctl in short writes ... " -set_orig -dd if="${TEST_FILE}" of="${TARGET}" bs=1 2>/dev/null -if ! verify "${TARGET}"; then - echo "FAIL" >&2 - rc=1 -else - echo "ok" -fi - -echo -n "Writing middle of sysctl after unsynchronized seek ... " -set_test -dd if="${TEST_FILE}" of="${TARGET}" bs=1 seek=1 2>/dev/null -if verify "${TARGET}"; then - echo "FAIL" >&2 - rc=1 -else - echo "ok" -fi - -echo -n "Checking sysctl maxlen is at least $MAXLEN ... " -set_orig -perl -e 'print "A" x ('"${MAXLEN}"'-2), "B";' | \ - dd of="${TARGET}" bs="${MAXLEN}" 2>/dev/null -if ! grep -q B "${TARGET}"; then - echo "FAIL" >&2 - rc=1 -else - echo "ok" -fi - -echo -n "Checking sysctl keeps original string on overflow append ... " -set_orig -perl -e 'print "A" x ('"${MAXLEN}"'-1), "B";' | \ - dd of="${TARGET}" bs=$(( MAXLEN - 1 )) 2>/dev/null -if grep -q B "${TARGET}"; then - echo "FAIL" >&2 - rc=1 -else - echo "ok" -fi - -echo -n "Checking sysctl stays NULL terminated on write ... " -set_orig -perl -e 'print "A" x ('"${MAXLEN}"'-1), "B";' | \ - dd of="${TARGET}" bs="${MAXLEN}" 2>/dev/null -if grep -q B "${TARGET}"; then - echo "FAIL" >&2 - rc=1 -else - echo "ok" -fi - -echo -n "Checking sysctl stays NULL terminated on overwrite ... " -set_orig -perl -e 'print "A" x ('"${MAXLEN}"'-1), "BB";' | \ - dd of="${TARGET}" bs=$(( $MAXLEN + 1 )) 2>/dev/null -if grep -q B "${TARGET}"; then - echo "FAIL" >&2 - rc=1 -else - echo "ok" -fi - -exit $rc diff --git a/timers/Makefile b/timers/Makefile deleted file mode 100644 index eb2859f..0000000 --- a/timers/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -all: - gcc posix_timers.c -o posix_timers -lrt - -run_tests: all - ./posix_timers - -clean: - rm -f ./posix_timers diff --git a/timers/posix_timers.c b/timers/posix_timers.c deleted file mode 100644 index 41bd855..0000000 --- a/timers/posix_timers.c +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright (C) 2013 Red Hat, Inc., Frederic Weisbecker <fweisbec@redhat.com> - * - * Licensed under the terms of the GNU GPL License version 2 - * - * Selftests for a few posix timers interface. - * - * Kernel loop code stolen from Steven Rostedt <srostedt@redhat.com> - */ - -#include <sys/time.h> -#include <stdio.h> -#include <signal.h> -#include <unistd.h> -#include <time.h> -#include <pthread.h> - -#define DELAY 2 -#define USECS_PER_SEC 1000000 - -static volatile int done; - -/* Busy loop in userspace to elapse ITIMER_VIRTUAL */ -static void user_loop(void) -{ - while (!done); -} - -/* - * Try to spend as much time as possible in kernelspace - * to elapse ITIMER_PROF. - */ -static void kernel_loop(void) -{ - void *addr = sbrk(0); - - while (!done) { - brk(addr + 4096); - brk(addr); - } -} - -/* - * Sleep until ITIMER_REAL expiration. - */ -static void idle_loop(void) -{ - pause(); -} - -static void sig_handler(int nr) -{ - done = 1; -} - -/* - * Check the expected timer expiration matches the GTOD elapsed delta since - * we armed the timer. Keep a 0.5 sec error margin due to various jitter. - */ -static int check_diff(struct timeval start, struct timeval end) -{ - long long diff; - - diff = end.tv_usec - start.tv_usec; - diff += (end.tv_sec - start.tv_sec) * USECS_PER_SEC; - - if (abs(diff - DELAY * USECS_PER_SEC) > USECS_PER_SEC / 2) { - printf("Diff too high: %lld..", diff); - return -1; - } - - return 0; -} - -static int check_itimer(int which) -{ - int err; - struct timeval start, end; - struct itimerval val = { - .it_value.tv_sec = DELAY, - }; - - printf("Check itimer "); - - if (which == ITIMER_VIRTUAL) - printf("virtual... "); - else if (which == ITIMER_PROF) - printf("prof... "); - else if (which == ITIMER_REAL) - printf("real... "); - - fflush(stdout); - - done = 0; - - if (which == ITIMER_VIRTUAL) - signal(SIGVTALRM, sig_handler); - else if (which == ITIMER_PROF) - signal(SIGPROF, sig_handler); - else if (which == ITIMER_REAL) - signal(SIGALRM, sig_handler); - - err = gettimeofday(&start, NULL); - if (err < 0) { - perror("Can't call gettimeofday()\n"); - return -1; - } - - err = setitimer(which, &val, NULL); - if (err < 0) { - perror("Can't set timer\n"); - return -1; - } - - if (which == ITIMER_VIRTUAL) - user_loop(); - else if (which == ITIMER_PROF) - kernel_loop(); - else if (which == ITIMER_REAL) - idle_loop(); - - gettimeofday(&end, NULL); - if (err < 0) { - perror("Can't call gettimeofday()\n"); - return -1; - } - - if (!check_diff(start, end)) - printf("[OK]\n"); - else - printf("[FAIL]\n"); - - return 0; -} - -static int check_timer_create(int which) -{ - int err; - timer_t id; - struct timeval start, end; - struct itimerspec val = { - .it_value.tv_sec = DELAY, - }; - - printf("Check timer_create() "); - if (which == CLOCK_THREAD_CPUTIME_ID) { - printf("per thread... "); - } else if (which == CLOCK_PROCESS_CPUTIME_ID) { - printf("per process... "); - } - fflush(stdout); - - done = 0; - err = timer_create(which, NULL, &id); - if (err < 0) { - perror("Can't create timer\n"); - return -1; - } - signal(SIGALRM, sig_handler); - - err = gettimeofday(&start, NULL); - if (err < 0) { - perror("Can't call gettimeofday()\n"); - return -1; - } - - err = timer_settime(id, 0, &val, NULL); - if (err < 0) { - perror("Can't set timer\n"); - return -1; - } - - user_loop(); - - gettimeofday(&end, NULL); - if (err < 0) { - perror("Can't call gettimeofday()\n"); - return -1; - } - - if (!check_diff(start, end)) - printf("[OK]\n"); - else - printf("[FAIL]\n"); - - return 0; -} - -int main(int argc, char **argv) -{ - int err; - - printf("Testing posix timers. False negative may happen on CPU execution \n"); - printf("based timers if other threads run on the CPU...\n"); - - if (check_itimer(ITIMER_VIRTUAL) < 0) - return -1; - - if (check_itimer(ITIMER_PROF) < 0) - return -1; - - if (check_itimer(ITIMER_REAL) < 0) - return -1; - - if (check_timer_create(CLOCK_THREAD_CPUTIME_ID) < 0) - return -1; - - /* - * It's unfortunately hard to reliably test a timer expiration - * on parallel multithread cputime. We could arm it to expire - * on DELAY * nr_threads, with nr_threads busy looping, then wait - * the normal DELAY since the time is elapsing nr_threads faster. - * But for that we need to ensure we have real physical free CPUs - * to ensure true parallelism. So test only one thread until we - * find a better solution. - */ - if (check_timer_create(CLOCK_PROCESS_CPUTIME_ID) < 0) - return -1; - - return 0; -} diff --git a/user/Makefile b/user/Makefile deleted file mode 100644 index 396255b..0000000 --- a/user/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -# Makefile for user memory selftests - -# No binaries, but make sure arg-less "make" doesn't trigger "run_tests" -all: - -run_tests: all - @if /sbin/modprobe test_user_copy ; then \ - rmmod test_user_copy; \ - echo "user_copy: ok"; \ - else \ - echo "user_copy: [FAIL]"; \ - exit 1; \ - fi diff --git a/vm/.gitignore b/vm/.gitignore deleted file mode 100644 index ff1bb16..0000000 --- a/vm/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -hugepage-mmap -hugepage-shm -map_hugetlb -thuge-gen diff --git a/vm/Makefile b/vm/Makefile deleted file mode 100644 index 3f94e1a..0000000 --- a/vm/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -# Makefile for vm selftests - -CC = $(CROSS_COMPILE)gcc -CFLAGS = -Wall -BINARIES = hugepage-mmap hugepage-shm map_hugetlb thuge-gen hugetlbfstest - -all: $(BINARIES) -%: %.c - $(CC) $(CFLAGS) -o $@ $^ - -run_tests: all - @/bin/sh ./run_vmtests || (echo "vmtests: [FAIL]"; exit 1) - -clean: - $(RM) $(BINARIES) diff --git a/vm/hugepage-mmap.c b/vm/hugepage-mmap.c deleted file mode 100644 index a10f310..0000000 --- a/vm/hugepage-mmap.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * hugepage-mmap: - * - * Example of using huge page memory in a user application using the mmap - * system call. Before running this application, make sure that the - * administrator has mounted the hugetlbfs filesystem (on some directory - * like /mnt) using the command mount -t hugetlbfs nodev /mnt. In this - * example, the app is requesting memory of size 256MB that is backed by - * huge pages. - * - * For the ia64 architecture, the Linux kernel reserves Region number 4 for - * huge pages. That means that if one requires a fixed address, a huge page - * aligned address starting with 0x800000... will be required. If a fixed - * address is not required, the kernel will select an address in the proper - * range. - * Other architectures, such as ppc64, i386 or x86_64 are not so constrained. - */ - -#include <stdlib.h> -#include <stdio.h> -#include <unistd.h> -#include <sys/mman.h> -#include <fcntl.h> - -#define FILE_NAME "huge/hugepagefile" -#define LENGTH (256UL*1024*1024) -#define PROTECTION (PROT_READ | PROT_WRITE) - -/* Only ia64 requires this */ -#ifdef __ia64__ -#define ADDR (void *)(0x8000000000000000UL) -#define FLAGS (MAP_SHARED | MAP_FIXED) -#else -#define ADDR (void *)(0x0UL) -#define FLAGS (MAP_SHARED) -#endif - -static void check_bytes(char *addr) -{ - printf("First hex is %x\n", *((unsigned int *)addr)); -} - -static void write_bytes(char *addr) -{ - unsigned long i; - - for (i = 0; i < LENGTH; i++) - *(addr + i) = (char)i; -} - -static int read_bytes(char *addr) -{ - unsigned long i; - - check_bytes(addr); - for (i = 0; i < LENGTH; i++) - if (*(addr + i) != (char)i) { - printf("Mismatch at %lu\n", i); - return 1; - } - return 0; -} - -int main(void) -{ - void *addr; - int fd, ret; - - fd = open(FILE_NAME, O_CREAT | O_RDWR, 0755); - if (fd < 0) { - perror("Open failed"); - exit(1); - } - - addr = mmap(ADDR, LENGTH, PROTECTION, FLAGS, fd, 0); - if (addr == MAP_FAILED) { - perror("mmap"); - unlink(FILE_NAME); - exit(1); - } - - printf("Returned address is %p\n", addr); - check_bytes(addr); - write_bytes(addr); - ret = read_bytes(addr); - - munmap(addr, LENGTH); - close(fd); - unlink(FILE_NAME); - - return ret; -} diff --git a/vm/hugepage-shm.c b/vm/hugepage-shm.c deleted file mode 100644 index 0d0ef4f..0000000 --- a/vm/hugepage-shm.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * hugepage-shm: - * - * Example of using huge page memory in a user application using Sys V shared - * memory system calls. In this example the app is requesting 256MB of - * memory that is backed by huge pages. The application uses the flag - * SHM_HUGETLB in the shmget system call to inform the kernel that it is - * requesting huge pages. - * - * For the ia64 architecture, the Linux kernel reserves Region number 4 for - * huge pages. That means that if one requires a fixed address, a huge page - * aligned address starting with 0x800000... will be required. If a fixed - * address is not required, the kernel will select an address in the proper - * range. - * Other architectures, such as ppc64, i386 or x86_64 are not so constrained. - * - * Note: The default shared memory limit is quite low on many kernels, - * you may need to increase it via: - * - * echo 268435456 > /proc/sys/kernel/shmmax - * - * This will increase the maximum size per shared memory segment to 256MB. - * The other limit that you will hit eventually is shmall which is the - * total amount of shared memory in pages. To set it to 16GB on a system - * with a 4kB pagesize do: - * - * echo 4194304 > /proc/sys/kernel/shmall - */ - -#include <stdlib.h> -#include <stdio.h> -#include <sys/types.h> -#include <sys/ipc.h> -#include <sys/shm.h> -#include <sys/mman.h> - -#ifndef SHM_HUGETLB -#define SHM_HUGETLB 04000 -#endif - -#define LENGTH (256UL*1024*1024) - -#define dprintf(x) printf(x) - -/* Only ia64 requires this */ -#ifdef __ia64__ -#define ADDR (void *)(0x8000000000000000UL) -#define SHMAT_FLAGS (SHM_RND) -#else -#define ADDR (void *)(0x0UL) -#define SHMAT_FLAGS (0) -#endif - -int main(void) -{ - int shmid; - unsigned long i; - char *shmaddr; - - shmid = shmget(2, LENGTH, SHM_HUGETLB | IPC_CREAT | SHM_R | SHM_W); - if (shmid < 0) { - perror("shmget"); - exit(1); - } - printf("shmid: 0x%x\n", shmid); - - shmaddr = shmat(shmid, ADDR, SHMAT_FLAGS); - if (shmaddr == (char *)-1) { - perror("Shared memory attach failure"); - shmctl(shmid, IPC_RMID, NULL); - exit(2); - } - printf("shmaddr: %p\n", shmaddr); - - dprintf("Starting the writes:\n"); - for (i = 0; i < LENGTH; i++) { - shmaddr[i] = (char)(i); - if (!(i % (1024 * 1024))) - dprintf("."); - } - dprintf("\n"); - - dprintf("Starting the Check..."); - for (i = 0; i < LENGTH; 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(4); - } - - shmctl(shmid, IPC_RMID, NULL); - - return 0; -} diff --git a/vm/hugetlbfstest.c b/vm/hugetlbfstest.c deleted file mode 100644 index ea40ff8..0000000 --- a/vm/hugetlbfstest.c +++ /dev/null @@ -1,84 +0,0 @@ -#define _GNU_SOURCE -#include <assert.h> -#include <fcntl.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/mman.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <unistd.h> - -typedef unsigned long long u64; - -static size_t length = 1 << 24; - -static u64 read_rss(void) -{ - char buf[4096], *s = buf; - int i, fd; - u64 rss; - - fd = open("/proc/self/statm", O_RDONLY); - assert(fd > 2); - memset(buf, 0, sizeof(buf)); - read(fd, buf, sizeof(buf) - 1); - for (i = 0; i < 1; i++) - s = strchr(s, ' ') + 1; - rss = strtoull(s, NULL, 10); - return rss << 12; /* assumes 4k pagesize */ -} - -static void do_mmap(int fd, int extra_flags, int unmap) -{ - int *p; - int flags = MAP_PRIVATE | MAP_POPULATE | extra_flags; - u64 before, after; - - before = read_rss(); - p = mmap(NULL, length, PROT_READ | PROT_WRITE, flags, fd, 0); - assert(p != MAP_FAILED || - !"mmap returned an unexpected error"); - after = read_rss(); - assert(llabs(after - before - length) < 0x40000 || - !"rss didn't grow as expected"); - if (!unmap) - return; - munmap(p, length); - after = read_rss(); - assert(llabs(after - before) < 0x40000 || - !"rss didn't shrink as expected"); -} - -static int open_file(const char *path) -{ - int fd, err; - - unlink(path); - fd = open(path, O_CREAT | O_RDWR | O_TRUNC | O_EXCL - | O_LARGEFILE | O_CLOEXEC, 0600); - assert(fd > 2); - unlink(path); - err = ftruncate(fd, length); - assert(!err); - return fd; -} - -int main(void) -{ - int hugefd, fd; - - fd = open_file("/dev/shm/hugetlbhog"); - hugefd = open_file("/hugepages/hugetlbhog"); - - system("echo 100 > /proc/sys/vm/nr_hugepages"); - do_mmap(-1, MAP_ANONYMOUS, 1); - do_mmap(fd, 0, 1); - do_mmap(-1, MAP_ANONYMOUS | MAP_HUGETLB, 1); - do_mmap(hugefd, 0, 1); - do_mmap(hugefd, MAP_HUGETLB, 1); - /* Leak the last one to test do_exit() */ - do_mmap(-1, MAP_ANONYMOUS | MAP_HUGETLB, 0); - printf("oll korrekt.\n"); - return 0; -} diff --git a/vm/map_hugetlb.c b/vm/map_hugetlb.c deleted file mode 100644 index ac56639..0000000 --- a/vm/map_hugetlb.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Example of using hugepage memory in a user application using the mmap - * system call with MAP_HUGETLB flag. Before running this program make - * sure the administrator has allocated enough default sized huge pages - * to cover the 256 MB allocation. - * - * For ia64 architecture, Linux kernel reserves Region number 4 for hugepages. - * That means the addresses starting with 0x800000... will need to be - * specified. Specifying a fixed address is not required on ppc64, i386 - * or x86_64. - */ -#include <stdlib.h> -#include <stdio.h> -#include <unistd.h> -#include <sys/mman.h> -#include <fcntl.h> - -#define LENGTH (256UL*1024*1024) -#define PROTECTION (PROT_READ | PROT_WRITE) - -#ifndef MAP_HUGETLB -#define MAP_HUGETLB 0x40000 /* arch specific */ -#endif - -/* Only ia64 requires this */ -#ifdef __ia64__ -#define ADDR (void *)(0x8000000000000000UL) -#define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_FIXED) -#else -#define ADDR (void *)(0x0UL) -#define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB) -#endif - -static void check_bytes(char *addr) -{ - printf("First hex is %x\n", *((unsigned int *)addr)); -} - -static void write_bytes(char *addr) -{ - unsigned long i; - - for (i = 0; i < LENGTH; i++) - *(addr + i) = (char)i; -} - -static int read_bytes(char *addr) -{ - unsigned long i; - - check_bytes(addr); - for (i = 0; i < LENGTH; i++) - if (*(addr + i) != (char)i) { - printf("Mismatch at %lu\n", i); - return 1; - } - return 0; -} - -int main(void) -{ - void *addr; - int ret; - - addr = mmap(ADDR, LENGTH, PROTECTION, FLAGS, 0, 0); - if (addr == MAP_FAILED) { - perror("mmap"); - exit(1); - } - - printf("Returned address is %p\n", addr); - check_bytes(addr); - write_bytes(addr); - ret = read_bytes(addr); - - munmap(addr, LENGTH); - - return ret; -} diff --git a/vm/run_vmtests b/vm/run_vmtests deleted file mode 100644 index c87b681..0000000 --- a/vm/run_vmtests +++ /dev/null @@ -1,93 +0,0 @@ -#!/bin/bash -#please run as root - -#we need 256M, below is the size in kB -needmem=262144 -mnt=./huge -exitcode=0 - -#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 "running hugepage-mmap" -echo "--------------------" -./hugepage-mmap -if [ $? -ne 0 ]; then - echo "[FAIL]" - exitcode=1 -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 "running hugepage-shm" -echo "--------------------" -./hugepage-shm -if [ $? -ne 0 ]; then - echo "[FAIL]" - exitcode=1 -else - echo "[PASS]" -fi -echo $shmmax > /proc/sys/kernel/shmmax -echo $shmall > /proc/sys/kernel/shmall - -echo "--------------------" -echo "running map_hugetlb" -echo "--------------------" -./map_hugetlb -if [ $? -ne 0 ]; then - echo "[FAIL]" - exitcode=1 -else - echo "[PASS]" -fi - -echo "--------------------" -echo "running hugetlbfstest" -echo "--------------------" -./hugetlbfstest -if [ $? -ne 0 ]; then - echo "[FAIL]" - exitcode=1 -else - echo "[PASS]" -fi - -#cleanup -umount $mnt -rm -rf $mnt -echo $nr_hugepgs > /proc/sys/vm/nr_hugepages -exit $exitcode diff --git a/vm/thuge-gen.c b/vm/thuge-gen.c deleted file mode 100644 index c879572..0000000 --- a/vm/thuge-gen.c +++ /dev/null @@ -1,254 +0,0 @@ -/* Test selecting other page sizes for mmap/shmget. - - Before running this huge pages for each huge page size must have been - reserved. - For large pages beyond MAX_ORDER (like 1GB on x86) boot options must be used. - Also shmmax must be increased. - And you need to run as root to work around some weird permissions in shm. - And nothing using huge pages should run in parallel. - When the program aborts you may need to clean up the shm segments with - ipcrm -m by hand, like this - sudo ipcs | awk '$1 == "0x00000000" {print $2}' | xargs -n1 sudo ipcrm -m - (warning this will remove all if someone else uses them) */ - -#define _GNU_SOURCE 1 -#include <sys/mman.h> -#include <stdlib.h> -#include <stdio.h> -#include <sys/ipc.h> -#include <sys/shm.h> -#include <sys/stat.h> -#include <glob.h> -#include <assert.h> -#include <unistd.h> -#include <stdarg.h> -#include <string.h> - -#define err(x) perror(x), exit(1) - -#define MAP_HUGE_2MB (21 << MAP_HUGE_SHIFT) -#define MAP_HUGE_1GB (30 << MAP_HUGE_SHIFT) -#define MAP_HUGE_SHIFT 26 -#define MAP_HUGE_MASK 0x3f -#define MAP_HUGETLB 0x40000 - -#define SHM_HUGETLB 04000 /* segment will use huge TLB pages */ -#define SHM_HUGE_SHIFT 26 -#define SHM_HUGE_MASK 0x3f -#define SHM_HUGE_2MB (21 << SHM_HUGE_SHIFT) -#define SHM_HUGE_1GB (30 << SHM_HUGE_SHIFT) - -#define NUM_PAGESIZES 5 - -#define NUM_PAGES 4 - -#define Dprintf(fmt...) // printf(fmt) - -unsigned long page_sizes[NUM_PAGESIZES]; -int num_page_sizes; - -int ilog2(unsigned long v) -{ - int l = 0; - while ((1UL << l) < v) - l++; - return l; -} - -void find_pagesizes(void) -{ - glob_t g; - int i; - glob("/sys/kernel/mm/hugepages/hugepages-*kB", 0, NULL, &g); - assert(g.gl_pathc <= NUM_PAGESIZES); - for (i = 0; i < g.gl_pathc; i++) { - sscanf(g.gl_pathv[i], "/sys/kernel/mm/hugepages/hugepages-%lukB", - &page_sizes[i]); - page_sizes[i] <<= 10; - printf("Found %luMB\n", page_sizes[i] >> 20); - } - num_page_sizes = g.gl_pathc; - globfree(&g); -} - -unsigned long default_huge_page_size(void) -{ - unsigned long hps = 0; - char *line = NULL; - size_t linelen = 0; - FILE *f = fopen("/proc/meminfo", "r"); - if (!f) - return 0; - while (getline(&line, &linelen, f) > 0) { - if (sscanf(line, "Hugepagesize: %lu kB", &hps) == 1) { - hps <<= 10; - break; - } - } - free(line); - return hps; -} - -void show(unsigned long ps) -{ - char buf[100]; - if (ps == getpagesize()) - return; - printf("%luMB: ", ps >> 20); - fflush(stdout); - snprintf(buf, sizeof buf, - "cat /sys/kernel/mm/hugepages/hugepages-%lukB/free_hugepages", - ps >> 10); - system(buf); -} - -unsigned long read_sysfs(int warn, char *fmt, ...) -{ - char *line = NULL; - size_t linelen = 0; - char buf[100]; - FILE *f; - va_list ap; - unsigned long val = 0; - - va_start(ap, fmt); - vsnprintf(buf, sizeof buf, fmt, ap); - va_end(ap); - - f = fopen(buf, "r"); - if (!f) { - if (warn) - printf("missing %s\n", buf); - return 0; - } - if (getline(&line, &linelen, f) > 0) { - sscanf(line, "%lu", &val); - } - fclose(f); - free(line); - return val; -} - -unsigned long read_free(unsigned long ps) -{ - return read_sysfs(ps != getpagesize(), - "/sys/kernel/mm/hugepages/hugepages-%lukB/free_hugepages", - ps >> 10); -} - -void test_mmap(unsigned long size, unsigned flags) -{ - char *map; - unsigned long before, after; - int err; - - before = read_free(size); - map = mmap(NULL, size*NUM_PAGES, PROT_READ|PROT_WRITE, - MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB|flags, 0, 0); - - if (map == (char *)-1) err("mmap"); - memset(map, 0xff, size*NUM_PAGES); - after = read_free(size); - Dprintf("before %lu after %lu diff %ld size %lu\n", - before, after, before - after, size); - assert(size == getpagesize() || (before - after) == NUM_PAGES); - show(size); - err = munmap(map, size); - assert(!err); -} - -void test_shmget(unsigned long size, unsigned flags) -{ - int id; - unsigned long before, after; - int err; - - before = read_free(size); - id = shmget(IPC_PRIVATE, size * NUM_PAGES, IPC_CREAT|0600|flags); - if (id < 0) err("shmget"); - - struct shm_info i; - if (shmctl(id, SHM_INFO, (void *)&i) < 0) err("shmctl"); - Dprintf("alloc %lu res %lu\n", i.shm_tot, i.shm_rss); - - - Dprintf("id %d\n", id); - char *map = shmat(id, NULL, 0600); - if (map == (char*)-1) err("shmat"); - - shmctl(id, IPC_RMID, NULL); - - memset(map, 0xff, size*NUM_PAGES); - after = read_free(size); - - Dprintf("before %lu after %lu diff %ld size %lu\n", - before, after, before - after, size); - assert(size == getpagesize() || (before - after) == NUM_PAGES); - show(size); - err = shmdt(map); - assert(!err); -} - -void sanity_checks(void) -{ - int i; - unsigned long largest = getpagesize(); - - for (i = 0; i < num_page_sizes; i++) { - if (page_sizes[i] > largest) - largest = page_sizes[i]; - - if (read_free(page_sizes[i]) < NUM_PAGES) { - printf("Not enough huge pages for page size %lu MB, need %u\n", - page_sizes[i] >> 20, - NUM_PAGES); - exit(0); - } - } - - if (read_sysfs(0, "/proc/sys/kernel/shmmax") < NUM_PAGES * largest) { - printf("Please do echo %lu > /proc/sys/kernel/shmmax", largest * NUM_PAGES); - exit(0); - } - -#if defined(__x86_64__) - if (largest != 1U<<30) { - printf("No GB pages available on x86-64\n" - "Please boot with hugepagesz=1G hugepages=%d\n", NUM_PAGES); - exit(0); - } -#endif -} - -int main(void) -{ - int i; - unsigned default_hps = default_huge_page_size(); - - find_pagesizes(); - - sanity_checks(); - - for (i = 0; i < num_page_sizes; i++) { - unsigned long ps = page_sizes[i]; - int arg = ilog2(ps) << MAP_HUGE_SHIFT; - printf("Testing %luMB mmap with shift %x\n", ps >> 20, arg); - test_mmap(ps, MAP_HUGETLB | arg); - } - printf("Testing default huge mmap\n"); - test_mmap(default_hps, SHM_HUGETLB); - - puts("Testing non-huge shmget"); - test_shmget(getpagesize(), 0); - - for (i = 0; i < num_page_sizes; i++) { - unsigned long ps = page_sizes[i]; - int arg = ilog2(ps) << SHM_HUGE_SHIFT; - printf("Testing %luMB shmget with shift %x\n", ps >> 20, arg); - test_shmget(ps, SHM_HUGETLB | arg); - } - puts("default huge shmget"); - test_shmget(default_hps, SHM_HUGETLB); - - return 0; -} |