summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilosz Wasilewski <milosz.wasilewski@hackbox.linaro.org>2014-10-02 10:16:33 +0100
committerMilosz Wasilewski <milosz.wasilewski@hackbox.linaro.org>2014-10-02 10:16:33 +0100
commit24689e01d37605141ce768d94a94f0be3421049d (patch)
treeb2ac61c7572a4bbb49aa5c871fe6f3fd68436db1
parente14eb051ff73ab8692770762adf44045ba092398 (diff)
-rw-r--r--Makefile21
-rw-r--r--README.txt27
-rw-r--r--cpu-hotplug/Makefile5
-rw-r--r--cpu-hotplug/on-off-test.sh52
-rw-r--r--firmware/Makefile27
-rw-r--r--firmware/fw_filesystem.sh62
-rw-r--r--firmware/fw_userhelper.sh89
-rw-r--r--ipc/Makefile6
-rw-r--r--ipc/msgque.c5
-rw-r--r--kcmp/Makefile6
-rw-r--r--kcmp/kcmp_test.c2
-rw-r--r--memfd/.gitignore4
-rw-r--r--memfd/Makefile41
-rw-r--r--memfd/fuse_mnt.c110
-rw-r--r--memfd/fuse_test.c311
-rw-r--r--memfd/memfd_test.c913
-rw-r--r--memfd/run_fuse_test.sh14
-rw-r--r--memory-hotplug/Makefile5
-rw-r--r--memory-hotplug/on-off-test.sh8
-rw-r--r--mqueue/Makefile4
-rw-r--r--mqueue/mq_open_tests.c20
-rw-r--r--mqueue/mq_perf_tests.c40
-rw-r--r--net/Makefile8
-rw-r--r--powerpc/Makefile12
-rw-r--r--powerpc/copyloops/Makefile29
-rw-r--r--powerpc/copyloops/asm/ppc_asm.h89
-rw-r--r--powerpc/copyloops/asm/processor.h0
l---------powerpc/copyloops/copyuser_64.S1
l---------powerpc/copyloops/copyuser_power7.S1
l---------powerpc/copyloops/memcpy_64.S1
l---------powerpc/copyloops/memcpy_power7.S1
-rw-r--r--powerpc/copyloops/validate.c99
-rw-r--r--powerpc/harness.c15
-rw-r--r--powerpc/mm/Makefile18
-rw-r--r--powerpc/mm/hugetlb_vs_thp_test.c72
-rw-r--r--powerpc/pmu/Makefile27
-rw-r--r--powerpc/pmu/count_instructions.c30
-rw-r--r--powerpc/pmu/ebb/Makefile33
-rw-r--r--powerpc/pmu/ebb/back_to_back_ebbs_test.c106
-rw-r--r--powerpc/pmu/ebb/busy_loop.S271
-rw-r--r--powerpc/pmu/ebb/close_clears_pmcc_test.c59
-rw-r--r--powerpc/pmu/ebb/cpu_event_pinned_vs_ebb_test.c93
-rw-r--r--powerpc/pmu/ebb/cpu_event_vs_ebb_test.c89
-rw-r--r--powerpc/pmu/ebb/cycles_test.c58
-rw-r--r--powerpc/pmu/ebb/cycles_with_freeze_test.c117
-rw-r--r--powerpc/pmu/ebb/cycles_with_mmcr2_test.c91
-rw-r--r--powerpc/pmu/ebb/ebb.c478
-rw-r--r--powerpc/pmu/ebb/ebb.h77
-rw-r--r--powerpc/pmu/ebb/ebb_handler.S365
-rw-r--r--powerpc/pmu/ebb/ebb_on_child_test.c86
-rw-r--r--powerpc/pmu/ebb/ebb_on_willing_child_test.c92
-rw-r--r--powerpc/pmu/ebb/ebb_vs_cpu_event_test.c86
-rw-r--r--powerpc/pmu/ebb/event_attributes_test.c131
-rw-r--r--powerpc/pmu/ebb/fixed_instruction_loop.S43
-rw-r--r--powerpc/pmu/ebb/fork_cleanup_test.c79
-rw-r--r--powerpc/pmu/ebb/instruction_count_test.c164
-rw-r--r--powerpc/pmu/ebb/lost_exception_test.c100
-rw-r--r--powerpc/pmu/ebb/multi_counter_test.c91
-rw-r--r--powerpc/pmu/ebb/multi_ebb_procs_test.c109
-rw-r--r--powerpc/pmu/ebb/no_handler_test.c61
-rw-r--r--powerpc/pmu/ebb/pmae_handling_test.c106
-rw-r--r--powerpc/pmu/ebb/pmc56_overflow_test.c93
-rw-r--r--powerpc/pmu/ebb/reg.h49
-rw-r--r--powerpc/pmu/ebb/reg_access_test.c39
-rw-r--r--powerpc/pmu/ebb/task_event_pinned_vs_ebb_test.c91
-rw-r--r--powerpc/pmu/ebb/task_event_vs_ebb_test.c83
-rw-r--r--powerpc/pmu/ebb/trace.c300
-rw-r--r--powerpc/pmu/ebb/trace.h41
-rw-r--r--powerpc/pmu/event.c26
-rw-r--r--powerpc/pmu/event.h4
-rw-r--r--powerpc/pmu/l3_bank_test.c48
-rw-r--r--powerpc/pmu/lib.c300
-rw-r--r--powerpc/pmu/lib.h42
-rw-r--r--powerpc/pmu/loop.S73
-rw-r--r--powerpc/pmu/per_event_excludes.c114
-rw-r--r--powerpc/subunit.h5
-rw-r--r--powerpc/tm/Makefile15
-rw-r--r--powerpc/tm/tm-resched-dscr.c98
-rw-r--r--powerpc/utils.h15
-rw-r--r--ptrace/peeksiginfo.c4
-rwxr-xr-xrcutorture/bin/configinit.sh2
-rw-r--r--rcutorture/bin/functions.sh49
-rwxr-xr-xrcutorture/bin/kvm-build.sh6
-rwxr-xr-xrcutorture/bin/kvm-recheck-lock.sh51
-rwxr-xr-xrcutorture/bin/kvm-recheck-rcu.sh51
-rwxr-xr-xrcutorture/bin/kvm-recheck.sh43
-rwxr-xr-xrcutorture/bin/kvm-test-1-rcu.sh (renamed from rcutorture/bin/kvm-test-1-run.sh)103
-rw-r--r--rcutorture/bin/kvm.sh321
-rwxr-xr-xrcutorture/bin/parse-rcutorture.sh (renamed from rcutorture/bin/parse-torture.sh)22
-rw-r--r--rcutorture/configs/CFLIST (renamed from rcutorture/configs/rcu/CFLIST)0
-rw-r--r--rcutorture/configs/SRCU-N (renamed from rcutorture/configs/rcu/SRCU-N)3
-rw-r--r--rcutorture/configs/SRCU-N.boot (renamed from rcutorture/configs/rcu/SRCU-N.boot)0
-rw-r--r--rcutorture/configs/SRCU-P (renamed from rcutorture/configs/rcu/SRCU-P)1
-rw-r--r--rcutorture/configs/SRCU-P.boot (renamed from rcutorture/configs/rcu/SRCU-P.boot)0
-rw-r--r--rcutorture/configs/TINY01 (renamed from rcutorture/configs/rcu/TINY01)1
-rw-r--r--rcutorture/configs/TINY02 (renamed from rcutorture/configs/rcu/TINY02)1
-rw-r--r--rcutorture/configs/TREE01 (renamed from rcutorture/configs/rcu/TREE01)2
-rw-r--r--rcutorture/configs/TREE01.boot (renamed from rcutorture/configs/rcu/TREE01.boot)0
-rw-r--r--rcutorture/configs/TREE02 (renamed from rcutorture/configs/rcu/TREE02)4
-rw-r--r--rcutorture/configs/TREE03 (renamed from rcutorture/configs/rcu/TREE03)2
-rw-r--r--rcutorture/configs/TREE04 (renamed from rcutorture/configs/rcu/TREE04)2
-rw-r--r--rcutorture/configs/TREE04.boot (renamed from rcutorture/configs/rcu/TREE04.boot)0
-rw-r--r--rcutorture/configs/TREE05 (renamed from rcutorture/configs/rcu/TREE05)2
-rw-r--r--rcutorture/configs/TREE05.boot (renamed from rcutorture/configs/rcu/TREE05.boot)0
-rw-r--r--rcutorture/configs/TREE06 (renamed from rcutorture/configs/rcu/TREE06)2
-rw-r--r--rcutorture/configs/TREE07 (renamed from rcutorture/configs/rcu/TREE07)2
-rw-r--r--rcutorture/configs/TREE08 (renamed from rcutorture/configs/rcu/TREE08)2
-rw-r--r--rcutorture/configs/TREE08-T (renamed from rcutorture/configs/rcu/TREE08-T)2
-rw-r--r--rcutorture/configs/TREE09 (renamed from rcutorture/configs/rcu/TREE09)2
-rw-r--r--rcutorture/configs/lock/BUSTED6
-rw-r--r--rcutorture/configs/lock/BUSTED.boot1
-rw-r--r--rcutorture/configs/lock/CFLIST1
-rw-r--r--rcutorture/configs/lock/CFcommon2
-rw-r--r--rcutorture/configs/lock/LOCK016
-rw-r--r--rcutorture/configs/lock/ver_functions.sh43
-rw-r--r--rcutorture/configs/rcu/BUSTED7
-rw-r--r--rcutorture/configs/rcu/BUSTED.boot1
-rw-r--r--rcutorture/configs/rcu/CFcommon2
-rw-r--r--rcutorture/configs/rcu/TREE02-T24
-rw-r--r--rcutorture/configs/rcu/TREE08.boot1
-rw-r--r--rcutorture/configs/v0.0/CFLIST (renamed from rcutorture/configs/rcu/v0.0/CFLIST)0
-rw-r--r--rcutorture/configs/v0.0/N1-S-T-NH-SD-SMP-HP (renamed from rcutorture/configs/rcu/v0.0/N1-S-T-NH-SD-SMP-HP)0
-rw-r--r--rcutorture/configs/v0.0/N2-2-t-nh-sd-SMP-hp (renamed from rcutorture/configs/rcu/v0.0/N2-2-t-nh-sd-SMP-hp)0
-rw-r--r--rcutorture/configs/v0.0/N3-3-T-nh-SD-SMP-hp (renamed from rcutorture/configs/rcu/v0.0/N3-3-T-nh-SD-SMP-hp)0
-rw-r--r--rcutorture/configs/v0.0/N4-A-t-NH-sd-SMP-HP (renamed from rcutorture/configs/rcu/v0.0/N4-A-t-NH-sd-SMP-HP)0
-rw-r--r--rcutorture/configs/v0.0/N5-U-T-NH-sd-SMP-hp (renamed from rcutorture/configs/rcu/v0.0/N5-U-T-NH-sd-SMP-hp)0
-rw-r--r--rcutorture/configs/v0.0/NT1-nh (renamed from rcutorture/configs/rcu/v0.0/NT1-nh)0
-rw-r--r--rcutorture/configs/v0.0/NT3-NH (renamed from rcutorture/configs/rcu/v0.0/NT3-NH)0
-rw-r--r--rcutorture/configs/v0.0/P1-S-T-NH-SD-SMP-HP (renamed from rcutorture/configs/rcu/v0.0/P1-S-T-NH-SD-SMP-HP)0
-rw-r--r--rcutorture/configs/v0.0/P2-2-t-nh-sd-SMP-hp (renamed from rcutorture/configs/rcu/v0.0/P2-2-t-nh-sd-SMP-hp)0
-rw-r--r--rcutorture/configs/v0.0/P3-3-T-nh-SD-SMP-hp (renamed from rcutorture/configs/rcu/v0.0/P3-3-T-nh-SD-SMP-hp)0
-rw-r--r--rcutorture/configs/v0.0/P4-A-t-NH-sd-SMP-HP (renamed from rcutorture/configs/rcu/v0.0/P4-A-t-NH-sd-SMP-HP)0
-rw-r--r--rcutorture/configs/v0.0/P5-U-T-NH-sd-SMP-hp (renamed from rcutorture/configs/rcu/v3.12/P5-U-T-NH-sd-SMP-hp)1
-rw-r--r--rcutorture/configs/v0.0/PT1-nh (renamed from rcutorture/configs/rcu/v0.0/PT1-nh)0
-rw-r--r--rcutorture/configs/v0.0/PT2-NH (renamed from rcutorture/configs/rcu/v0.0/PT2-NH)0
-rw-r--r--rcutorture/configs/v0.0/ver_functions.sh (renamed from rcutorture/configs/rcu/v0.0/ver_functions.sh)22
-rw-r--r--rcutorture/configs/v3.12/CFLIST (renamed from rcutorture/configs/rcu/v3.12/CFLIST)0
-rw-r--r--rcutorture/configs/v3.12/N1-S-T-NH-SD-SMP-HP (renamed from rcutorture/configs/rcu/v3.12/N1-S-T-NH-SD-SMP-HP)0
-rw-r--r--rcutorture/configs/v3.12/N2-2-t-nh-sd-SMP-hp (renamed from rcutorture/configs/rcu/v3.12/N2-2-t-nh-sd-SMP-hp)0
-rw-r--r--rcutorture/configs/v3.12/N3-3-T-nh-SD-SMP-hp (renamed from rcutorture/configs/rcu/v3.12/N3-3-T-nh-SD-SMP-hp)0
-rw-r--r--rcutorture/configs/v3.12/N4-A-t-NH-sd-SMP-HP (renamed from rcutorture/configs/rcu/v3.12/N4-A-t-NH-sd-SMP-HP)0
-rw-r--r--rcutorture/configs/v3.12/N5-U-T-NH-sd-SMP-hp (renamed from rcutorture/configs/rcu/v3.12/N5-U-T-NH-sd-SMP-hp)0
-rw-r--r--rcutorture/configs/v3.12/N6---t-nh-SD-smp-hp (renamed from rcutorture/configs/rcu/v3.12/N6---t-nh-SD-smp-hp)0
-rw-r--r--rcutorture/configs/v3.12/N7-4-T-NH-SD-SMP-HP (renamed from rcutorture/configs/rcu/v3.12/N7-4-T-NH-SD-SMP-HP)0
-rw-r--r--rcutorture/configs/v3.12/N8-2-T-NH-SD-SMP-HP (renamed from rcutorture/configs/rcu/v3.12/N8-2-T-NH-SD-SMP-HP)0
-rw-r--r--rcutorture/configs/v3.12/NT1-nh (renamed from rcutorture/configs/rcu/v3.12/NT1-nh)0
-rw-r--r--rcutorture/configs/v3.12/NT3-NH (renamed from rcutorture/configs/rcu/v3.12/NT3-NH)0
-rw-r--r--rcutorture/configs/v3.12/P1-S-T-NH-SD-SMP-HP (renamed from rcutorture/configs/rcu/v3.12/P1-S-T-NH-SD-SMP-HP)0
-rw-r--r--rcutorture/configs/v3.12/P2-2-t-nh-sd-SMP-hp (renamed from rcutorture/configs/rcu/v3.12/P2-2-t-nh-sd-SMP-hp)0
-rw-r--r--rcutorture/configs/v3.12/P3-3-T-nh-SD-SMP-hp (renamed from rcutorture/configs/rcu/v3.12/P3-3-T-nh-SD-SMP-hp)0
-rw-r--r--rcutorture/configs/v3.12/P4-A-t-NH-sd-SMP-HP (renamed from rcutorture/configs/rcu/v3.12/P4-A-t-NH-sd-SMP-HP)0
-rw-r--r--rcutorture/configs/v3.12/P5-U-T-NH-sd-SMP-hp (renamed from rcutorture/configs/rcu/v3.5/P5-U-T-NH-sd-SMP-hp)1
-rw-r--r--rcutorture/configs/v3.12/P6---t-nh-SD-smp-hp (renamed from rcutorture/configs/rcu/v3.12/P6---t-nh-SD-smp-hp)0
-rw-r--r--rcutorture/configs/v3.12/P7-4-T-NH-SD-SMP-HP (renamed from rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-HP)0
-rw-r--r--rcutorture/configs/v3.12/P7-4-T-NH-SD-SMP-HP-all (renamed from rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-HP-all)0
-rw-r--r--rcutorture/configs/v3.12/P7-4-T-NH-SD-SMP-HP-none (renamed from rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-HP-none)0
-rw-r--r--rcutorture/configs/v3.12/P7-4-T-NH-SD-SMP-hp (renamed from rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-hp)0
-rw-r--r--rcutorture/configs/v3.12/PT1-nh (renamed from rcutorture/configs/rcu/v3.12/PT1-nh)0
-rw-r--r--rcutorture/configs/v3.12/PT2-NH (renamed from rcutorture/configs/rcu/v3.12/PT2-NH)0
-rw-r--r--rcutorture/configs/v3.3/CFLIST (renamed from rcutorture/configs/rcu/v3.3/CFLIST)0
-rw-r--r--rcutorture/configs/v3.3/N1-S-T-NH-SD-SMP-HP (renamed from rcutorture/configs/rcu/v3.3/N1-S-T-NH-SD-SMP-HP)0
-rw-r--r--rcutorture/configs/v3.3/N2-2-t-nh-sd-SMP-hp (renamed from rcutorture/configs/rcu/v3.3/N2-2-t-nh-sd-SMP-hp)0
-rw-r--r--rcutorture/configs/v3.3/N3-3-T-nh-SD-SMP-hp (renamed from rcutorture/configs/rcu/v3.3/N3-3-T-nh-SD-SMP-hp)0
-rw-r--r--rcutorture/configs/v3.3/N4-A-t-NH-sd-SMP-HP (renamed from rcutorture/configs/rcu/v3.3/N4-A-t-NH-sd-SMP-HP)0
-rw-r--r--rcutorture/configs/v3.3/N5-U-T-NH-sd-SMP-hp (renamed from rcutorture/configs/rcu/v3.3/N5-U-T-NH-sd-SMP-hp)0
-rw-r--r--rcutorture/configs/v3.3/NT1-nh (renamed from rcutorture/configs/rcu/v3.3/NT1-nh)0
-rw-r--r--rcutorture/configs/v3.3/NT3-NH (renamed from rcutorture/configs/rcu/v3.3/NT3-NH)0
-rw-r--r--rcutorture/configs/v3.3/P1-S-T-NH-SD-SMP-HP (renamed from rcutorture/configs/rcu/v3.3/P1-S-T-NH-SD-SMP-HP)0
-rw-r--r--rcutorture/configs/v3.3/P2-2-t-nh-sd-SMP-hp (renamed from rcutorture/configs/rcu/v3.3/P2-2-t-nh-sd-SMP-hp)0
-rw-r--r--rcutorture/configs/v3.3/P3-3-T-nh-SD-SMP-hp (renamed from rcutorture/configs/rcu/v3.3/P3-3-T-nh-SD-SMP-hp)0
-rw-r--r--rcutorture/configs/v3.3/P4-A-t-NH-sd-SMP-HP (renamed from rcutorture/configs/rcu/v3.3/P4-A-t-NH-sd-SMP-HP)0
-rw-r--r--rcutorture/configs/v3.3/P5-U-T-NH-sd-SMP-hp (renamed from rcutorture/configs/rcu/v3.3/P5-U-T-NH-sd-SMP-hp)1
-rw-r--r--rcutorture/configs/v3.3/PT1-nh (renamed from rcutorture/configs/rcu/v3.3/PT1-nh)0
-rw-r--r--rcutorture/configs/v3.3/PT2-NH (renamed from rcutorture/configs/rcu/v3.3/PT2-NH)0
-rw-r--r--rcutorture/configs/v3.3/ver_functions.sh (renamed from rcutorture/configs/rcu/ver_functions.sh)26
-rw-r--r--rcutorture/configs/v3.5/CFLIST (renamed from rcutorture/configs/rcu/v3.5/CFLIST)0
-rw-r--r--rcutorture/configs/v3.5/N1-S-T-NH-SD-SMP-HP (renamed from rcutorture/configs/rcu/v3.5/N1-S-T-NH-SD-SMP-HP)0
-rw-r--r--rcutorture/configs/v3.5/N2-2-t-nh-sd-SMP-hp (renamed from rcutorture/configs/rcu/v3.5/N2-2-t-nh-sd-SMP-hp)0
-rw-r--r--rcutorture/configs/v3.5/N3-3-T-nh-SD-SMP-hp (renamed from rcutorture/configs/rcu/v3.5/N3-3-T-nh-SD-SMP-hp)0
-rw-r--r--rcutorture/configs/v3.5/N4-A-t-NH-sd-SMP-HP (renamed from rcutorture/configs/rcu/v3.5/N4-A-t-NH-sd-SMP-HP)0
-rw-r--r--rcutorture/configs/v3.5/N5-U-T-NH-sd-SMP-hp (renamed from rcutorture/configs/rcu/v3.5/N5-U-T-NH-sd-SMP-hp)0
-rw-r--r--rcutorture/configs/v3.5/NT1-nh (renamed from rcutorture/configs/rcu/v3.5/NT1-nh)0
-rw-r--r--rcutorture/configs/v3.5/NT3-NH (renamed from rcutorture/configs/rcu/v3.5/NT3-NH)0
-rw-r--r--rcutorture/configs/v3.5/P1-S-T-NH-SD-SMP-HP (renamed from rcutorture/configs/rcu/v3.5/P1-S-T-NH-SD-SMP-HP)0
-rw-r--r--rcutorture/configs/v3.5/P2-2-t-nh-sd-SMP-hp (renamed from rcutorture/configs/rcu/v3.5/P2-2-t-nh-sd-SMP-hp)0
-rw-r--r--rcutorture/configs/v3.5/P3-3-T-nh-SD-SMP-hp (renamed from rcutorture/configs/rcu/v3.5/P3-3-T-nh-SD-SMP-hp)0
-rw-r--r--rcutorture/configs/v3.5/P4-A-t-NH-sd-SMP-HP (renamed from rcutorture/configs/rcu/v3.5/P4-A-t-NH-sd-SMP-HP)0
-rw-r--r--rcutorture/configs/v3.5/P5-U-T-NH-sd-SMP-hp (renamed from rcutorture/configs/rcu/v0.0/P5-U-T-NH-sd-SMP-hp)1
-rw-r--r--rcutorture/configs/v3.5/PT1-nh (renamed from rcutorture/configs/rcu/v3.5/PT1-nh)0
-rw-r--r--rcutorture/configs/v3.5/PT2-NH (renamed from rcutorture/configs/rcu/v3.5/PT2-NH)0
-rw-r--r--rcutorture/configs/v3.5/ver_functions.sh (renamed from rcutorture/configs/rcu/v3.5/ver_functions.sh)23
-rw-r--r--rcutorture/configs/ver_functions.sh (renamed from rcutorture/configs/rcu/v3.3/ver_functions.sh)28
-rw-r--r--rcutorture/doc/TREE_RCU-Kconfig.txt (renamed from rcutorture/doc/TREE_RCU-kconfig.txt)1
-rw-r--r--sysctl/Makefile19
-rw-r--r--sysctl/common_tests109
-rw-r--r--sysctl/run_numerictests10
-rw-r--r--sysctl/run_stringtests77
197 files changed, 303 insertions, 7386 deletions
diff --git a/Makefile b/Makefile
index 36ff2e4..3d5979b 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,6 @@ TARGETS = breakpoints
TARGETS += cpu-hotplug
TARGETS += efivarfs
TARGETS += kcmp
-TARGETS += memfd
TARGETS += memory-hotplug
TARGETS += mqueue
TARGETS += mount
@@ -12,11 +11,6 @@ TARGETS += timers
TARGETS += vm
TARGETS += powerpc
TARGETS += user
-TARGETS += sysctl
-TARGETS += firmware
-
-TARGETS_HOTPLUG = cpu-hotplug
-TARGETS_HOTPLUG += memory-hotplug
all:
for TARGET in $(TARGETS); do \
@@ -28,21 +22,6 @@ run_tests: all
make -C $$TARGET run_tests; \
done;
-hotplug:
- for TARGET in $(TARGETS_HOTPLUG); do \
- make -C $$TARGET; \
- done;
-
-run_hotplug: hotplug
- for TARGET in $(TARGETS_HOTPLUG); do \
- make -C $$TARGET run_full_test; \
- done;
-
-clean_hotplug:
- for TARGET in $(TARGETS_HOTPLUG); do \
- make -C $$TARGET clean; \
- done;
-
clean:
for TARGET in $(TARGETS); do \
make -C $$TARGET clean; \
diff --git a/README.txt b/README.txt
index 2660d5f..5e2faf9 100644
--- a/README.txt
+++ b/README.txt
@@ -4,15 +4,8 @@ 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.
-On some systems, hot-plug tests could hang forever waiting for cpu and
-memory to be ready to be offlined. A special hot-plug target is created
-to run full range of hot-plug tests. In default mode, hot-plug tests run
-in safe mode with a limited scope. In limited mode, cpu-hotplug test is
-run on a single cpu as opposed to all hotplug capable cpus, and memory
-hotplug test is run on 2% of hotplug capable memory instead of 10%.
-
-Running the selftests (hotplug tests are run in limited mode)
-=============================================================
+Running the selftests
+=====================
To build the tests:
@@ -25,26 +18,14 @@ To run the tests:
- note that some tests will require root privileges.
-To run only tests targeted for a single subsystem: (including
-hotplug targets in limited mode)
+
+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.
-Running the full range hotplug selftests
-========================================
-
-To build the tests:
-
- $ make -C tools/testing/selftests hotplug
-
-To run the tests:
-
- $ make -C tools/testing/selftests run_hotplug
-
-- note that some tests will require root privileges.
Contributing new tests
======================
diff --git a/cpu-hotplug/Makefile b/cpu-hotplug/Makefile
index e9c28d8..ae5faf9 100644
--- a/cpu-hotplug/Makefile
+++ b/cpu-hotplug/Makefile
@@ -1,9 +1,6 @@
all:
run_tests:
- @/bin/bash ./on-off-test.sh || echo "cpu-hotplug selftests: [FAIL]"
-
-run_full_test:
- @/bin/bash ./on-off-test.sh -a || echo "cpu-hotplug selftests: [FAIL]"
+ @/bin/sh ./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
index 98b1d65..bdde7cf 100644
--- a/cpu-hotplug/on-off-test.sh
+++ b/cpu-hotplug/on-off-test.sh
@@ -11,8 +11,6 @@ prerequisite()
exit 0
fi
- taskset -p 01 $$
-
SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`
if [ ! -d "$SYSFS" ]; then
@@ -24,19 +22,6 @@ prerequisite()
echo $msg cpu hotplug is not supported >&2
exit 0
fi
-
- echo "CPU online/offline summary:"
- online_cpus=`cat $SYSFS/devices/system/cpu/online`
- online_max=${online_cpus##*-}
- echo -e "\t Cpus in online state: $online_cpus"
-
- offline_cpus=`cat $SYSFS/devices/system/cpu/offline`
- if [[ "a$offline_cpus" = "a" ]]; then
- offline_cpus=0
- else
- offline_max=${offline_cpus##*-}
- fi
- echo -e "\t Cpus in offline state: $offline_cpus"
}
#
@@ -128,25 +113,15 @@ offline_cpu_expect_fail()
}
error=-12
-allcpus=0
priority=0
-online_cpus=0
-online_max=0
-offline_cpus=0
-offline_max=0
-while getopts e:ahp: opt; do
+while getopts e:hp: opt; do
case $opt in
e)
error=$OPTARG
;;
- a)
- allcpus=1
- ;;
h)
- echo "Usage $0 [ -a ] [ -e errno ] [ -p notifier-priority ]"
- echo -e "\t default offline one cpu"
- echo -e "\t run with -a option to offline all cpus"
+ echo "Usage $0 [ -e errno ] [ -p notifier-priority ]"
exit
;;
p)
@@ -163,29 +138,6 @@ fi
prerequisite
#
-# Safe test (default) - offline and online one cpu
-#
-if [ $allcpus -eq 0 ]; then
- echo "Limited scope test: one hotplug cpu"
- echo -e "\t (leaves cpu in the original state):"
- echo -e "\t online to offline to online: cpu $online_max"
- offline_cpu_expect_success $online_max
- online_cpu_expect_success $online_max
-
- if [[ $offline_cpus -gt 0 ]]; then
- echo -e "\t offline to online to offline: cpu $offline_max"
- online_cpu_expect_success $offline_max
- offline_cpu_expect_success $offline_max
- fi
- exit 0
-else
- echo "Full scope test: all hotplug cpus"
- echo -e "\t online all offline cpus"
- echo -e "\t offline all online cpus"
- echo -e "\t online all offline cpus"
-fi
-
-#
# Online all hot-pluggable CPUs
#
for cpu in `hotplaggable_offline_cpus`; do
diff --git a/firmware/Makefile b/firmware/Makefile
deleted file mode 100644
index e23cce0..0000000
--- a/firmware/Makefile
+++ /dev/null
@@ -1,27 +0,0 @@
-# Makefile for firmware loading selftests
-
-# No binaries, but make sure arg-less "make" doesn't trigger "run_tests"
-all:
-
-fw_filesystem:
- @if /bin/sh ./fw_filesystem.sh ; then \
- echo "fw_filesystem: ok"; \
- else \
- echo "fw_filesystem: [FAIL]"; \
- exit 1; \
- fi
-
-fw_userhelper:
- @if /bin/sh ./fw_userhelper.sh ; then \
- echo "fw_userhelper: ok"; \
- else \
- echo "fw_userhelper: [FAIL]"; \
- exit 1; \
- fi
-
-run_tests: all fw_filesystem fw_userhelper
-
-# Nothing to clean up.
-clean:
-
-.PHONY: all clean run_tests fw_filesystem fw_userhelper
diff --git a/firmware/fw_filesystem.sh b/firmware/fw_filesystem.sh
deleted file mode 100644
index 3fc6c10..0000000
--- a/firmware/fw_filesystem.sh
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/bin/sh
-# This validates that the kernel will load firmware out of its list of
-# firmware locations on disk. Since the user helper does similar work,
-# we reset the custom load directory to a location the user helper doesn't
-# know so we can be sure we're not accidentally testing the user helper.
-set -e
-
-modprobe test_firmware
-
-DIR=/sys/devices/virtual/misc/test_firmware
-
-OLD_TIMEOUT=$(cat /sys/class/firmware/timeout)
-OLD_FWPATH=$(cat /sys/module/firmware_class/parameters/path)
-
-FWPATH=$(mktemp -d)
-FW="$FWPATH/test-firmware.bin"
-
-test_finish()
-{
- echo "$OLD_TIMEOUT" >/sys/class/firmware/timeout
- echo -n "$OLD_PATH" >/sys/module/firmware_class/parameters/path
- rm -f "$FW"
- rmdir "$FWPATH"
-}
-
-trap "test_finish" EXIT
-
-# Turn down the timeout so failures don't take so long.
-echo 1 >/sys/class/firmware/timeout
-# Set the kernel search path.
-echo -n "$FWPATH" >/sys/module/firmware_class/parameters/path
-
-# This is an unlikely real-world firmware content. :)
-echo "ABCD0123" >"$FW"
-
-NAME=$(basename "$FW")
-
-# Request a firmware that doesn't exist, it should fail.
-echo -n "nope-$NAME" >"$DIR"/trigger_request
-if diff -q "$FW" /dev/test_firmware >/dev/null ; then
- echo "$0: firmware was not expected to match" >&2
- exit 1
-else
- echo "$0: timeout works"
-fi
-
-# This should succeed via kernel load or will fail after 1 second after
-# being handed over to the user helper, which won't find the fw either.
-if ! echo -n "$NAME" >"$DIR"/trigger_request ; then
- echo "$0: could not trigger request" >&2
- exit 1
-fi
-
-# Verify the contents are what we expect.
-if ! diff -q "$FW" /dev/test_firmware >/dev/null ; then
- echo "$0: firmware was not loaded" >&2
- exit 1
-else
- echo "$0: filesystem loading works"
-fi
-
-exit 0
diff --git a/firmware/fw_userhelper.sh b/firmware/fw_userhelper.sh
deleted file mode 100644
index 6efbade..0000000
--- a/firmware/fw_userhelper.sh
+++ /dev/null
@@ -1,89 +0,0 @@
-#!/bin/sh
-# This validates that the kernel will fall back to using the user helper
-# to load firmware it can't find on disk itself. We must request a firmware
-# that the kernel won't find, and any installed helper (e.g. udev) also
-# won't find so that we can do the load ourself manually.
-set -e
-
-modprobe test_firmware
-
-DIR=/sys/devices/virtual/misc/test_firmware
-
-OLD_TIMEOUT=$(cat /sys/class/firmware/timeout)
-
-FWPATH=$(mktemp -d)
-FW="$FWPATH/test-firmware.bin"
-
-test_finish()
-{
- echo "$OLD_TIMEOUT" >/sys/class/firmware/timeout
- rm -f "$FW"
- rmdir "$FWPATH"
-}
-
-load_fw()
-{
- local name="$1"
- local file="$2"
-
- # This will block until our load (below) has finished.
- echo -n "$name" >"$DIR"/trigger_request &
-
- # Give kernel a chance to react.
- local timeout=10
- while [ ! -e "$DIR"/"$name"/loading ]; do
- sleep 0.1
- timeout=$(( $timeout - 1 ))
- if [ "$timeout" -eq 0 ]; then
- echo "$0: firmware interface never appeared" >&2
- exit 1
- fi
- done
-
- echo 1 >"$DIR"/"$name"/loading
- cat "$file" >"$DIR"/"$name"/data
- echo 0 >"$DIR"/"$name"/loading
-
- # Wait for request to finish.
- wait
-}
-
-trap "test_finish" EXIT
-
-# This is an unlikely real-world firmware content. :)
-echo "ABCD0123" >"$FW"
-NAME=$(basename "$FW")
-
-# Test failure when doing nothing (timeout works).
-echo 1 >/sys/class/firmware/timeout
-echo -n "$NAME" >"$DIR"/trigger_request
-if diff -q "$FW" /dev/test_firmware >/dev/null ; then
- echo "$0: firmware was not expected to match" >&2
- exit 1
-else
- echo "$0: timeout works"
-fi
-
-# Put timeout high enough for us to do work but not so long that failures
-# slow down this test too much.
-echo 4 >/sys/class/firmware/timeout
-
-# Load this script instead of the desired firmware.
-load_fw "$NAME" "$0"
-if diff -q "$FW" /dev/test_firmware >/dev/null ; then
- echo "$0: firmware was not expected to match" >&2
- exit 1
-else
- echo "$0: firmware comparison works"
-fi
-
-# Do a proper load, which should work correctly.
-load_fw "$NAME" "$FW"
-if ! diff -q "$FW" /dev/test_firmware >/dev/null ; then
- echo "$0: firmware was not loaded" >&2
- exit 1
-else
- echo "$0: user helper firmware loading works"
-fi
-
-exit 0
diff --git a/ipc/Makefile b/ipc/Makefile
index 74bbefd..5386fd7 100644
--- a/ipc/Makefile
+++ b/ipc/Makefile
@@ -1,18 +1,18 @@
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
+ ARCH := X86
CFLAGS := -DCONFIG_X86_32 -D__i386__
endif
ifeq ($(ARCH),x86_64)
- ARCH := x86
+ ARCH := X86
CFLAGS := -DCONFIG_X86_64 -D__x86_64__
endif
CFLAGS += -I../../../../usr/include/
all:
-ifeq ($(ARCH),x86)
+ifeq ($(ARCH),X86)
gcc $(CFLAGS) msgque.c -o msgque_test
else
echo "Not an x86 target, can't build msgque selftest"
diff --git a/ipc/msgque.c b/ipc/msgque.c
index 552f081..aa290c0 100644
--- a/ipc/msgque.c
+++ b/ipc/msgque.c
@@ -193,11 +193,6 @@ 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");
diff --git a/kcmp/Makefile b/kcmp/Makefile
index 8aabd82..d7d6bbe 100644
--- a/kcmp/Makefile
+++ b/kcmp/Makefile
@@ -1,11 +1,11 @@
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
+ ARCH := X86
CFLAGS := -DCONFIG_X86_32 -D__i386__
endif
ifeq ($(ARCH),x86_64)
- ARCH := x86
+ ARCH := X86
CFLAGS := -DCONFIG_X86_64 -D__x86_64__
endif
@@ -15,7 +15,7 @@ CFLAGS += -I../../../../usr/include/
CFLAGS += -I../../../../arch/x86/include/
all:
-ifeq ($(ARCH),x86)
+ifeq ($(ARCH),X86)
gcc $(CFLAGS) kcmp_test.c -o kcmp_test
else
echo "Not an x86 target, can't build kcmp selftest"
diff --git a/kcmp/kcmp_test.c b/kcmp/kcmp_test.c
index dbba408..fa4f1b3 100644
--- a/kcmp/kcmp_test.c
+++ b/kcmp/kcmp_test.c
@@ -81,7 +81,7 @@ int main(int argc, char **argv)
/* Compare with self */
ret = sys_kcmp(pid1, pid1, KCMP_VM, 0, 0);
if (ret) {
- printf("FAIL: 0 expected but %d returned (%s)\n",
+ printf("FAIL: 0 expected but %li returned (%s)\n",
ret, strerror(errno));
ret = -1;
} else
diff --git a/memfd/.gitignore b/memfd/.gitignore
deleted file mode 100644
index afe87c4..0000000
--- a/memfd/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-fuse_mnt
-fuse_test
-memfd_test
-memfd-test-file
diff --git a/memfd/Makefile b/memfd/Makefile
deleted file mode 100644
index ad4ab01..0000000
--- a/memfd/Makefile
+++ /dev/null
@@ -1,41 +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
-endif
-ifeq ($(ARCH),x86_64)
- ARCH := x86
-endif
-
-CFLAGS += -D_FILE_OFFSET_BITS=64
-CFLAGS += -I../../../../arch/x86/include/generated/uapi/
-CFLAGS += -I../../../../arch/x86/include/uapi/
-CFLAGS += -I../../../../include/uapi/
-CFLAGS += -I../../../../include/
-
-all:
-ifeq ($(ARCH),x86)
- gcc $(CFLAGS) memfd_test.c -o memfd_test
-else
- echo "Not an x86 target, can't build memfd selftest"
-endif
-
-run_tests: all
-ifeq ($(ARCH),x86)
- gcc $(CFLAGS) memfd_test.c -o memfd_test
-endif
- @./memfd_test || echo "memfd_test: [FAIL]"
-
-build_fuse:
-ifeq ($(ARCH),x86)
- gcc $(CFLAGS) fuse_mnt.c `pkg-config fuse --cflags --libs` -o fuse_mnt
- gcc $(CFLAGS) fuse_test.c -o fuse_test
-else
- echo "Not an x86 target, can't build memfd selftest"
-endif
-
-run_fuse: build_fuse
- @./run_fuse_test.sh || echo "fuse_test: [FAIL]"
-
-clean:
- $(RM) memfd_test fuse_test
diff --git a/memfd/fuse_mnt.c b/memfd/fuse_mnt.c
deleted file mode 100644
index feacf12..0000000
--- a/memfd/fuse_mnt.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * memfd test file-system
- * This file uses FUSE to create a dummy file-system with only one file /memfd.
- * This file is read-only and takes 1s per read.
- *
- * This file-system is used by the memfd test-cases to force the kernel to pin
- * pages during reads(). Due to the 1s delay of this file-system, this is a
- * nice way to test race-conditions against get_user_pages() in the kernel.
- *
- * We use direct_io==1 to force the kernel to use direct-IO for this
- * file-system.
- */
-
-#define FUSE_USE_VERSION 26
-
-#include <fuse.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-static const char memfd_content[] = "memfd-example-content";
-static const char memfd_path[] = "/memfd";
-
-static int memfd_getattr(const char *path, struct stat *st)
-{
- memset(st, 0, sizeof(*st));
-
- if (!strcmp(path, "/")) {
- st->st_mode = S_IFDIR | 0755;
- st->st_nlink = 2;
- } else if (!strcmp(path, memfd_path)) {
- st->st_mode = S_IFREG | 0444;
- st->st_nlink = 1;
- st->st_size = strlen(memfd_content);
- } else {
- return -ENOENT;
- }
-
- return 0;
-}
-
-static int memfd_readdir(const char *path,
- void *buf,
- fuse_fill_dir_t filler,
- off_t offset,
- struct fuse_file_info *fi)
-{
- if (strcmp(path, "/"))
- return -ENOENT;
-
- filler(buf, ".", NULL, 0);
- filler(buf, "..", NULL, 0);
- filler(buf, memfd_path + 1, NULL, 0);
-
- return 0;
-}
-
-static int memfd_open(const char *path, struct fuse_file_info *fi)
-{
- if (strcmp(path, memfd_path))
- return -ENOENT;
-
- if ((fi->flags & 3) != O_RDONLY)
- return -EACCES;
-
- /* force direct-IO */
- fi->direct_io = 1;
-
- return 0;
-}
-
-static int memfd_read(const char *path,
- char *buf,
- size_t size,
- off_t offset,
- struct fuse_file_info *fi)
-{
- size_t len;
-
- if (strcmp(path, memfd_path) != 0)
- return -ENOENT;
-
- sleep(1);
-
- len = strlen(memfd_content);
- if (offset < len) {
- if (offset + size > len)
- size = len - offset;
-
- memcpy(buf, memfd_content + offset, size);
- } else {
- size = 0;
- }
-
- return size;
-}
-
-static struct fuse_operations memfd_ops = {
- .getattr = memfd_getattr,
- .readdir = memfd_readdir,
- .open = memfd_open,
- .read = memfd_read,
-};
-
-int main(int argc, char *argv[])
-{
- return fuse_main(argc, argv, &memfd_ops, NULL);
-}
diff --git a/memfd/fuse_test.c b/memfd/fuse_test.c
deleted file mode 100644
index 67908b1..0000000
--- a/memfd/fuse_test.c
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * memfd GUP test-case
- * This tests memfd interactions with get_user_pages(). We require the
- * fuse_mnt.c program to provide a fake direct-IO FUSE mount-point for us. This
- * file-system delays _all_ reads by 1s and forces direct-IO. This means, any
- * read() on files in that file-system will pin the receive-buffer pages for at
- * least 1s via get_user_pages().
- *
- * We use this trick to race ADD_SEALS against a write on a memfd object. The
- * ADD_SEALS must fail if the memfd pages are still pinned. Note that we use
- * the read() syscall with our memory-mapped memfd object as receive buffer to
- * force the kernel to write into our memfd object.
- */
-
-#define _GNU_SOURCE
-#define __EXPORTED_HEADERS__
-
-#include <errno.h>
-#include <inttypes.h>
-#include <limits.h>
-#include <linux/falloc.h>
-#include <linux/fcntl.h>
-#include <linux/memfd.h>
-#include <sched.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <string.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <sys/syscall.h>
-#include <sys/wait.h>
-#include <unistd.h>
-
-#define MFD_DEF_SIZE 8192
-#define STACK_SIZE 65535
-
-static int sys_memfd_create(const char *name,
- unsigned int flags)
-{
- return syscall(__NR_memfd_create, name, flags);
-}
-
-static int mfd_assert_new(const char *name, loff_t sz, unsigned int flags)
-{
- int r, fd;
-
- fd = sys_memfd_create(name, flags);
- if (fd < 0) {
- printf("memfd_create(\"%s\", %u) failed: %m\n",
- name, flags);
- abort();
- }
-
- r = ftruncate(fd, sz);
- if (r < 0) {
- printf("ftruncate(%llu) failed: %m\n", (unsigned long long)sz);
- abort();
- }
-
- return fd;
-}
-
-static __u64 mfd_assert_get_seals(int fd)
-{
- long r;
-
- r = fcntl(fd, F_GET_SEALS);
- if (r < 0) {
- printf("GET_SEALS(%d) failed: %m\n", fd);
- abort();
- }
-
- return r;
-}
-
-static void mfd_assert_has_seals(int fd, __u64 seals)
-{
- __u64 s;
-
- s = mfd_assert_get_seals(fd);
- if (s != seals) {
- printf("%llu != %llu = GET_SEALS(%d)\n",
- (unsigned long long)seals, (unsigned long long)s, fd);
- abort();
- }
-}
-
-static void mfd_assert_add_seals(int fd, __u64 seals)
-{
- long r;
- __u64 s;
-
- s = mfd_assert_get_seals(fd);
- r = fcntl(fd, F_ADD_SEALS, seals);
- if (r < 0) {
- printf("ADD_SEALS(%d, %llu -> %llu) failed: %m\n",
- fd, (unsigned long long)s, (unsigned long long)seals);
- abort();
- }
-}
-
-static int mfd_busy_add_seals(int fd, __u64 seals)
-{
- long r;
- __u64 s;
-
- r = fcntl(fd, F_GET_SEALS);
- if (r < 0)
- s = 0;
- else
- s = r;
-
- r = fcntl(fd, F_ADD_SEALS, seals);
- if (r < 0 && errno != EBUSY) {
- printf("ADD_SEALS(%d, %llu -> %llu) didn't fail as expected with EBUSY: %m\n",
- fd, (unsigned long long)s, (unsigned long long)seals);
- abort();
- }
-
- return r;
-}
-
-static void *mfd_assert_mmap_shared(int fd)
-{
- void *p;
-
- p = mmap(NULL,
- MFD_DEF_SIZE,
- PROT_READ | PROT_WRITE,
- MAP_SHARED,
- fd,
- 0);
- if (p == MAP_FAILED) {
- printf("mmap() failed: %m\n");
- abort();
- }
-
- return p;
-}
-
-static void *mfd_assert_mmap_private(int fd)
-{
- void *p;
-
- p = mmap(NULL,
- MFD_DEF_SIZE,
- PROT_READ | PROT_WRITE,
- MAP_PRIVATE,
- fd,
- 0);
- if (p == MAP_FAILED) {
- printf("mmap() failed: %m\n");
- abort();
- }
-
- return p;
-}
-
-static int global_mfd = -1;
-static void *global_p = NULL;
-
-static int sealing_thread_fn(void *arg)
-{
- int sig, r;
-
- /*
- * This thread first waits 200ms so any pending operation in the parent
- * is correctly started. After that, it tries to seal @global_mfd as
- * SEAL_WRITE. This _must_ fail as the parent thread has a read() into
- * that memory mapped object still ongoing.
- * We then wait one more second and try sealing again. This time it
- * must succeed as there shouldn't be anyone else pinning the pages.
- */
-
- /* wait 200ms for FUSE-request to be active */
- usleep(200000);
-
- /* unmount mapping before sealing to avoid i_mmap_writable failures */
- munmap(global_p, MFD_DEF_SIZE);
-
- /* Try sealing the global file; expect EBUSY or success. Current
- * kernels will never succeed, but in the future, kernels might
- * implement page-replacements or other fancy ways to avoid racing
- * writes. */
- r = mfd_busy_add_seals(global_mfd, F_SEAL_WRITE);
- if (r >= 0) {
- printf("HURRAY! This kernel fixed GUP races!\n");
- } else {
- /* wait 1s more so the FUSE-request is done */
- sleep(1);
-
- /* try sealing the global file again */
- mfd_assert_add_seals(global_mfd, F_SEAL_WRITE);
- }
-
- return 0;
-}
-
-static pid_t spawn_sealing_thread(void)
-{
- uint8_t *stack;
- pid_t pid;
-
- stack = malloc(STACK_SIZE);
- if (!stack) {
- printf("malloc(STACK_SIZE) failed: %m\n");
- abort();
- }
-
- pid = clone(sealing_thread_fn,
- stack + STACK_SIZE,
- SIGCHLD | CLONE_FILES | CLONE_FS | CLONE_VM,
- NULL);
- if (pid < 0) {
- printf("clone() failed: %m\n");
- abort();
- }
-
- return pid;
-}
-
-static void join_sealing_thread(pid_t pid)
-{
- waitpid(pid, NULL, 0);
-}
-
-int main(int argc, char **argv)
-{
- static const char zero[MFD_DEF_SIZE];
- int fd, mfd, r;
- void *p;
- int was_sealed;
- pid_t pid;
-
- if (argc < 2) {
- printf("error: please pass path to file in fuse_mnt mount-point\n");
- abort();
- }
-
- /* open FUSE memfd file for GUP testing */
- printf("opening: %s\n", argv[1]);
- fd = open(argv[1], O_RDONLY | O_CLOEXEC);
- if (fd < 0) {
- printf("cannot open(\"%s\"): %m\n", argv[1]);
- abort();
- }
-
- /* create new memfd-object */
- mfd = mfd_assert_new("kern_memfd_fuse",
- MFD_DEF_SIZE,
- MFD_CLOEXEC | MFD_ALLOW_SEALING);
-
- /* mmap memfd-object for writing */
- p = mfd_assert_mmap_shared(mfd);
-
- /* pass mfd+mapping to a separate sealing-thread which tries to seal
- * the memfd objects with SEAL_WRITE while we write into it */
- global_mfd = mfd;
- global_p = p;
- pid = spawn_sealing_thread();
-
- /* Use read() on the FUSE file to read into our memory-mapped memfd
- * object. This races the other thread which tries to seal the
- * memfd-object.
- * If @fd is on the memfd-fake-FUSE-FS, the read() is delayed by 1s.
- * This guarantees that the receive-buffer is pinned for 1s until the
- * data is written into it. The racing ADD_SEALS should thus fail as
- * the pages are still pinned. */
- r = read(fd, p, MFD_DEF_SIZE);
- if (r < 0) {
- printf("read() failed: %m\n");
- abort();
- } else if (!r) {
- printf("unexpected EOF on read()\n");
- abort();
- }
-
- was_sealed = mfd_assert_get_seals(mfd) & F_SEAL_WRITE;
-
- /* Wait for sealing-thread to finish and verify that it
- * successfully sealed the file after the second try. */
- join_sealing_thread(pid);
- mfd_assert_has_seals(mfd, F_SEAL_WRITE);
-
- /* *IF* the memfd-object was sealed at the time our read() returned,
- * then the kernel did a page-replacement or canceled the read() (or
- * whatever magic it did..). In that case, the memfd object is still
- * all zero.
- * In case the memfd-object was *not* sealed, the read() was successfull
- * and the memfd object must *not* be all zero.
- * Note that in real scenarios, there might be a mixture of both, but
- * in this test-cases, we have explicit 200ms delays which should be
- * enough to avoid any in-flight writes. */
-
- p = mfd_assert_mmap_private(mfd);
- if (was_sealed && memcmp(p, zero, MFD_DEF_SIZE)) {
- printf("memfd sealed during read() but data not discarded\n");
- abort();
- } else if (!was_sealed && !memcmp(p, zero, MFD_DEF_SIZE)) {
- printf("memfd sealed after read() but data discarded\n");
- abort();
- }
-
- close(mfd);
- close(fd);
-
- printf("fuse: DONE\n");
-
- return 0;
-}
diff --git a/memfd/memfd_test.c b/memfd/memfd_test.c
deleted file mode 100644
index 3634c90..0000000
--- a/memfd/memfd_test.c
+++ /dev/null
@@ -1,913 +0,0 @@
-#define _GNU_SOURCE
-#define __EXPORTED_HEADERS__
-
-#include <errno.h>
-#include <inttypes.h>
-#include <limits.h>
-#include <linux/falloc.h>
-#include <linux/fcntl.h>
-#include <linux/memfd.h>
-#include <sched.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <string.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <sys/syscall.h>
-#include <unistd.h>
-
-#define MFD_DEF_SIZE 8192
-#define STACK_SIZE 65535
-
-static int sys_memfd_create(const char *name,
- unsigned int flags)
-{
- return syscall(__NR_memfd_create, name, flags);
-}
-
-static int mfd_assert_new(const char *name, loff_t sz, unsigned int flags)
-{
- int r, fd;
-
- fd = sys_memfd_create(name, flags);
- if (fd < 0) {
- printf("memfd_create(\"%s\", %u) failed: %m\n",
- name, flags);
- abort();
- }
-
- r = ftruncate(fd, sz);
- if (r < 0) {
- printf("ftruncate(%llu) failed: %m\n", (unsigned long long)sz);
- abort();
- }
-
- return fd;
-}
-
-static void mfd_fail_new(const char *name, unsigned int flags)
-{
- int r;
-
- r = sys_memfd_create(name, flags);
- if (r >= 0) {
- printf("memfd_create(\"%s\", %u) succeeded, but failure expected\n",
- name, flags);
- close(r);
- abort();
- }
-}
-
-static __u64 mfd_assert_get_seals(int fd)
-{
- long r;
-
- r = fcntl(fd, F_GET_SEALS);
- if (r < 0) {
- printf("GET_SEALS(%d) failed: %m\n", fd);
- abort();
- }
-
- return r;
-}
-
-static void mfd_assert_has_seals(int fd, __u64 seals)
-{
- __u64 s;
-
- s = mfd_assert_get_seals(fd);
- if (s != seals) {
- printf("%llu != %llu = GET_SEALS(%d)\n",
- (unsigned long long)seals, (unsigned long long)s, fd);
- abort();
- }
-}
-
-static void mfd_assert_add_seals(int fd, __u64 seals)
-{
- long r;
- __u64 s;
-
- s = mfd_assert_get_seals(fd);
- r = fcntl(fd, F_ADD_SEALS, seals);
- if (r < 0) {
- printf("ADD_SEALS(%d, %llu -> %llu) failed: %m\n",
- fd, (unsigned long long)s, (unsigned long long)seals);
- abort();
- }
-}
-
-static void mfd_fail_add_seals(int fd, __u64 seals)
-{
- long r;
- __u64 s;
-
- r = fcntl(fd, F_GET_SEALS);
- if (r < 0)
- s = 0;
- else
- s = r;
-
- r = fcntl(fd, F_ADD_SEALS, seals);
- if (r >= 0) {
- printf("ADD_SEALS(%d, %llu -> %llu) didn't fail as expected\n",
- fd, (unsigned long long)s, (unsigned long long)seals);
- abort();
- }
-}
-
-static void mfd_assert_size(int fd, size_t size)
-{
- struct stat st;
- int r;
-
- r = fstat(fd, &st);
- if (r < 0) {
- printf("fstat(%d) failed: %m\n", fd);
- abort();
- } else if (st.st_size != size) {
- printf("wrong file size %lld, but expected %lld\n",
- (long long)st.st_size, (long long)size);
- abort();
- }
-}
-
-static int mfd_assert_dup(int fd)
-{
- int r;
-
- r = dup(fd);
- if (r < 0) {
- printf("dup(%d) failed: %m\n", fd);
- abort();
- }
-
- return r;
-}
-
-static void *mfd_assert_mmap_shared(int fd)
-{
- void *p;
-
- p = mmap(NULL,
- MFD_DEF_SIZE,
- PROT_READ | PROT_WRITE,
- MAP_SHARED,
- fd,
- 0);
- if (p == MAP_FAILED) {
- printf("mmap() failed: %m\n");
- abort();
- }
-
- return p;
-}
-
-static void *mfd_assert_mmap_private(int fd)
-{
- void *p;
-
- p = mmap(NULL,
- MFD_DEF_SIZE,
- PROT_READ,
- MAP_PRIVATE,
- fd,
- 0);
- if (p == MAP_FAILED) {
- printf("mmap() failed: %m\n");
- abort();
- }
-
- return p;
-}
-
-static int mfd_assert_open(int fd, int flags, mode_t mode)
-{
- char buf[512];
- int r;
-
- sprintf(buf, "/proc/self/fd/%d", fd);
- r = open(buf, flags, mode);
- if (r < 0) {
- printf("open(%s) failed: %m\n", buf);
- abort();
- }
-
- return r;
-}
-
-static void mfd_fail_open(int fd, int flags, mode_t mode)
-{
- char buf[512];
- int r;
-
- sprintf(buf, "/proc/self/fd/%d", fd);
- r = open(buf, flags, mode);
- if (r >= 0) {
- printf("open(%s) didn't fail as expected\n");
- abort();
- }
-}
-
-static void mfd_assert_read(int fd)
-{
- char buf[16];
- void *p;
- ssize_t l;
-
- l = read(fd, buf, sizeof(buf));
- if (l != sizeof(buf)) {
- printf("read() failed: %m\n");
- abort();
- }
-
- /* verify PROT_READ *is* allowed */
- p = mmap(NULL,
- MFD_DEF_SIZE,
- PROT_READ,
- MAP_PRIVATE,
- fd,
- 0);
- if (p == MAP_FAILED) {
- printf("mmap() failed: %m\n");
- abort();
- }
- munmap(p, MFD_DEF_SIZE);
-
- /* verify MAP_PRIVATE is *always* allowed (even writable) */
- p = mmap(NULL,
- MFD_DEF_SIZE,
- PROT_READ | PROT_WRITE,
- MAP_PRIVATE,
- fd,
- 0);
- if (p == MAP_FAILED) {
- printf("mmap() failed: %m\n");
- abort();
- }
- munmap(p, MFD_DEF_SIZE);
-}
-
-static void mfd_assert_write(int fd)
-{
- ssize_t l;
- void *p;
- int r;
-
- /* verify write() succeeds */
- l = write(fd, "\0\0\0\0", 4);
- if (l != 4) {
- printf("write() failed: %m\n");
- abort();
- }
-
- /* verify PROT_READ | PROT_WRITE is allowed */
- p = mmap(NULL,
- MFD_DEF_SIZE,
- PROT_READ | PROT_WRITE,
- MAP_SHARED,
- fd,
- 0);
- if (p == MAP_FAILED) {
- printf("mmap() failed: %m\n");
- abort();
- }
- *(char *)p = 0;
- munmap(p, MFD_DEF_SIZE);
-
- /* verify PROT_WRITE is allowed */
- p = mmap(NULL,
- MFD_DEF_SIZE,
- PROT_WRITE,
- MAP_SHARED,
- fd,
- 0);
- if (p == MAP_FAILED) {
- printf("mmap() failed: %m\n");
- abort();
- }
- *(char *)p = 0;
- munmap(p, MFD_DEF_SIZE);
-
- /* verify PROT_READ with MAP_SHARED is allowed and a following
- * mprotect(PROT_WRITE) allows writing */
- p = mmap(NULL,
- MFD_DEF_SIZE,
- PROT_READ,
- MAP_SHARED,
- fd,
- 0);
- if (p == MAP_FAILED) {
- printf("mmap() failed: %m\n");
- abort();
- }
-
- r = mprotect(p, MFD_DEF_SIZE, PROT_READ | PROT_WRITE);
- if (r < 0) {
- printf("mprotect() failed: %m\n");
- abort();
- }
-
- *(char *)p = 0;
- munmap(p, MFD_DEF_SIZE);
-
- /* verify PUNCH_HOLE works */
- r = fallocate(fd,
- FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
- 0,
- MFD_DEF_SIZE);
- if (r < 0) {
- printf("fallocate(PUNCH_HOLE) failed: %m\n");
- abort();
- }
-}
-
-static void mfd_fail_write(int fd)
-{
- ssize_t l;
- void *p;
- int r;
-
- /* verify write() fails */
- l = write(fd, "data", 4);
- if (l != -EPERM) {
- printf("expected EPERM on write(), but got %d: %m\n", (int)l);
- abort();
- }
-
- /* verify PROT_READ | PROT_WRITE is not allowed */
- p = mmap(NULL,
- MFD_DEF_SIZE,
- PROT_READ | PROT_WRITE,
- MAP_SHARED,
- fd,
- 0);
- if (p != MAP_FAILED) {
- printf("mmap() didn't fail as expected\n");
- abort();
- }
-
- /* verify PROT_WRITE is not allowed */
- p = mmap(NULL,
- MFD_DEF_SIZE,
- PROT_WRITE,
- MAP_SHARED,
- fd,
- 0);
- if (p != MAP_FAILED) {
- printf("mmap() didn't fail as expected\n");
- abort();
- }
-
- /* Verify PROT_READ with MAP_SHARED with a following mprotect is not
- * allowed. Note that for r/w the kernel already prevents the mmap. */
- p = mmap(NULL,
- MFD_DEF_SIZE,
- PROT_READ,
- MAP_SHARED,
- fd,
- 0);
- if (p != MAP_FAILED) {
- r = mprotect(p, MFD_DEF_SIZE, PROT_READ | PROT_WRITE);
- if (r >= 0) {
- printf("mmap()+mprotect() didn't fail as expected\n");
- abort();
- }
- }
-
- /* verify PUNCH_HOLE fails */
- r = fallocate(fd,
- FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
- 0,
- MFD_DEF_SIZE);
- if (r >= 0) {
- printf("fallocate(PUNCH_HOLE) didn't fail as expected\n");
- abort();
- }
-}
-
-static void mfd_assert_shrink(int fd)
-{
- int r, fd2;
-
- r = ftruncate(fd, MFD_DEF_SIZE / 2);
- if (r < 0) {
- printf("ftruncate(SHRINK) failed: %m\n");
- abort();
- }
-
- mfd_assert_size(fd, MFD_DEF_SIZE / 2);
-
- fd2 = mfd_assert_open(fd,
- O_RDWR | O_CREAT | O_TRUNC,
- S_IRUSR | S_IWUSR);
- close(fd2);
-
- mfd_assert_size(fd, 0);
-}
-
-static void mfd_fail_shrink(int fd)
-{
- int r;
-
- r = ftruncate(fd, MFD_DEF_SIZE / 2);
- if (r >= 0) {
- printf("ftruncate(SHRINK) didn't fail as expected\n");
- abort();
- }
-
- mfd_fail_open(fd,
- O_RDWR | O_CREAT | O_TRUNC,
- S_IRUSR | S_IWUSR);
-}
-
-static void mfd_assert_grow(int fd)
-{
- int r;
-
- r = ftruncate(fd, MFD_DEF_SIZE * 2);
- if (r < 0) {
- printf("ftruncate(GROW) failed: %m\n");
- abort();
- }
-
- mfd_assert_size(fd, MFD_DEF_SIZE * 2);
-
- r = fallocate(fd,
- 0,
- 0,
- MFD_DEF_SIZE * 4);
- if (r < 0) {
- printf("fallocate(ALLOC) failed: %m\n");
- abort();
- }
-
- mfd_assert_size(fd, MFD_DEF_SIZE * 4);
-}
-
-static void mfd_fail_grow(int fd)
-{
- int r;
-
- r = ftruncate(fd, MFD_DEF_SIZE * 2);
- if (r >= 0) {
- printf("ftruncate(GROW) didn't fail as expected\n");
- abort();
- }
-
- r = fallocate(fd,
- 0,
- 0,
- MFD_DEF_SIZE * 4);
- if (r >= 0) {
- printf("fallocate(ALLOC) didn't fail as expected\n");
- abort();
- }
-}
-
-static void mfd_assert_grow_write(int fd)
-{
- static char buf[MFD_DEF_SIZE * 8];
- ssize_t l;
-
- l = pwrite(fd, buf, sizeof(buf), 0);
- if (l != sizeof(buf)) {
- printf("pwrite() failed: %m\n");
- abort();
- }
-
- mfd_assert_size(fd, MFD_DEF_SIZE * 8);
-}
-
-static void mfd_fail_grow_write(int fd)
-{
- static char buf[MFD_DEF_SIZE * 8];
- ssize_t l;
-
- l = pwrite(fd, buf, sizeof(buf), 0);
- if (l == sizeof(buf)) {
- printf("pwrite() didn't fail as expected\n");
- abort();
- }
-}
-
-static int idle_thread_fn(void *arg)
-{
- sigset_t set;
- int sig;
-
- /* dummy waiter; SIGTERM terminates us anyway */
- sigemptyset(&set);
- sigaddset(&set, SIGTERM);
- sigwait(&set, &sig);
-
- return 0;
-}
-
-static pid_t spawn_idle_thread(unsigned int flags)
-{
- uint8_t *stack;
- pid_t pid;
-
- stack = malloc(STACK_SIZE);
- if (!stack) {
- printf("malloc(STACK_SIZE) failed: %m\n");
- abort();
- }
-
- pid = clone(idle_thread_fn,
- stack + STACK_SIZE,
- SIGCHLD | flags,
- NULL);
- if (pid < 0) {
- printf("clone() failed: %m\n");
- abort();
- }
-
- return pid;
-}
-
-static void join_idle_thread(pid_t pid)
-{
- kill(pid, SIGTERM);
- waitpid(pid, NULL, 0);
-}
-
-/*
- * Test memfd_create() syscall
- * Verify syscall-argument validation, including name checks, flag validation
- * and more.
- */
-static void test_create(void)
-{
- char buf[2048];
- int fd;
-
- /* test NULL name */
- mfd_fail_new(NULL, 0);
-
- /* test over-long name (not zero-terminated) */
- memset(buf, 0xff, sizeof(buf));
- mfd_fail_new(buf, 0);
-
- /* test over-long zero-terminated name */
- memset(buf, 0xff, sizeof(buf));
- buf[sizeof(buf) - 1] = 0;
- mfd_fail_new(buf, 0);
-
- /* verify "" is a valid name */
- fd = mfd_assert_new("", 0, 0);
- close(fd);
-
- /* verify invalid O_* open flags */
- mfd_fail_new("", 0x0100);
- mfd_fail_new("", ~MFD_CLOEXEC);
- mfd_fail_new("", ~MFD_ALLOW_SEALING);
- mfd_fail_new("", ~0);
- mfd_fail_new("", 0x80000000U);
-
- /* verify MFD_CLOEXEC is allowed */
- fd = mfd_assert_new("", 0, MFD_CLOEXEC);
- close(fd);
-
- /* verify MFD_ALLOW_SEALING is allowed */
- fd = mfd_assert_new("", 0, MFD_ALLOW_SEALING);
- close(fd);
-
- /* verify MFD_ALLOW_SEALING | MFD_CLOEXEC is allowed */
- fd = mfd_assert_new("", 0, MFD_ALLOW_SEALING | MFD_CLOEXEC);
- close(fd);
-}
-
-/*
- * Test basic sealing
- * A very basic sealing test to see whether setting/retrieving seals works.
- */
-static void test_basic(void)
-{
- int fd;
-
- fd = mfd_assert_new("kern_memfd_basic",
- MFD_DEF_SIZE,
- MFD_CLOEXEC | MFD_ALLOW_SEALING);
-
- /* add basic seals */
- mfd_assert_has_seals(fd, 0);
- mfd_assert_add_seals(fd, F_SEAL_SHRINK |
- F_SEAL_WRITE);
- mfd_assert_has_seals(fd, F_SEAL_SHRINK |
- F_SEAL_WRITE);
-
- /* add them again */
- mfd_assert_add_seals(fd, F_SEAL_SHRINK |
- F_SEAL_WRITE);
- mfd_assert_has_seals(fd, F_SEAL_SHRINK |
- F_SEAL_WRITE);
-
- /* add more seals and seal against sealing */
- mfd_assert_add_seals(fd, F_SEAL_GROW | F_SEAL_SEAL);
- mfd_assert_has_seals(fd, F_SEAL_SHRINK |
- F_SEAL_GROW |
- F_SEAL_WRITE |
- F_SEAL_SEAL);
-
- /* verify that sealing no longer works */
- mfd_fail_add_seals(fd, F_SEAL_GROW);
- mfd_fail_add_seals(fd, 0);
-
- close(fd);
-
- /* verify sealing does not work without MFD_ALLOW_SEALING */
- fd = mfd_assert_new("kern_memfd_basic",
- MFD_DEF_SIZE,
- MFD_CLOEXEC);
- mfd_assert_has_seals(fd, F_SEAL_SEAL);
- mfd_fail_add_seals(fd, F_SEAL_SHRINK |
- F_SEAL_GROW |
- F_SEAL_WRITE);
- mfd_assert_has_seals(fd, F_SEAL_SEAL);
- close(fd);
-}
-
-/*
- * Test SEAL_WRITE
- * Test whether SEAL_WRITE actually prevents modifications.
- */
-static void test_seal_write(void)
-{
- int fd;
-
- fd = mfd_assert_new("kern_memfd_seal_write",
- MFD_DEF_SIZE,
- MFD_CLOEXEC | MFD_ALLOW_SEALING);
- mfd_assert_has_seals(fd, 0);
- mfd_assert_add_seals(fd, F_SEAL_WRITE);
- mfd_assert_has_seals(fd, F_SEAL_WRITE);
-
- mfd_assert_read(fd);
- mfd_fail_write(fd);
- mfd_assert_shrink(fd);
- mfd_assert_grow(fd);
- mfd_fail_grow_write(fd);
-
- close(fd);
-}
-
-/*
- * Test SEAL_SHRINK
- * Test whether SEAL_SHRINK actually prevents shrinking
- */
-static void test_seal_shrink(void)
-{
- int fd;
-
- fd = mfd_assert_new("kern_memfd_seal_shrink",
- MFD_DEF_SIZE,
- MFD_CLOEXEC | MFD_ALLOW_SEALING);
- mfd_assert_has_seals(fd, 0);
- mfd_assert_add_seals(fd, F_SEAL_SHRINK);
- mfd_assert_has_seals(fd, F_SEAL_SHRINK);
-
- mfd_assert_read(fd);
- mfd_assert_write(fd);
- mfd_fail_shrink(fd);
- mfd_assert_grow(fd);
- mfd_assert_grow_write(fd);
-
- close(fd);
-}
-
-/*
- * Test SEAL_GROW
- * Test whether SEAL_GROW actually prevents growing
- */
-static void test_seal_grow(void)
-{
- int fd;
-
- fd = mfd_assert_new("kern_memfd_seal_grow",
- MFD_DEF_SIZE,
- MFD_CLOEXEC | MFD_ALLOW_SEALING);
- mfd_assert_has_seals(fd, 0);
- mfd_assert_add_seals(fd, F_SEAL_GROW);
- mfd_assert_has_seals(fd, F_SEAL_GROW);
-
- mfd_assert_read(fd);
- mfd_assert_write(fd);
- mfd_assert_shrink(fd);
- mfd_fail_grow(fd);
- mfd_fail_grow_write(fd);
-
- close(fd);
-}
-
-/*
- * Test SEAL_SHRINK | SEAL_GROW
- * Test whether SEAL_SHRINK | SEAL_GROW actually prevents resizing
- */
-static void test_seal_resize(void)
-{
- int fd;
-
- fd = mfd_assert_new("kern_memfd_seal_resize",
- MFD_DEF_SIZE,
- MFD_CLOEXEC | MFD_ALLOW_SEALING);
- mfd_assert_has_seals(fd, 0);
- mfd_assert_add_seals(fd, F_SEAL_SHRINK | F_SEAL_GROW);
- mfd_assert_has_seals(fd, F_SEAL_SHRINK | F_SEAL_GROW);
-
- mfd_assert_read(fd);
- mfd_assert_write(fd);
- mfd_fail_shrink(fd);
- mfd_fail_grow(fd);
- mfd_fail_grow_write(fd);
-
- close(fd);
-}
-
-/*
- * Test sharing via dup()
- * Test that seals are shared between dupped FDs and they're all equal.
- */
-static void test_share_dup(void)
-{
- int fd, fd2;
-
- fd = mfd_assert_new("kern_memfd_share_dup",
- MFD_DEF_SIZE,
- MFD_CLOEXEC | MFD_ALLOW_SEALING);
- mfd_assert_has_seals(fd, 0);
-
- fd2 = mfd_assert_dup(fd);
- mfd_assert_has_seals(fd2, 0);
-
- mfd_assert_add_seals(fd, F_SEAL_WRITE);
- mfd_assert_has_seals(fd, F_SEAL_WRITE);
- mfd_assert_has_seals(fd2, F_SEAL_WRITE);
-
- mfd_assert_add_seals(fd2, F_SEAL_SHRINK);
- mfd_assert_has_seals(fd, F_SEAL_WRITE | F_SEAL_SHRINK);
- mfd_assert_has_seals(fd2, F_SEAL_WRITE | F_SEAL_SHRINK);
-
- mfd_assert_add_seals(fd, F_SEAL_SEAL);
- mfd_assert_has_seals(fd, F_SEAL_WRITE | F_SEAL_SHRINK | F_SEAL_SEAL);
- mfd_assert_has_seals(fd2, F_SEAL_WRITE | F_SEAL_SHRINK | F_SEAL_SEAL);
-
- mfd_fail_add_seals(fd, F_SEAL_GROW);
- mfd_fail_add_seals(fd2, F_SEAL_GROW);
- mfd_fail_add_seals(fd, F_SEAL_SEAL);
- mfd_fail_add_seals(fd2, F_SEAL_SEAL);
-
- close(fd2);
-
- mfd_fail_add_seals(fd, F_SEAL_GROW);
- close(fd);
-}
-
-/*
- * Test sealing with active mmap()s
- * Modifying seals is only allowed if no other mmap() refs exist.
- */
-static void test_share_mmap(void)
-{
- int fd;
- void *p;
-
- fd = mfd_assert_new("kern_memfd_share_mmap",
- MFD_DEF_SIZE,
- MFD_CLOEXEC | MFD_ALLOW_SEALING);
- mfd_assert_has_seals(fd, 0);
-
- /* shared/writable ref prevents sealing WRITE, but allows others */
- p = mfd_assert_mmap_shared(fd);
- mfd_fail_add_seals(fd, F_SEAL_WRITE);
- mfd_assert_has_seals(fd, 0);
- mfd_assert_add_seals(fd, F_SEAL_SHRINK);
- mfd_assert_has_seals(fd, F_SEAL_SHRINK);
- munmap(p, MFD_DEF_SIZE);
-
- /* readable ref allows sealing */
- p = mfd_assert_mmap_private(fd);
- mfd_assert_add_seals(fd, F_SEAL_WRITE);
- mfd_assert_has_seals(fd, F_SEAL_WRITE | F_SEAL_SHRINK);
- munmap(p, MFD_DEF_SIZE);
-
- close(fd);
-}
-
-/*
- * Test sealing with open(/proc/self/fd/%d)
- * Via /proc we can get access to a separate file-context for the same memfd.
- * This is *not* like dup(), but like a real separate open(). Make sure the
- * semantics are as expected and we correctly check for RDONLY / WRONLY / RDWR.
- */
-static void test_share_open(void)
-{
- int fd, fd2;
-
- fd = mfd_assert_new("kern_memfd_share_open",
- MFD_DEF_SIZE,
- MFD_CLOEXEC | MFD_ALLOW_SEALING);
- mfd_assert_has_seals(fd, 0);
-
- fd2 = mfd_assert_open(fd, O_RDWR, 0);
- mfd_assert_add_seals(fd, F_SEAL_WRITE);
- mfd_assert_has_seals(fd, F_SEAL_WRITE);
- mfd_assert_has_seals(fd2, F_SEAL_WRITE);
-
- mfd_assert_add_seals(fd2, F_SEAL_SHRINK);
- mfd_assert_has_seals(fd, F_SEAL_WRITE | F_SEAL_SHRINK);
- mfd_assert_has_seals(fd2, F_SEAL_WRITE | F_SEAL_SHRINK);
-
- close(fd);
- fd = mfd_assert_open(fd2, O_RDONLY, 0);
-
- mfd_fail_add_seals(fd, F_SEAL_SEAL);
- mfd_assert_has_seals(fd, F_SEAL_WRITE | F_SEAL_SHRINK);
- mfd_assert_has_seals(fd2, F_SEAL_WRITE | F_SEAL_SHRINK);
-
- close(fd2);
- fd2 = mfd_assert_open(fd, O_RDWR, 0);
-
- mfd_assert_add_seals(fd2, F_SEAL_SEAL);
- mfd_assert_has_seals(fd, F_SEAL_WRITE | F_SEAL_SHRINK | F_SEAL_SEAL);
- mfd_assert_has_seals(fd2, F_SEAL_WRITE | F_SEAL_SHRINK | F_SEAL_SEAL);
-
- close(fd2);
- close(fd);
-}
-
-/*
- * Test sharing via fork()
- * Test whether seal-modifications work as expected with forked childs.
- */
-static void test_share_fork(void)
-{
- int fd;
- pid_t pid;
-
- fd = mfd_assert_new("kern_memfd_share_fork",
- MFD_DEF_SIZE,
- MFD_CLOEXEC | MFD_ALLOW_SEALING);
- mfd_assert_has_seals(fd, 0);
-
- pid = spawn_idle_thread(0);
- mfd_assert_add_seals(fd, F_SEAL_SEAL);
- mfd_assert_has_seals(fd, F_SEAL_SEAL);
-
- mfd_fail_add_seals(fd, F_SEAL_WRITE);
- mfd_assert_has_seals(fd, F_SEAL_SEAL);
-
- join_idle_thread(pid);
-
- mfd_fail_add_seals(fd, F_SEAL_WRITE);
- mfd_assert_has_seals(fd, F_SEAL_SEAL);
-
- close(fd);
-}
-
-int main(int argc, char **argv)
-{
- pid_t pid;
-
- printf("memfd: CREATE\n");
- test_create();
- printf("memfd: BASIC\n");
- test_basic();
-
- printf("memfd: SEAL-WRITE\n");
- test_seal_write();
- printf("memfd: SEAL-SHRINK\n");
- test_seal_shrink();
- printf("memfd: SEAL-GROW\n");
- test_seal_grow();
- printf("memfd: SEAL-RESIZE\n");
- test_seal_resize();
-
- printf("memfd: SHARE-DUP\n");
- test_share_dup();
- printf("memfd: SHARE-MMAP\n");
- test_share_mmap();
- printf("memfd: SHARE-OPEN\n");
- test_share_open();
- printf("memfd: SHARE-FORK\n");
- test_share_fork();
-
- /* Run test-suite in a multi-threaded environment with a shared
- * file-table. */
- pid = spawn_idle_thread(CLONE_FILES | CLONE_FS | CLONE_VM);
- printf("memfd: SHARE-DUP (shared file-table)\n");
- test_share_dup();
- printf("memfd: SHARE-MMAP (shared file-table)\n");
- test_share_mmap();
- printf("memfd: SHARE-OPEN (shared file-table)\n");
- test_share_open();
- printf("memfd: SHARE-FORK (shared file-table)\n");
- test_share_fork();
- join_idle_thread(pid);
-
- printf("memfd: DONE\n");
-
- return 0;
-}
diff --git a/memfd/run_fuse_test.sh b/memfd/run_fuse_test.sh
deleted file mode 100644
index 69b930e..0000000
--- a/memfd/run_fuse_test.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-
-if test -d "./mnt" ; then
- fusermount -u ./mnt
- rmdir ./mnt
-fi
-
-set -e
-
-mkdir mnt
-./fuse_mnt ./mnt
-./fuse_test ./mnt/memfd
-fusermount -u ./mnt
-rmdir ./mnt
diff --git a/memory-hotplug/Makefile b/memory-hotplug/Makefile
index d46b8d4..350bfed 100644
--- a/memory-hotplug/Makefile
+++ b/memory-hotplug/Makefile
@@ -1,9 +1,6 @@
all:
run_tests:
- @/bin/bash ./on-off-test.sh -r 2 || echo "memory-hotplug selftests: [FAIL]"
-
-run_full_test:
- @/bin/bash ./on-off-test.sh || echo "memory-hotplug selftests: [FAIL]"
+ @/bin/sh ./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
index 6cddde0..a2816f6 100644
--- a/memory-hotplug/on-off-test.sh
+++ b/memory-hotplug/on-off-test.sh
@@ -142,16 +142,10 @@ fi
prerequisite
-echo "Test scope: $ratio% hotplug memory"
-echo -e "\t online all hotplug memory in offline state"
-echo -e "\t offline $ratio% hotplug memory in online state"
-echo -e "\t online all hotplug memory in offline state"
-
#
# Online all hot-pluggable memory
#
for memory in `hotplaggable_offline_memory`; do
- echo offline-online $memory
online_memory_expect_success $memory
done
@@ -160,7 +154,6 @@ done
#
for memory in `hotpluggable_online_memory`; do
if [ $((RANDOM % 100)) -lt $ratio ]; then
- echo online-offline $memory
offline_memory_expect_success $memory
fi
done
@@ -169,7 +162,6 @@ done
# Online all hot-pluggable memory again
#
for memory in `hotplaggable_offline_memory`; do
- echo offline-online $memory
online_memory_expect_success $memory
done
diff --git a/mqueue/Makefile b/mqueue/Makefile
index 8056e2e..218a122 100644
--- a/mqueue/Makefile
+++ b/mqueue/Makefile
@@ -1,6 +1,6 @@
all:
- gcc -O2 mq_open_tests.c -o mq_open_tests -lrt
- gcc -O2 -o mq_perf_tests mq_perf_tests.c -lrt -lpthread -lpopt
+ 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]"
diff --git a/mqueue/mq_open_tests.c b/mqueue/mq_open_tests.c
index 9c1a5d3..711cc29 100644
--- a/mqueue/mq_open_tests.c
+++ b/mqueue/mq_open_tests.c
@@ -80,8 +80,7 @@ void shutdown(int exit_val, char *err_cause, int line_no)
if (in_shutdown++)
return;
- if (seteuid(0) == -1)
- perror("seteuid() failed");
+ seteuid(0);
if (queue != -1)
if (mq_close(queue))
@@ -293,10 +292,8 @@ int main(int argc, char *argv[])
/* 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%ld\n",
- (long) saved_limits.rlim_cur);
- printf("\tRLIMIT_MSGQUEUE(hard):\t\t%ld\n",
- (long) saved_limits.rlim_max);
+ 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) {
@@ -311,8 +308,8 @@ int main(int argc, char *argv[])
validate_current_settings();
printf("Adjusted system state for testing:\n");
- printf("\tRLIMIT_MSGQUEUE(soft):\t\t%ld\n", (long) cur_limits.rlim_cur);
- printf("\tRLIMIT_MSGQUEUE(hard):\t\t%ld\n", (long) cur_limits.rlim_max);
+ 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) {
@@ -457,12 +454,7 @@ int main(int argc, char *argv[])
else
printf("Queue open with total size > 2GB when euid = 0 "
"failed:\t\t\tPASS\n");
-
- if (seteuid(99) == -1) {
- perror("seteuid() failed");
- exit(1);
- }
-
+ seteuid(99);
attr.mq_maxmsg = cur_max_msgs;
attr.mq_msgsize = cur_max_msgsize;
if (test_queue_fail(&attr, &result))
diff --git a/mqueue/mq_perf_tests.c b/mqueue/mq_perf_tests.c
index 94dae65..2fadd4b 100644
--- a/mqueue/mq_perf_tests.c
+++ b/mqueue/mq_perf_tests.c
@@ -296,9 +296,9 @@ static inline void open_queue(struct mq_attr *attr)
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%lu\n", result.mq_maxmsg);
- printf("\t\tmq_msgsize:\t\t\t%lu\n", result.mq_msgsize);
- printf("\t\tmq_curmsgs:\t\t\t%lu\n", result.mq_curmsgs);
+ 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)
@@ -440,7 +440,7 @@ void *perf_test_thread(void *arg)
shutdown(2, "clock_getres()", __LINE__);
printf("\t\tMax priorities:\t\t\t%d\n", mq_prio_max);
- printf("\t\tClock resolution:\t\t%lu nsec%s\n", res.tv_nsec,
+ printf("\t\tClock resolution:\t\t%d nsec%s\n", res.tv_nsec,
res.tv_nsec > 1 ? "s" : "");
@@ -454,20 +454,20 @@ void *perf_test_thread(void *arg)
recv_total.tv_nsec = 0;
for (i = 0; i < TEST1_LOOPS; i++)
do_send_recv();
- printf("\t\tSend msg:\t\t\t%ld.%lus total time\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) / TEST1_LOOPS;
- printf("\t\t\t\t\t\t%lld nsec/msg\n", nsec);
- printf("\t\tRecv msg:\t\t\t%ld.%lus total time\n",
+ 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%lld nsec/msg\n", nsec);
+ printf("\t\t\t\t\t\t%d nsec/msg\n", nsec);
for (cur_test = test2; cur_test->desc != NULL; cur_test++) {
- printf("%s:\n", cur_test->desc);
+ printf(cur_test->desc);
printf("\t\t(%d iterations)\n", TEST2_LOOPS);
prio_out = 0;
send_total.tv_sec = 0;
@@ -493,16 +493,16 @@ void *perf_test_thread(void *arg)
cur_test->func(&prio_out);
}
printf("done.\n");
- printf("\t\tSend msg:\t\t\t%ld.%lus total time\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%lld nsec/msg\n", nsec);
- printf("\t\tRecv msg:\t\t\t%ld.%lus total time\n",
+ 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%lld nsec/msg\n", nsec);
+ printf("\t\t\t\t\t\t%d nsec/msg\n", nsec);
printf("\t\tDraining queue...");
fflush(stdout);
clock_gettime(clock, &start);
@@ -653,10 +653,8 @@ int main(int argc, char *argv[])
/* 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%ld\n",
- (long) saved_limits.rlim_cur);
- printf("\tRLIMIT_MSGQUEUE(hard):\t\t\t%ld\n",
- (long) saved_limits.rlim_max);
+ 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);
@@ -669,10 +667,10 @@ int main(int argc, char *argv[])
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%ld\n",
- (long) cur_limits.rlim_cur);
- printf("\tRLIMIT_MSGQUEUE(hard):\t\t\t%ld\n",
- (long) cur_limits.rlim_max);
+ 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);
diff --git a/net/Makefile b/net/Makefile
index c7493b8..750512b 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -14,12 +14,6 @@ all: $(NET_PROGS)
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/powerpc/Makefile b/powerpc/Makefile
index 74a78ce..bd24ae5 100644
--- a/powerpc/Makefile
+++ b/powerpc/Makefile
@@ -13,14 +13,14 @@ CFLAGS := -Wall -O2 -flto -Wall -Werror -DGIT_VERSION='"$(GIT_VERSION)"' -I$(CUR
export CC CFLAGS
-TARGETS = pmu copyloops mm tm
+TARGETS = pmu
endif
-all: $(TARGETS)
-
-$(TARGETS):
- $(MAKE) -k -C $@ all
+all:
+ @for TARGET in $(TARGETS); do \
+ $(MAKE) -C $$TARGET all; \
+ done;
run_tests: all
@for TARGET in $(TARGETS); do \
@@ -36,4 +36,4 @@ clean:
tags:
find . -name '*.c' -o -name '*.h' | xargs ctags
-.PHONY: all run_tests clean tags $(TARGETS)
+.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
index 8ebc58a..e80c42a 100644
--- a/powerpc/harness.c
+++ b/powerpc/harness.c
@@ -30,15 +30,12 @@ int run_test(int (test_function)(void), char *name)
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;
@@ -53,20 +50,17 @@ wait:
if (terminated) {
printf("!! force killing %s\n", name);
- kill(-pid, SIGKILL);
+ kill(pid, SIGKILL);
return 1;
} else {
printf("!! killing %s\n", name);
- kill(-pid, SIGTERM);
+ 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 {
@@ -105,10 +99,7 @@ int test_harness(int (test_function)(void), char *name)
rc = run_test(test_function, name);
- if (rc == MAGIC_SKIP_RETURN_VALUE)
- test_skip(name);
- else
- test_finish(name, rc);
+ 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
index c9f4263..7216f00 100644
--- a/powerpc/pmu/Makefile
+++ b/powerpc/pmu/Makefile
@@ -1,12 +1,10 @@
noarg:
$(MAKE) -C ../
-PROGS := count_instructions l3_bank_test per_event_excludes
-EXTRA_SOURCES := ../harness.c event.c lib.c
+PROGS := count_instructions
+EXTRA_SOURCES := ../harness.c event.c
-SUB_TARGETS = ebb
-
-all: $(PROGS) $(SUB_TARGETS)
+all: $(PROGS)
$(PROGS): $(EXTRA_SOURCES)
@@ -14,25 +12,12 @@ $(PROGS): $(EXTRA_SOURCES)
count_instructions: loop.S count_instructions.c $(EXTRA_SOURCES)
$(CC) $(CFLAGS) -m64 -o $@ $^
-run_tests: all sub_run_tests
+run_tests: all
@-for PROG in $(PROGS); do \
./$$PROG; \
done;
-clean: sub_clean
+clean:
rm -f $(PROGS) loop.o
-$(SUB_TARGETS):
- $(MAKE) -k -C $@ all
-
-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_run_tests sub_clean $(SUB_TARGETS)
+.PHONY: all run_tests clean
diff --git a/powerpc/pmu/count_instructions.c b/powerpc/pmu/count_instructions.c
index 4622117..312b4f0 100644
--- a/powerpc/pmu/count_instructions.c
+++ b/powerpc/pmu/count_instructions.c
@@ -12,7 +12,6 @@
#include "event.h"
#include "utils.h"
-#include "lib.h"
extern void thirty_two_instruction_loop(u64 loops);
@@ -91,7 +90,7 @@ static u64 determine_overhead(struct event *events)
return overhead;
}
-static int test_body(void)
+static int count_instructions(void)
{
struct event events[2];
u64 overhead;
@@ -112,23 +111,17 @@ static int test_body(void)
overhead = determine_overhead(events);
printf("Overhead of null loop: %llu instructions\n", overhead);
- /* Run for 1Mi instructions */
- FAIL_IF(do_count_loop(events, 1000000, overhead, true));
-
- /* Run for 10Mi instructions */
- FAIL_IF(do_count_loop(events, 10000000, overhead, true));
-
- /* Run for 100Mi instructions */
- FAIL_IF(do_count_loop(events, 100000000, overhead, true));
+ /* Run for 1M instructions */
+ FAIL_IF(do_count_loop(events, 0x100000, overhead, true));
- /* Run for 1Bi instructions */
- FAIL_IF(do_count_loop(events, 1000000000, overhead, true));
+ /* Run for 10M instructions */
+ FAIL_IF(do_count_loop(events, 0xa00000, overhead, true));
- /* Run for 16Bi instructions */
- FAIL_IF(do_count_loop(events, 16000000000, overhead, true));
+ /* Run for 100M instructions */
+ FAIL_IF(do_count_loop(events, 0x6400000, overhead, true));
- /* Run for 64Bi instructions */
- FAIL_IF(do_count_loop(events, 64000000000, overhead, true));
+ /* Run for 1G instructions */
+ FAIL_IF(do_count_loop(events, 0x40000000, overhead, true));
event_close(&events[0]);
event_close(&events[1]);
@@ -136,11 +129,6 @@ static int test_body(void)
return 0;
}
-static int count_instructions(void)
-{
- return eat_cpu(test_body);
-}
-
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 3dc4332..0000000
--- a/powerpc/pmu/ebb/Makefile
+++ /dev/null
@@ -1,33 +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 \
- cycles_with_mmcr2_test
-
-all: $(PROGS)
-
-$(PROGS): ../../harness.c ../event.c ../lib.c ebb.c ebb_handler.S trace.c busy_loop.S
-
-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/busy_loop.S b/powerpc/pmu/ebb/busy_loop.S
deleted file mode 100644
index c7e4093..0000000
--- a/powerpc/pmu/ebb/busy_loop.S
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * Copyright 2014, Michael Ellerman, IBM Corp.
- * Licensed under GPLv2.
- */
-
-#include <ppc-asm.h>
-
- .text
-
-FUNC_START(core_busy_loop)
- stdu %r1, -168(%r1)
- std r14, 160(%r1)
- std r15, 152(%r1)
- std r16, 144(%r1)
- std r17, 136(%r1)
- std r18, 128(%r1)
- std r19, 120(%r1)
- std r20, 112(%r1)
- std r21, 104(%r1)
- std r22, 96(%r1)
- std r23, 88(%r1)
- std r24, 80(%r1)
- std r25, 72(%r1)
- std r26, 64(%r1)
- std r27, 56(%r1)
- std r28, 48(%r1)
- std r29, 40(%r1)
- std r30, 32(%r1)
- std r31, 24(%r1)
-
- li r3, 0x3030
- std r3, -96(%r1)
- li r4, 0x4040
- std r4, -104(%r1)
- li r5, 0x5050
- std r5, -112(%r1)
- li r6, 0x6060
- std r6, -120(%r1)
- li r7, 0x7070
- std r7, -128(%r1)
- li r8, 0x0808
- std r8, -136(%r1)
- li r9, 0x0909
- std r9, -144(%r1)
- li r10, 0x1010
- std r10, -152(%r1)
- li r11, 0x1111
- std r11, -160(%r1)
- li r14, 0x1414
- std r14, -168(%r1)
- li r15, 0x1515
- std r15, -176(%r1)
- li r16, 0x1616
- std r16, -184(%r1)
- li r17, 0x1717
- std r17, -192(%r1)
- li r18, 0x1818
- std r18, -200(%r1)
- li r19, 0x1919
- std r19, -208(%r1)
- li r20, 0x2020
- std r20, -216(%r1)
- li r21, 0x2121
- std r21, -224(%r1)
- li r22, 0x2222
- std r22, -232(%r1)
- li r23, 0x2323
- std r23, -240(%r1)
- li r24, 0x2424
- std r24, -248(%r1)
- li r25, 0x2525
- std r25, -256(%r1)
- li r26, 0x2626
- std r26, -264(%r1)
- li r27, 0x2727
- std r27, -272(%r1)
- li r28, 0x2828
- std r28, -280(%r1)
- li r29, 0x2929
- std r29, -288(%r1)
- li r30, 0x3030
- li r31, 0x3131
-
- li r3, 0
-0: addi r3, r3, 1
- cmpwi r3, 100
- blt 0b
-
- /* Return 1 (fail) unless we get through all the checks */
- li r3, 1
-
- /* Check none of our registers have been corrupted */
- cmpwi r4, 0x4040
- bne 1f
- cmpwi r5, 0x5050
- bne 1f
- cmpwi r6, 0x6060
- bne 1f
- cmpwi r7, 0x7070
- bne 1f
- cmpwi r8, 0x0808
- bne 1f
- cmpwi r9, 0x0909
- bne 1f
- cmpwi r10, 0x1010
- bne 1f
- cmpwi r11, 0x1111
- bne 1f
- cmpwi r14, 0x1414
- bne 1f
- cmpwi r15, 0x1515
- bne 1f
- cmpwi r16, 0x1616
- bne 1f
- cmpwi r17, 0x1717
- bne 1f
- cmpwi r18, 0x1818
- bne 1f
- cmpwi r19, 0x1919
- bne 1f
- cmpwi r20, 0x2020
- bne 1f
- cmpwi r21, 0x2121
- bne 1f
- cmpwi r22, 0x2222
- bne 1f
- cmpwi r23, 0x2323
- bne 1f
- cmpwi r24, 0x2424
- bne 1f
- cmpwi r25, 0x2525
- bne 1f
- cmpwi r26, 0x2626
- bne 1f
- cmpwi r27, 0x2727
- bne 1f
- cmpwi r28, 0x2828
- bne 1f
- cmpwi r29, 0x2929
- bne 1f
- cmpwi r30, 0x3030
- bne 1f
- cmpwi r31, 0x3131
- bne 1f
-
- /* Load junk into all our registers before we reload them from the stack. */
- li r3, 0xde
- li r4, 0xad
- li r5, 0xbe
- li r6, 0xef
- li r7, 0xde
- li r8, 0xad
- li r9, 0xbe
- li r10, 0xef
- li r11, 0xde
- li r14, 0xad
- li r15, 0xbe
- li r16, 0xef
- li r17, 0xde
- li r18, 0xad
- li r19, 0xbe
- li r20, 0xef
- li r21, 0xde
- li r22, 0xad
- li r23, 0xbe
- li r24, 0xef
- li r25, 0xde
- li r26, 0xad
- li r27, 0xbe
- li r28, 0xef
- li r29, 0xdd
-
- ld r3, -96(%r1)
- cmpwi r3, 0x3030
- bne 1f
- ld r4, -104(%r1)
- cmpwi r4, 0x4040
- bne 1f
- ld r5, -112(%r1)
- cmpwi r5, 0x5050
- bne 1f
- ld r6, -120(%r1)
- cmpwi r6, 0x6060
- bne 1f
- ld r7, -128(%r1)
- cmpwi r7, 0x7070
- bne 1f
- ld r8, -136(%r1)
- cmpwi r8, 0x0808
- bne 1f
- ld r9, -144(%r1)
- cmpwi r9, 0x0909
- bne 1f
- ld r10, -152(%r1)
- cmpwi r10, 0x1010
- bne 1f
- ld r11, -160(%r1)
- cmpwi r11, 0x1111
- bne 1f
- ld r14, -168(%r1)
- cmpwi r14, 0x1414
- bne 1f
- ld r15, -176(%r1)
- cmpwi r15, 0x1515
- bne 1f
- ld r16, -184(%r1)
- cmpwi r16, 0x1616
- bne 1f
- ld r17, -192(%r1)
- cmpwi r17, 0x1717
- bne 1f
- ld r18, -200(%r1)
- cmpwi r18, 0x1818
- bne 1f
- ld r19, -208(%r1)
- cmpwi r19, 0x1919
- bne 1f
- ld r20, -216(%r1)
- cmpwi r20, 0x2020
- bne 1f
- ld r21, -224(%r1)
- cmpwi r21, 0x2121
- bne 1f
- ld r22, -232(%r1)
- cmpwi r22, 0x2222
- bne 1f
- ld r23, -240(%r1)
- cmpwi r23, 0x2323
- bne 1f
- ld r24, -248(%r1)
- cmpwi r24, 0x2424
- bne 1f
- ld r25, -256(%r1)
- cmpwi r25, 0x2525
- bne 1f
- ld r26, -264(%r1)
- cmpwi r26, 0x2626
- bne 1f
- ld r27, -272(%r1)
- cmpwi r27, 0x2727
- bne 1f
- ld r28, -280(%r1)
- cmpwi r28, 0x2828
- bne 1f
- ld r29, -288(%r1)
- cmpwi r29, 0x2929
- bne 1f
-
- /* Load 0 (success) to return */
- li r3, 0
-
-1: ld r14, 160(%r1)
- ld r15, 152(%r1)
- ld r16, 144(%r1)
- ld r17, 136(%r1)
- ld r18, 128(%r1)
- ld r19, 120(%r1)
- ld r20, 112(%r1)
- ld r21, 104(%r1)
- ld r22, 96(%r1)
- ld r23, 88(%r1)
- ld r24, 80(%r1)
- ld r25, 72(%r1)
- ld r26, 64(%r1)
- ld r27, 56(%r1)
- ld r28, 48(%r1)
- ld r29, 40(%r1)
- ld r30, 32(%r1)
- ld r31, 24(%r1)
- addi %r1, %r1, 168
- blr
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/cycles_with_mmcr2_test.c b/powerpc/pmu/ebb/cycles_with_mmcr2_test.c
deleted file mode 100644
index d43029b..0000000
--- a/powerpc/pmu/ebb/cycles_with_mmcr2_test.c
+++ /dev/null
@@ -1,91 +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 manipulating the user accessible bits in MMCR2.
- */
-
-/* We use two values because the first freezes PMC1 and so we would get no EBBs */
-#define MMCR2_EXPECTED_1 0x4020100804020000UL /* (FC1P|FC2P|FC3P|FC4P|FC5P|FC6P) */
-#define MMCR2_EXPECTED_2 0x0020100804020000UL /* ( FC2P|FC3P|FC4P|FC5P|FC6P) */
-
-
-int cycles_with_mmcr2(void)
-{
- struct event event;
- uint64_t val, expected[2], actual;
- int i;
- bool bad_mmcr2;
-
- 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));
-
- /* XXX Set of MMCR2 must be after enable */
- expected[0] = MMCR2_EXPECTED_1;
- expected[1] = MMCR2_EXPECTED_2;
- i = 0;
- bad_mmcr2 = false;
-
- /* Make sure we loop until we take at least one EBB */
- while ((ebb_state.stats.ebb_count < 20 && !bad_mmcr2) ||
- ebb_state.stats.ebb_count < 1)
- {
- mtspr(SPRN_MMCR2, expected[i % 2]);
-
- FAIL_IF(core_busy_loop());
-
- val = mfspr(SPRN_MMCR2);
- if (val != expected[i % 2]) {
- bad_mmcr2 = true;
- actual = val;
- }
-
- i++;
- }
-
- 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);
-
- if (bad_mmcr2)
- printf("Bad MMCR2 value seen is 0x%lx\n", actual);
-
- FAIL_IF(bad_mmcr2);
-
- return 0;
-}
-
-int main(void)
-{
- return test_harness(cycles_with_mmcr2, "cycles_with_mmcr2");
-}
diff --git a/powerpc/pmu/ebb/ebb.c b/powerpc/pmu/ebb/ebb.c
deleted file mode 100644
index d7a72ce..0000000
--- a/powerpc/pmu/ebb/ebb.c
+++ /dev/null
@@ -1,478 +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" \
- "MMCR2 0x%016lx\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_MMCR2),
- 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 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 e44eee5..0000000
--- a/powerpc/pmu/ebb/ebb.h
+++ /dev/null
@@ -1,77 +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 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
index 184b368..2b2d11d 100644
--- a/powerpc/pmu/event.c
+++ b/powerpc/pmu/event.c
@@ -39,13 +39,7 @@ 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
@@ -65,16 +59,6 @@ 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);
@@ -85,16 +69,6 @@ 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);
diff --git a/powerpc/pmu/event.h b/powerpc/pmu/event.h
index a0ea6b1..e699319 100644
--- a/powerpc/pmu/event.h
+++ b/powerpc/pmu/event.h
@@ -29,12 +29,8 @@ 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);
diff --git a/powerpc/pmu/l3_bank_test.c b/powerpc/pmu/l3_bank_test.c
deleted file mode 100644
index 77472f3..0000000
--- a/powerpc/pmu/l3_bank_test.c
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2014, Michael Ellerman, IBM Corp.
- * Licensed under GPLv2.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "event.h"
-#include "utils.h"
-
-#define MALLOC_SIZE (0x10000 * 10) /* Ought to be enough .. */
-
-/*
- * Tests that the L3 bank handling is correct. We fixed it in commit e9aaac1.
- */
-static int l3_bank_test(void)
-{
- struct event event;
- char *p;
- int i;
-
- p = malloc(MALLOC_SIZE);
- FAIL_IF(!p);
-
- event_init(&event, 0x84918F);
-
- FAIL_IF(event_open(&event));
-
- for (i = 0; i < MALLOC_SIZE; i += 0x10000)
- p[i] = i;
-
- event_read(&event);
- event_report(&event);
-
- FAIL_IF(event.result.running == 0);
- FAIL_IF(event.result.enabled == 0);
-
- event_close(&event);
- free(p);
-
- return 0;
-}
-
-int main(void)
-{
- return test_harness(l3_bank_test, "l3_bank_test");
-}
diff --git a/powerpc/pmu/lib.c b/powerpc/pmu/lib.c
deleted file mode 100644
index 9768dea..0000000
--- a/powerpc/pmu/lib.c
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * Copyright 2014, Michael Ellerman, IBM Corp.
- * Licensed under GPLv2.
- */
-
-#define _GNU_SOURCE /* For CPU_ZERO etc. */
-
-#include <elf.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <link.h>
-#include <sched.h>
-#include <setjmp.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <sys/types.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)
-{
- unsigned long start, end;
- char execute, name[128];
- 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;
-}
-
-static char auxv[4096];
-
-void *get_auxv_entry(int type)
-{
- ElfW(auxv_t) *p;
- void *result;
- ssize_t num;
- int fd;
-
- fd = open("/proc/self/auxv", O_RDONLY);
- if (fd == -1) {
- perror("open");
- return NULL;
- }
-
- result = NULL;
-
- num = read(fd, auxv, sizeof(auxv));
- if (num < 0) {
- perror("read");
- goto out;
- }
-
- if (num > sizeof(auxv)) {
- printf("Overflowed auxv buffer\n");
- goto out;
- }
-
- p = (ElfW(auxv_t) *)auxv;
-
- while (p->a_type != AT_NULL) {
- if (p->a_type == type) {
- result = (void *)p->a_un.a_val;
- break;
- }
-
- p++;
- }
-out:
- close(fd);
- return result;
-}
diff --git a/powerpc/pmu/lib.h b/powerpc/pmu/lib.h
deleted file mode 100644
index 0f0339c..0000000
--- a/powerpc/pmu/lib.h
+++ /dev/null
@@ -1,42 +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);
-extern void *get_auxv_entry(int type);
-
-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
index 20c1f08..8820e3d 100644
--- a/powerpc/pmu/loop.S
+++ b/powerpc/pmu/loop.S
@@ -3,41 +3,44 @@
* Licensed under GPLv2.
*/
-#include <ppc-asm.h>
-
.text
-FUNC_START(thirty_two_instruction_loop)
- cmpdi r3,0
+ .global thirty_two_instruction_loop
+ .type .thirty_two_instruction_loop,@function
+ .section ".opd","aw",@progbits
+thirty_two_instruction_loop:
+ .quad .thirty_two_instruction_loop, .TOC.@tocbase, 0
+ .previous
+.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)
+ 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 .thirty_two_instruction_loop
diff --git a/powerpc/pmu/per_event_excludes.c b/powerpc/pmu/per_event_excludes.c
deleted file mode 100644
index fddbbc9..0000000
--- a/powerpc/pmu/per_event_excludes.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright 2014, Michael Ellerman, IBM Corp.
- * Licensed under GPLv2.
- */
-
-#define _GNU_SOURCE
-
-#include <elf.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdbool.h>
-#include <string.h>
-#include <sys/prctl.h>
-
-#include "event.h"
-#include "lib.h"
-#include "utils.h"
-
-/*
- * Test that per-event excludes work.
- */
-
-static int per_event_excludes(void)
-{
- struct event *e, events[4];
- char *platform;
- int i;
-
- platform = (char *)get_auxv_entry(AT_BASE_PLATFORM);
- FAIL_IF(!platform);
- SKIP_IF(strcmp(platform, "power8") != 0);
-
- /*
- * We need to create the events disabled, otherwise the running/enabled
- * counts don't match up.
- */
- e = &events[0];
- event_init_opts(e, PERF_COUNT_HW_INSTRUCTIONS,
- PERF_TYPE_HARDWARE, "instructions");
- e->attr.disabled = 1;
-
- e = &events[1];
- event_init_opts(e, PERF_COUNT_HW_INSTRUCTIONS,
- PERF_TYPE_HARDWARE, "instructions(k)");
- e->attr.disabled = 1;
- e->attr.exclude_user = 1;
- e->attr.exclude_hv = 1;
-
- e = &events[2];
- event_init_opts(e, PERF_COUNT_HW_INSTRUCTIONS,
- PERF_TYPE_HARDWARE, "instructions(h)");
- e->attr.disabled = 1;
- e->attr.exclude_user = 1;
- e->attr.exclude_kernel = 1;
-
- e = &events[3];
- event_init_opts(e, PERF_COUNT_HW_INSTRUCTIONS,
- PERF_TYPE_HARDWARE, "instructions(u)");
- e->attr.disabled = 1;
- e->attr.exclude_hv = 1;
- e->attr.exclude_kernel = 1;
-
- FAIL_IF(event_open(&events[0]));
-
- /*
- * The open here will fail if we don't have per event exclude support,
- * because the second event has an incompatible set of exclude settings
- * and we're asking for the events to be in a group.
- */
- for (i = 1; i < 4; i++)
- FAIL_IF(event_open_with_group(&events[i], events[0].fd));
-
- /*
- * Even though the above will fail without per-event excludes we keep
- * testing in order to be thorough.
- */
- prctl(PR_TASK_PERF_EVENTS_ENABLE);
-
- /* Spin for a while */
- for (i = 0; i < INT_MAX; i++)
- asm volatile("" : : : "memory");
-
- prctl(PR_TASK_PERF_EVENTS_DISABLE);
-
- for (i = 0; i < 4; i++) {
- FAIL_IF(event_read(&events[i]));
- event_report(&events[i]);
- }
-
- /*
- * We should see that all events have enabled == running. That
- * shows that they were all on the PMU at once.
- */
- for (i = 0; i < 4; i++)
- FAIL_IF(events[i].result.running != events[i].result.enabled);
-
- /*
- * We can also check that the result for instructions is >= all the
- * other counts. That's because it is counting all instructions while
- * the others are counting a subset.
- */
- for (i = 1; i < 4; i++)
- FAIL_IF(events[0].result.value < events[i].result.value);
-
- for (i = 0; i < 4; i++)
- event_close(&events[i]);
-
- return 0;
-}
-
-int main(void)
-{
- return test_harness(per_event_excludes, "per_event_excludes");
-}
diff --git a/powerpc/subunit.h b/powerpc/subunit.h
index 9c6c4e9..98a2292 100644
--- a/powerpc/subunit.h
+++ b/powerpc/subunit.h
@@ -26,11 +26,6 @@ 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);
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
index a93777a..5851c4b 100644
--- a/powerpc/utils.h
+++ b/powerpc/utils.h
@@ -31,19 +31,4 @@ do { \
} \
} 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/peeksiginfo.c b/ptrace/peeksiginfo.c
index c34cd8a..d46558b 100644
--- a/ptrace/peeksiginfo.c
+++ b/ptrace/peeksiginfo.c
@@ -31,10 +31,6 @@ static int sys_ptrace(int request, pid_t pid, void *addr, void *data)
#define TEST_SICODE_PRIV -1
#define TEST_SICODE_SHARE -2
-#ifndef PAGE_SIZE
-#define PAGE_SIZE sysconf(_SC_PAGESIZE)
-#endif
-
#define err(fmt, ...) \
fprintf(stderr, \
"Error (%s:%d): " fmt, \
diff --git a/rcutorture/bin/configinit.sh b/rcutorture/bin/configinit.sh
index 9c3f3d3..a1be6e6 100755
--- a/rcutorture/bin/configinit.sh
+++ b/rcutorture/bin/configinit.sh
@@ -62,7 +62,7 @@ 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
+make $buildloc 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
diff --git a/rcutorture/bin/functions.sh b/rcutorture/bin/functions.sh
index d01b865..587561d 100644
--- a/rcutorture/bin/functions.sh
+++ b/rcutorture/bin/functions.sh
@@ -76,39 +76,15 @@ configfrag_hotplug_cpu () {
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.
+# the kernel at hand. Override with the RCU_QEMU_CMD environment variable.
identify_qemu () {
local u="`file "$1"`"
- if test -n "$TORTURE_QEMU_CMD"
+ if test -n "$RCU_QEMU_CMD"
then
- echo $TORTURE_QEMU_CMD
+ echo $RCU_QEMU_CMD
elif echo $u | grep -q x86-64
then
echo qemu-system-x86_64
@@ -120,9 +96,8 @@ identify_qemu () {
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
+ # Use RCU_QEMU_CMD environment variable or appropriate
# argument to top-level script.
exit 1
fi
@@ -131,14 +106,14 @@ identify_qemu () {
# identify_qemu_append qemu-cmd
#
# Output arguments for the qemu "-append" string based on CPU type
-# and the TORTURE_QEMU_INTERACTIVE environment variable.
+# and the RCU_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"
+ if test -n "$RCU_QEMU_INTERACTIVE"
then
echo root=/dev/sda
else
@@ -148,8 +123,8 @@ identify_qemu_append () {
# identify_qemu_args qemu-cmd serial-file
#
-# Output arguments for qemu arguments based on the TORTURE_QEMU_MAC
-# and TORTURE_QEMU_INTERACTIVE environment variables.
+# Output arguments for qemu arguments based on the RCU_QEMU_MAC
+# and RCU_QEMU_INTERACTIVE environment variables.
identify_qemu_args () {
case "$1" in
qemu-system-x86_64|qemu-system-i386)
@@ -157,17 +132,17 @@ identify_qemu_args () {
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"
+ if test -n "$RCU_QEMU_INTERACTIVE" -a -n "$RCU_QEMU_MAC"
then
- echo -device spapr-vlan,netdev=net0,mac=$TORTURE_QEMU_MAC
+ echo -device spapr-vlan,netdev=net0,mac=$RCU_QEMU_MAC
echo -netdev bridge,br=br0,id=net0
- elif test -n "$TORTURE_QEMU_INTERACTIVE"
+ elif test -n "$RCU_QEMU_INTERACTIVE"
then
echo -net nic -net user
fi
;;
esac
- if test -n "$TORTURE_QEMU_INTERACTIVE"
+ if test -n "$RCU_QEMU_INTERACTIVE"
then
echo -monitor stdio -serial pty -S
else
diff --git a/rcutorture/bin/kvm-build.sh b/rcutorture/bin/kvm-build.sh
index 7c1e56b..197901e 100755
--- a/rcutorture/bin/kvm-build.sh
+++ b/rcutorture/bin/kvm-build.sh
@@ -45,9 +45,9 @@ T=/tmp/test-linux.sh.$$
trap 'rm -rf $T' 0
mkdir $T
-grep -v 'CONFIG_[A-Z]*_TORTURE_TEST' < ${config_template} > $T/config
+cat ${config_template} | grep -v CONFIG_RCU_TORTURE_TEST > $T/config
cat << ___EOF___ >> $T/config
-CONFIG_INITRAMFS_SOURCE="$TORTURE_INITRD"
+CONFIG_INITRAMFS_SOURCE="$RCU_INITRD"
CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_CONSOLE=y
___EOF___
@@ -60,7 +60,7 @@ then
exit 2
fi
ncpus=`cpus2use.sh`
-make O=$builddir -j$ncpus $TORTURE_KMAKE_ARG > $builddir/Make.out 2>&1
+make O=$builddir -j$ncpus $RCU_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
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
index 3f6c9b7..baef09f 100755
--- a/rcutorture/bin/kvm-recheck.sh
+++ b/rcutorture/bin/kvm-recheck.sh
@@ -1,6 +1,6 @@
#!/bin/bash
#
-# Given the results directories for previous KVM-based torture runs,
+# Given the results directories for previous KVM runs of rcutorture,
# check the build and console output for errors. Given a directory
# containing results directories, this recursively checks them all.
#
@@ -25,45 +25,20 @@
# 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"
+ configfile=`echo $i | sed -e 's/^.*\///'`
+ echo $configfile
+ configcheck.sh $i/.config $i/ConfigFragment
+ parse-build.sh $i/Make.out $configfile
+ parse-rcutorture.sh $i/console.log $configfile
+ parse-console.sh $i/console.log $configfile
+ if test -r $i/Warnings
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
- echo " $i"
- elif test -f "$i/buildonly"
- then
- echo Build-only run, no boot/test
- configcheck.sh $i/.config $i/ConfigFragment
- parse-build.sh $i/Make.out $configfile
- else
- print_bug Build failed
- echo " $i"
- fi
+ cat $i/Warnings
fi
done
done
diff --git a/rcutorture/bin/kvm-test-1-run.sh b/rcutorture/bin/kvm-test-1-rcu.sh
index 0f69dcb..151b237 100755
--- a/rcutorture/bin/kvm-test-1-run.sh
+++ b/rcutorture/bin/kvm-test-1-rcu.sh
@@ -6,15 +6,15 @@
# 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
+# Usage: sh kvm-test-1-rcu.sh config builddir resdir minutes qemu-args bootargs
#
-# 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.
+# qemu-args defaults to "" -- you will want "-nographic" if running headless.
+# bootargs defaults to "root=/dev/sda noapic selinux=0 console=ttyS0"
+# "initcall_debug debug rcutorture.stat_interval=15"
+# "rcutorture.shutdown_secs=$((minutes * 60))"
+# "rcutorture.rcutorture_runnable=1"
#
-# Anything you specify for either qemu-args or boot_args is appended to
+# Anything you specify for either qemu-args or bootargs is appended to
# the default values. The "-smp" value is deduced from the contents of
# the config fragment.
#
@@ -40,35 +40,32 @@
grace=120
-T=/tmp/kvm-test-1-run.sh.$$
+T=/tmp/kvm-test-1-rcu.sh.$$
trap 'rm -rf $T' 0
-touch $T
. $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"
+ echo "kvm-test-1-rcu.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"
+ echo "kvm-test-1-rcu.sh :$resdir: Not a writable directory, cannot build 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
+cat << '___EOF___' >> $T
+CONFIG_RCU_TORTURE_TEST=y
+___EOF___
# Optimizations below this point
# CONFIG_USB=n
# CONFIG_SECURITY=n
@@ -95,36 +92,15 @@ fi
# 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
+ cp $builddir/arch/x86/boot/bzImage $resdir
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
@@ -132,13 +108,12 @@ boot_args=$6
cd $KVM
kstarttime=`awk 'BEGIN { print systime() }' < /dev/null`
-if test -z "$TORTURE_BUILDONLY"
-then
- echo ' ---' `date`: Starting kernel
-fi
+echo ' ---' `date`: Starting kernel
+
+# Determine the appropriate flavor of qemu command.
+QEMU="`identify_qemu $builddir/vmlinux.o`"
# 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
@@ -158,42 +133,34 @@ 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`"
+# Generate CPU-hotplug boot parameters
+boot_args="`rcutorture_param_onoff "$boot_args" $builddir/.config`"
+# Generate rcu_barrier() boot parameter
+boot_args="`rcutorture_param_n_barrier_cbs "$boot_args"`"
+# Pull in standard rcutorture boot arguments
+boot_args="$boot_args rcutorture.stat_interval=15 rcutorture.shutdown_secs=$seconds rcutorture.rcutorture_runnable=1"
-if test -n "$TORTURE_BUILDONLY"
+echo $QEMU $qemu_args -m 512 -kernel $builddir/arch/x86/boot/bzImage -append \"$qemu_append $boot_args\" > $resdir/qemu-cmd
+if test -n "$RCU_BUILDONLY"
then
echo Build-only run specified, boot/test omitted.
- touch $resdir/buildonly
exit 0
fi
-echo $QEMU $qemu_args -m 512 -kernel $builddir/$BOOT_IMAGE -append \"$qemu_append $boot_args\" > $resdir/qemu-cmd
-( $QEMU $qemu_args -m 512 -kernel $builddir/$BOOT_IMAGE -append "$qemu_append $boot_args"; echo $? > $resdir/qemu-retval ) &
+$QEMU $qemu_args -m 512 -kernel $builddir/arch/x86/boot/bzImage -append "$qemu_append $boot_args" &
qemu_pid=$!
commandcompleted=0
echo Monitoring qemu job at pid $qemu_pid
-while :
+for ((i=0;i<$seconds;i++))
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
+ kruntime=`awk 'BEGIN { print systime() - '"$kstarttime"' }' < /dev/null`
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
@@ -203,25 +170,23 @@ done
if test $commandcompleted -eq 0
then
echo Grace period for qemu job at pid $qemu_pid
- while :
+ for ((i=0;i<=$grace;i++))
do
- kruntime=`awk 'BEGIN { print systime() - '"$kstarttime"' }' < /dev/null`
if kill -0 $qemu_pid > /dev/null 2>&1
then
- :
+ sleep 1
else
break
fi
- if test $kruntime -ge $((seconds + grace))
+ if test $i -eq $grace
then
+ kruntime=`awk 'BEGIN { print systime() - '"$kstarttime"' }'`
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-rcutorture.sh $resdir/console.log $title
parse-console.sh $resdir/console.log $title
diff --git a/rcutorture/bin/kvm.sh b/rcutorture/bin/kvm.sh
index 589e9c3..1b7923b 100644
--- a/rcutorture/bin/kvm.sh
+++ b/rcutorture/bin/kvm.sh
@@ -30,22 +30,14 @@
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
+builddir="${KVM}/b1"
+RCU_INITRD="$KVM/initrd"; export RCU_INITRD
+RCU_KMAKE_ARG=""; export RCU_KMAKE_ARG
resdir=""
configs=""
-cpus=0
ds=`date +%Y.%m.%d-%H:%M:%S`
kversion=""
@@ -54,13 +46,10 @@ kversion=""
usage () {
echo "Usage: $scriptname optional arguments:"
echo " --bootargs kernel-boot-arguments"
- echo " --bootimage relative-path-to-kernel-boot-image"
+ echo " --builddir absolute-pathname"
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"
@@ -70,7 +59,7 @@ usage () {
echo " --qemu-args qemu-system-..."
echo " --qemu-cmd qemu-system-..."
echo " --results absolute-pathname"
- echo " --torture rcu"
+ echo " --relbuilddir relative-pathname"
exit 1
}
@@ -79,53 +68,39 @@ do
case "$1" in
--bootargs)
checkarg --bootargs "(list of kernel boot arguments)" "$#" "$2" '.*' '^--'
- TORTURE_BOOTARGS="$2"
+ RCU_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"
+ --builddir)
+ checkarg --builddir "(absolute pathname)" "$#" "$2" '^/' '^error'
+ builddir=$2
+ gotbuilddir=1
shift
;;
--buildonly)
- TORTURE_BUILDONLY=1
+ RCU_BUILDONLY=1; export RCU_BUILDONLY
;;
--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
+ RCU_QEMU_INTERACTIVE=1; export RCU_QEMU_INTERACTIVE
;;
--kmake-arg)
checkarg --kmake-arg "(kernel make arguments)" $# "$2" '.*' '^error$'
- TORTURE_KMAKE_ARG="$2"
+ RCU_KMAKE_ARG="$2"; export RCU_KMAKE_ARG
shift
;;
--kversion)
@@ -135,20 +110,27 @@ do
;;
--mac)
checkarg --mac "(MAC address)" $# "$2" '^\([0-9a-fA-F]\{2\}:\)\{5\}[0-9a-fA-F]\{2\}$' error
- TORTURE_QEMU_MAC=$2
+ RCU_QEMU_MAC=$2; export RCU_QEMU_MAC
shift
;;
--no-initrd)
- TORTURE_INITRD=""; export TORTURE_INITRD
+ RCU_INITRD=""; export RCU_INITRD
;;
--qemu-args)
checkarg --qemu-args "-qemu args" $# "$2" '^-' '^error'
- TORTURE_QEMU_ARG="$2"
+ RCU_QEMU_ARG="$2"
shift
;;
--qemu-cmd)
checkarg --qemu-cmd "(qemu-system-...)" $# "$2" 'qemu-system-' '^--'
- TORTURE_QEMU_CMD="$2"
+ RCU_QEMU_CMD="$2"; export RCU_QEMU_CMD
+ shift
+ ;;
+ --relbuilddir)
+ checkarg --relbuilddir "(relative pathname)" "$#" "$2" '^[^/]*$' '^--'
+ relbuilddir=$2
+ gotrelbuilddir=1
+ builddir=${KVM}/${relbuilddir}
shift
;;
--results)
@@ -156,11 +138,6 @@ do
resdir=$2
shift
;;
- --torture)
- checkarg --torture "(suite name)" "$#" "$2" '^\(lock\|rcu\)$' '^--'
- TORTURE_SUITE=$2
- shift
- ;;
*)
echo Unknown argument $1
usage
@@ -169,7 +146,7 @@ do
shift
done
-CONFIGFRAG=${KVM}/configs/${TORTURE_SUITE}; export CONFIGFRAG
+CONFIGFRAG=${KVM}/configs; export CONFIGFRAG
KVPATH=${CONFIGFRAG}/$kversion; export KVPATH
if test -z "$configs"
@@ -180,234 +157,54 @@ 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"
+ if ! test -e $resdir
then
- echo $CF `configNR_CPUS.sh $CONFIGFRAG/$kversion/$CF` >> $T/cfgcpu
- else
- echo "The --configs file $CF does not exist, terminating."
- exit 1
+ mkdir $resdir || :
+ fi
+else
+ if ! test -e $resdir
+ then
+ mkdir -p "$resdir" || :
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++;
-}
+builddir=$KVM/b1
+if ! test -e $builddir
+then
+ mkdir $builddir || :
+fi
-# 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 = "(!)";
+for CF in $configs
+do
+ # Running TREE01 multiple times creates TREE01, TREE01.2, TREE01.3, ...
+ rd=$resdir/$ds/$CF
+ if test -d "${rd}"
+ then
+ n="`ls -d "${rd}"* | grep '\.[0-9]\+$' |
+ sed -e 's/^.*\.\([0-9]\+\)/\1/' |
+ sort -k1n | tail -1`"
+ if test -z "$n"
+ then
+ rd="${rd}.2"
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 "if test -z \"$TORTURE_BUILDONLY\""
- print "then"
- print "\techo ----", cfr[j], cpusr[j] ovf ": Starting kernel. `date`";
- print "\techo ----", cfr[j], cpusr[j] ovf ": Starting kernel. `date` >> " rd "/log";
- print "fi"
- }
- print "wait"
- print "if test -z \"$TORTURE_BUILDONLY\""
- print "then"
- print "\techo ---- All kernel runs complete. `date`";
- print "\techo ---- All kernel runs complete. `date` >> " rd "/log";
- print "fi"
- 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
+ n="`expr $n + 1`"
+ rd="${rd}.${n}"
+ fi
+ fi
+ mkdir "${rd}"
+ echo Results directory: $rd
+ kvm-test-1-rcu.sh $CONFIGFRAG/$kversion/$CF $builddir $rd $dur "-nographic $RCU_QEMU_ARG" "rcutorture.test_no_idle_hz=1 rcutorture.verbose=1 $RCU_BOOTARGS"
+done
+# 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
-cat << ___EOF___ >> $T/script
-echo
-echo
echo " --- `date` Test summary:"
-echo Results directory: $resdir/$ds
kvm-recheck.sh $resdir/$ds
-___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 dryrun, 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-torture.sh b/rcutorture/bin/parse-rcutorture.sh
index 3455560..dd0a275 100755
--- a/rcutorture/bin/parse-torture.sh
+++ b/rcutorture/bin/parse-rcutorture.sh
@@ -1,14 +1,14 @@
#!/bin/sh
#
-# Check the console output from a torture run for goodness.
+# Check the console 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 torture output, but can be interspersed
-# with other dmesg text, as in console-log output.
+# The file must contain rcutorture output, but can be interspersed
+# with other dmesg text.
#
# Usage:
-# sh parse-torture.sh file title
+# sh parse-rcutorture.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
@@ -28,7 +28,7 @@
#
# Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
-T=/tmp/parse-torture.sh.$$
+T=/tmp/parse-rcutorture.sh.$$
file="$1"
title="$2"
@@ -36,13 +36,13 @@ trap 'rm -f $T.seq' 0
. functions.sh
-# check for presence of torture output file.
+# check for presence of rcutorture.txt file
if test -f "$file" -a -r "$file"
then
:
else
- echo $title unreadable torture output file: $file
+ echo $title unreadable rcutorture.txt file: $file
exit 1
fi
@@ -76,9 +76,9 @@ BEGIN {
END {
if (badseq) {
if (badseqno1 == badseqno2 && badseqno2 == ver)
- print "GP HANG at " ver " torture stat " badseqnr;
+ print "RCU GP HANG at " ver " rcutorture stat " badseqnr;
else
- print "BAD SEQ " badseqno1 ":" badseqno2 " last:" ver " version " badseqnr;
+ print "BAD SEQ " badseqno1 ":" badseqno2 " last:" ver " RCU version " badseqnr;
}
}' > $T.seq
@@ -91,13 +91,13 @@ then
exit 2
fi
else
- if grep -q "_HOTPLUG:" $file
+ if grep -q RCU_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
+ echo $title no success message, `grep --binary-files=text 'ver:' $file | wc -l` successful RCU version messages
if test -s $T.seq
then
print_warning $title `cat $T.seq`
diff --git a/rcutorture/configs/rcu/CFLIST b/rcutorture/configs/CFLIST
index cd3d29c..cd3d29c 100644
--- a/rcutorture/configs/rcu/CFLIST
+++ b/rcutorture/configs/CFLIST
diff --git a/rcutorture/configs/rcu/SRCU-N b/rcutorture/configs/SRCU-N
index 9fbb41b..10a0e27 100644
--- a/rcutorture/configs/rcu/SRCU-N
+++ b/rcutorture/configs/SRCU-N
@@ -1,7 +1,8 @@
CONFIG_RCU_TRACE=n
CONFIG_SMP=y
-CONFIG_NR_CPUS=4
+CONFIG_NR_CPUS=8
CONFIG_HOTPLUG_CPU=y
CONFIG_PREEMPT_NONE=y
CONFIG_PREEMPT_VOLUNTARY=n
CONFIG_PREEMPT=n
+CONFIG_PRINTK_TIME=y
diff --git a/rcutorture/configs/rcu/SRCU-N.boot b/rcutorture/configs/SRCU-N.boot
index 238bfe3..238bfe3 100644
--- a/rcutorture/configs/rcu/SRCU-N.boot
+++ b/rcutorture/configs/SRCU-N.boot
diff --git a/rcutorture/configs/rcu/SRCU-P b/rcutorture/configs/SRCU-P
index 4b6f272..6650e00 100644
--- a/rcutorture/configs/rcu/SRCU-P
+++ b/rcutorture/configs/SRCU-P
@@ -5,3 +5,4 @@ CONFIG_HOTPLUG_CPU=y
CONFIG_PREEMPT_NONE=n
CONFIG_PREEMPT_VOLUNTARY=n
CONFIG_PREEMPT=y
+CONFIG_PRINTK_TIME=y
diff --git a/rcutorture/configs/rcu/SRCU-P.boot b/rcutorture/configs/SRCU-P.boot
index 238bfe3..238bfe3 100644
--- a/rcutorture/configs/rcu/SRCU-P.boot
+++ b/rcutorture/configs/SRCU-P.boot
diff --git a/rcutorture/configs/rcu/TINY01 b/rcutorture/configs/TINY01
index 0a63e07..0c2823f 100644
--- a/rcutorture/configs/rcu/TINY01
+++ b/rcutorture/configs/TINY01
@@ -10,3 +10,4 @@ CONFIG_RCU_TRACE=n
CONFIG_DEBUG_LOCK_ALLOC=n
CONFIG_DEBUG_OBJECTS_RCU_HEAD=n
CONFIG_PREEMPT_COUNT=n
+CONFIG_PRINTK_TIME=y
diff --git a/rcutorture/configs/rcu/TINY02 b/rcutorture/configs/TINY02
index f4feaee..e5072d7 100644
--- a/rcutorture/configs/rcu/TINY02
+++ b/rcutorture/configs/TINY02
@@ -10,3 +10,4 @@ CONFIG_RCU_TRACE=y
CONFIG_DEBUG_LOCK_ALLOC=y
CONFIG_DEBUG_OBJECTS_RCU_HEAD=n
CONFIG_PREEMPT_COUNT=y
+CONFIG_PRINTK_TIME=y
diff --git a/rcutorture/configs/rcu/TREE01 b/rcutorture/configs/TREE01
index 063b707..141119a 100644
--- a/rcutorture/configs/rcu/TREE01
+++ b/rcutorture/configs/TREE01
@@ -15,7 +15,9 @@ 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
+CONFIG_PRINTK_TIME=y
diff --git a/rcutorture/configs/rcu/TREE01.boot b/rcutorture/configs/TREE01.boot
index 0fc8a34..0fc8a34 100644
--- a/rcutorture/configs/rcu/TREE01.boot
+++ b/rcutorture/configs/TREE01.boot
diff --git a/rcutorture/configs/rcu/TREE02 b/rcutorture/configs/TREE02
index ea119ba..2d4d096 100644
--- a/rcutorture/configs/rcu/TREE02
+++ b/rcutorture/configs/TREE02
@@ -7,7 +7,7 @@ CONFIG_PREEMPT=y
CONFIG_HZ_PERIODIC=n
CONFIG_NO_HZ_IDLE=y
CONFIG_NO_HZ_FULL=n
-CONFIG_RCU_FAST_NO_HZ=n
+CONFIG_RCU_FAST_NO_HZ=n
CONFIG_RCU_TRACE=n
CONFIG_HOTPLUG_CPU=n
CONFIG_SUSPEND=n
@@ -18,7 +18,9 @@ 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
+CONFIG_PRINTK_TIME=y
diff --git a/rcutorture/configs/rcu/TREE03 b/rcutorture/configs/TREE03
index f4567fb..a47de5b 100644
--- a/rcutorture/configs/rcu/TREE03
+++ b/rcutorture/configs/TREE03
@@ -14,8 +14,10 @@ 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
+CONFIG_PRINTK_TIME=y
diff --git a/rcutorture/configs/rcu/TREE04 b/rcutorture/configs/TREE04
index 0a262fb..8d839b8 100644
--- a/rcutorture/configs/rcu/TREE04
+++ b/rcutorture/configs/TREE04
@@ -18,6 +18,8 @@ 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
+CONFIG_PRINTK_TIME=y
diff --git a/rcutorture/configs/rcu/TREE04.boot b/rcutorture/configs/TREE04.boot
index 0fc8a34..0fc8a34 100644
--- a/rcutorture/configs/rcu/TREE04.boot
+++ b/rcutorture/configs/TREE04.boot
diff --git a/rcutorture/configs/rcu/TREE05 b/rcutorture/configs/TREE05
index 3a06b97..b5ba72e 100644
--- a/rcutorture/configs/rcu/TREE05
+++ b/rcutorture/configs/TREE05
@@ -18,6 +18,8 @@ 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
+CONFIG_PRINTK_TIME=y
diff --git a/rcutorture/configs/rcu/TREE05.boot b/rcutorture/configs/TREE05.boot
index 3b42b8b..3b42b8b 100644
--- a/rcutorture/configs/rcu/TREE05.boot
+++ b/rcutorture/configs/TREE05.boot
diff --git a/rcutorture/configs/rcu/TREE06 b/rcutorture/configs/TREE06
index 8f084cc..7c95ab4 100644
--- a/rcutorture/configs/rcu/TREE06
+++ b/rcutorture/configs/TREE06
@@ -19,6 +19,8 @@ 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
+CONFIG_PRINTK_TIME=y
diff --git a/rcutorture/configs/rcu/TREE07 b/rcutorture/configs/TREE07
index ab62255..1467404 100644
--- a/rcutorture/configs/rcu/TREE07
+++ b/rcutorture/configs/TREE07
@@ -17,6 +17,8 @@ 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
+CONFIG_PRINTK_TIME=y
diff --git a/rcutorture/configs/rcu/TREE08 b/rcutorture/configs/TREE08
index 69a2e25..7d097a6 100644
--- a/rcutorture/configs/rcu/TREE08
+++ b/rcutorture/configs/TREE08
@@ -18,7 +18,9 @@ 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
+CONFIG_PRINTK_TIME=y
diff --git a/rcutorture/configs/rcu/TREE08-T b/rcutorture/configs/TREE08-T
index a0f32fb..442c4e4 100644
--- a/rcutorture/configs/rcu/TREE08-T
+++ b/rcutorture/configs/TREE08-T
@@ -18,7 +18,9 @@ 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
+CONFIG_PRINTK_TIME=y
diff --git a/rcutorture/configs/rcu/TREE09 b/rcutorture/configs/TREE09
index b7a62a5..0d1ec0d 100644
--- a/rcutorture/configs/rcu/TREE09
+++ b/rcutorture/configs/TREE09
@@ -13,7 +13,9 @@ 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
+CONFIG_PRINTK_TIME=y
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/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/TREE02-T b/rcutorture/configs/rcu/TREE02-T
deleted file mode 100644
index 19cf948..0000000
--- a/rcutorture/configs/rcu/TREE02-T
+++ /dev/null
@@ -1,24 +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_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/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/v0.0/CFLIST b/rcutorture/configs/v0.0/CFLIST
index 1822394..1822394 100644
--- a/rcutorture/configs/rcu/v0.0/CFLIST
+++ b/rcutorture/configs/v0.0/CFLIST
diff --git a/rcutorture/configs/rcu/v0.0/N1-S-T-NH-SD-SMP-HP b/rcutorture/configs/v0.0/N1-S-T-NH-SD-SMP-HP
index d3ef873..d3ef873 100644
--- a/rcutorture/configs/rcu/v0.0/N1-S-T-NH-SD-SMP-HP
+++ b/rcutorture/configs/v0.0/N1-S-T-NH-SD-SMP-HP
diff --git a/rcutorture/configs/rcu/v0.0/N2-2-t-nh-sd-SMP-hp b/rcutorture/configs/v0.0/N2-2-t-nh-sd-SMP-hp
index 02e4185..02e4185 100644
--- a/rcutorture/configs/rcu/v0.0/N2-2-t-nh-sd-SMP-hp
+++ b/rcutorture/configs/v0.0/N2-2-t-nh-sd-SMP-hp
diff --git a/rcutorture/configs/rcu/v0.0/N3-3-T-nh-SD-SMP-hp b/rcutorture/configs/v0.0/N3-3-T-nh-SD-SMP-hp
index b3100f6..b3100f6 100644
--- a/rcutorture/configs/rcu/v0.0/N3-3-T-nh-SD-SMP-hp
+++ b/rcutorture/configs/v0.0/N3-3-T-nh-SD-SMP-hp
diff --git a/rcutorture/configs/rcu/v0.0/N4-A-t-NH-sd-SMP-HP b/rcutorture/configs/v0.0/N4-A-t-NH-sd-SMP-HP
index c56b445..c56b445 100644
--- a/rcutorture/configs/rcu/v0.0/N4-A-t-NH-sd-SMP-HP
+++ b/rcutorture/configs/v0.0/N4-A-t-NH-sd-SMP-HP
diff --git a/rcutorture/configs/rcu/v0.0/N5-U-T-NH-sd-SMP-hp b/rcutorture/configs/v0.0/N5-U-T-NH-sd-SMP-hp
index 90d924f..90d924f 100644
--- a/rcutorture/configs/rcu/v0.0/N5-U-T-NH-sd-SMP-hp
+++ b/rcutorture/configs/v0.0/N5-U-T-NH-sd-SMP-hp
diff --git a/rcutorture/configs/rcu/v0.0/NT1-nh b/rcutorture/configs/v0.0/NT1-nh
index 023f312..023f312 100644
--- a/rcutorture/configs/rcu/v0.0/NT1-nh
+++ b/rcutorture/configs/v0.0/NT1-nh
diff --git a/rcutorture/configs/rcu/v0.0/NT3-NH b/rcutorture/configs/v0.0/NT3-NH
index 6fd0235..6fd0235 100644
--- a/rcutorture/configs/rcu/v0.0/NT3-NH
+++ b/rcutorture/configs/v0.0/NT3-NH
diff --git a/rcutorture/configs/rcu/v0.0/P1-S-T-NH-SD-SMP-HP b/rcutorture/configs/v0.0/P1-S-T-NH-SD-SMP-HP
index f72402d..f72402d 100644
--- a/rcutorture/configs/rcu/v0.0/P1-S-T-NH-SD-SMP-HP
+++ b/rcutorture/configs/v0.0/P1-S-T-NH-SD-SMP-HP
diff --git a/rcutorture/configs/rcu/v0.0/P2-2-t-nh-sd-SMP-hp b/rcutorture/configs/v0.0/P2-2-t-nh-sd-SMP-hp
index 0f3b667..0f3b667 100644
--- a/rcutorture/configs/rcu/v0.0/P2-2-t-nh-sd-SMP-hp
+++ b/rcutorture/configs/v0.0/P2-2-t-nh-sd-SMP-hp
diff --git a/rcutorture/configs/rcu/v0.0/P3-3-T-nh-SD-SMP-hp b/rcutorture/configs/v0.0/P3-3-T-nh-SD-SMP-hp
index b035e14..b035e14 100644
--- a/rcutorture/configs/rcu/v0.0/P3-3-T-nh-SD-SMP-hp
+++ b/rcutorture/configs/v0.0/P3-3-T-nh-SD-SMP-hp
diff --git a/rcutorture/configs/rcu/v0.0/P4-A-t-NH-sd-SMP-HP b/rcutorture/configs/v0.0/P4-A-t-NH-sd-SMP-HP
index 3ccf6a9..3ccf6a9 100644
--- a/rcutorture/configs/rcu/v0.0/P4-A-t-NH-sd-SMP-HP
+++ b/rcutorture/configs/v0.0/P4-A-t-NH-sd-SMP-HP
diff --git a/rcutorture/configs/rcu/v3.12/P5-U-T-NH-sd-SMP-hp b/rcutorture/configs/v0.0/P5-U-T-NH-sd-SMP-hp
index a55c008..ef624ce 100644
--- a/rcutorture/configs/rcu/v3.12/P5-U-T-NH-sd-SMP-hp
+++ b/rcutorture/configs/v0.0/P5-U-T-NH-sd-SMP-hp
@@ -13,6 +13,7 @@ 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
diff --git a/rcutorture/configs/rcu/v0.0/PT1-nh b/rcutorture/configs/v0.0/PT1-nh
index e3361c3..e3361c3 100644
--- a/rcutorture/configs/rcu/v0.0/PT1-nh
+++ b/rcutorture/configs/v0.0/PT1-nh
diff --git a/rcutorture/configs/rcu/v0.0/PT2-NH b/rcutorture/configs/v0.0/PT2-NH
index 64abfc3..64abfc3 100644
--- a/rcutorture/configs/rcu/v0.0/PT2-NH
+++ b/rcutorture/configs/v0.0/PT2-NH
diff --git a/rcutorture/configs/rcu/v0.0/ver_functions.sh b/rcutorture/configs/v0.0/ver_functions.sh
index 5ace37a..e805253 100644
--- a/rcutorture/configs/rcu/v0.0/ver_functions.sh
+++ b/rcutorture/configs/v0.0/ver_functions.sh
@@ -20,14 +20,16 @@
#
# 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
+# rcutorture_param_n_barrier_cbs bootparam-string
+#
+# Adds n_barrier_cbs rcutorture module parameter to kernels having it.
+rcutorture_param_n_barrier_cbs () {
+ echo $1
+}
+
+# rcutorture_param_onoff bootparam-string config-file
+#
+# Adds onoff rcutorture module parameters to kernels having it.
+rcutorture_param_onoff () {
+ echo $1
}
diff --git a/rcutorture/configs/rcu/v3.12/CFLIST b/rcutorture/configs/v3.12/CFLIST
index da4cbc6..da4cbc6 100644
--- a/rcutorture/configs/rcu/v3.12/CFLIST
+++ b/rcutorture/configs/v3.12/CFLIST
diff --git a/rcutorture/configs/rcu/v3.12/N1-S-T-NH-SD-SMP-HP b/rcutorture/configs/v3.12/N1-S-T-NH-SD-SMP-HP
index d81e11d..d81e11d 100644
--- a/rcutorture/configs/rcu/v3.12/N1-S-T-NH-SD-SMP-HP
+++ b/rcutorture/configs/v3.12/N1-S-T-NH-SD-SMP-HP
diff --git a/rcutorture/configs/rcu/v3.12/N2-2-t-nh-sd-SMP-hp b/rcutorture/configs/v3.12/N2-2-t-nh-sd-SMP-hp
index 02e4185..02e4185 100644
--- a/rcutorture/configs/rcu/v3.12/N2-2-t-nh-sd-SMP-hp
+++ b/rcutorture/configs/v3.12/N2-2-t-nh-sd-SMP-hp
diff --git a/rcutorture/configs/rcu/v3.12/N3-3-T-nh-SD-SMP-hp b/rcutorture/configs/v3.12/N3-3-T-nh-SD-SMP-hp
index b3100f6..b3100f6 100644
--- a/rcutorture/configs/rcu/v3.12/N3-3-T-nh-SD-SMP-hp
+++ b/rcutorture/configs/v3.12/N3-3-T-nh-SD-SMP-hp
diff --git a/rcutorture/configs/rcu/v3.12/N4-A-t-NH-sd-SMP-HP b/rcutorture/configs/v3.12/N4-A-t-NH-sd-SMP-HP
index c56b445..c56b445 100644
--- a/rcutorture/configs/rcu/v3.12/N4-A-t-NH-sd-SMP-HP
+++ b/rcutorture/configs/v3.12/N4-A-t-NH-sd-SMP-HP
diff --git a/rcutorture/configs/rcu/v3.12/N5-U-T-NH-sd-SMP-hp b/rcutorture/configs/v3.12/N5-U-T-NH-sd-SMP-hp
index 90d924f..90d924f 100644
--- a/rcutorture/configs/rcu/v3.12/N5-U-T-NH-sd-SMP-hp
+++ b/rcutorture/configs/v3.12/N5-U-T-NH-sd-SMP-hp
diff --git a/rcutorture/configs/rcu/v3.12/N6---t-nh-SD-smp-hp b/rcutorture/configs/v3.12/N6---t-nh-SD-smp-hp
index 0ccc36d..0ccc36d 100644
--- a/rcutorture/configs/rcu/v3.12/N6---t-nh-SD-smp-hp
+++ b/rcutorture/configs/v3.12/N6---t-nh-SD-smp-hp
diff --git a/rcutorture/configs/rcu/v3.12/N7-4-T-NH-SD-SMP-HP b/rcutorture/configs/v3.12/N7-4-T-NH-SD-SMP-HP
index 3f640cf..3f640cf 100644
--- a/rcutorture/configs/rcu/v3.12/N7-4-T-NH-SD-SMP-HP
+++ b/rcutorture/configs/v3.12/N7-4-T-NH-SD-SMP-HP
diff --git a/rcutorture/configs/rcu/v3.12/N8-2-T-NH-SD-SMP-HP b/rcutorture/configs/v3.12/N8-2-T-NH-SD-SMP-HP
index 285da2d..285da2d 100644
--- a/rcutorture/configs/rcu/v3.12/N8-2-T-NH-SD-SMP-HP
+++ b/rcutorture/configs/v3.12/N8-2-T-NH-SD-SMP-HP
diff --git a/rcutorture/configs/rcu/v3.12/NT1-nh b/rcutorture/configs/v3.12/NT1-nh
index 023f312..023f312 100644
--- a/rcutorture/configs/rcu/v3.12/NT1-nh
+++ b/rcutorture/configs/v3.12/NT1-nh
diff --git a/rcutorture/configs/rcu/v3.12/NT3-NH b/rcutorture/configs/v3.12/NT3-NH
index 6fd0235..6fd0235 100644
--- a/rcutorture/configs/rcu/v3.12/NT3-NH
+++ b/rcutorture/configs/v3.12/NT3-NH
diff --git a/rcutorture/configs/rcu/v3.12/P1-S-T-NH-SD-SMP-HP b/rcutorture/configs/v3.12/P1-S-T-NH-SD-SMP-HP
index 9647c44..9647c44 100644
--- a/rcutorture/configs/rcu/v3.12/P1-S-T-NH-SD-SMP-HP
+++ b/rcutorture/configs/v3.12/P1-S-T-NH-SD-SMP-HP
diff --git a/rcutorture/configs/rcu/v3.12/P2-2-t-nh-sd-SMP-hp b/rcutorture/configs/v3.12/P2-2-t-nh-sd-SMP-hp
index 0f3b667..0f3b667 100644
--- a/rcutorture/configs/rcu/v3.12/P2-2-t-nh-sd-SMP-hp
+++ b/rcutorture/configs/v3.12/P2-2-t-nh-sd-SMP-hp
diff --git a/rcutorture/configs/rcu/v3.12/P3-3-T-nh-SD-SMP-hp b/rcutorture/configs/v3.12/P3-3-T-nh-SD-SMP-hp
index b035e14..b035e14 100644
--- a/rcutorture/configs/rcu/v3.12/P3-3-T-nh-SD-SMP-hp
+++ b/rcutorture/configs/v3.12/P3-3-T-nh-SD-SMP-hp
diff --git a/rcutorture/configs/rcu/v3.12/P4-A-t-NH-sd-SMP-HP b/rcutorture/configs/v3.12/P4-A-t-NH-sd-SMP-HP
index 3ccf6a9..3ccf6a9 100644
--- a/rcutorture/configs/rcu/v3.12/P4-A-t-NH-sd-SMP-HP
+++ b/rcutorture/configs/v3.12/P4-A-t-NH-sd-SMP-HP
diff --git a/rcutorture/configs/rcu/v3.5/P5-U-T-NH-sd-SMP-hp b/rcutorture/configs/v3.12/P5-U-T-NH-sd-SMP-hp
index a55c008..ef624ce 100644
--- a/rcutorture/configs/rcu/v3.5/P5-U-T-NH-sd-SMP-hp
+++ b/rcutorture/configs/v3.12/P5-U-T-NH-sd-SMP-hp
@@ -13,6 +13,7 @@ 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
diff --git a/rcutorture/configs/rcu/v3.12/P6---t-nh-SD-smp-hp b/rcutorture/configs/v3.12/P6---t-nh-SD-smp-hp
index f4c9175..f4c9175 100644
--- a/rcutorture/configs/rcu/v3.12/P6---t-nh-SD-smp-hp
+++ b/rcutorture/configs/v3.12/P6---t-nh-SD-smp-hp
diff --git a/rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-HP b/rcutorture/configs/v3.12/P7-4-T-NH-SD-SMP-HP
index 77a8c5b..77a8c5b 100644
--- a/rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-HP
+++ b/rcutorture/configs/v3.12/P7-4-T-NH-SD-SMP-HP
diff --git a/rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-HP-all b/rcutorture/configs/v3.12/P7-4-T-NH-SD-SMP-HP-all
index 0eecebc..0eecebc 100644
--- a/rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-HP-all
+++ b/rcutorture/configs/v3.12/P7-4-T-NH-SD-SMP-HP-all
diff --git a/rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-HP-none b/rcutorture/configs/v3.12/P7-4-T-NH-SD-SMP-HP-none
index 0eecebc..0eecebc 100644
--- a/rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-HP-none
+++ b/rcutorture/configs/v3.12/P7-4-T-NH-SD-SMP-HP-none
diff --git a/rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-hp b/rcutorture/configs/v3.12/P7-4-T-NH-SD-SMP-hp
index 588bc70..588bc70 100644
--- a/rcutorture/configs/rcu/v3.12/P7-4-T-NH-SD-SMP-hp
+++ b/rcutorture/configs/v3.12/P7-4-T-NH-SD-SMP-hp
diff --git a/rcutorture/configs/rcu/v3.12/PT1-nh b/rcutorture/configs/v3.12/PT1-nh
index e3361c3..e3361c3 100644
--- a/rcutorture/configs/rcu/v3.12/PT1-nh
+++ b/rcutorture/configs/v3.12/PT1-nh
diff --git a/rcutorture/configs/rcu/v3.12/PT2-NH b/rcutorture/configs/v3.12/PT2-NH
index 64abfc3..64abfc3 100644
--- a/rcutorture/configs/rcu/v3.12/PT2-NH
+++ b/rcutorture/configs/v3.12/PT2-NH
diff --git a/rcutorture/configs/rcu/v3.3/CFLIST b/rcutorture/configs/v3.3/CFLIST
index 1822394..1822394 100644
--- a/rcutorture/configs/rcu/v3.3/CFLIST
+++ b/rcutorture/configs/v3.3/CFLIST
diff --git a/rcutorture/configs/rcu/v3.3/N1-S-T-NH-SD-SMP-HP b/rcutorture/configs/v3.3/N1-S-T-NH-SD-SMP-HP
index d81e11d..d81e11d 100644
--- a/rcutorture/configs/rcu/v3.3/N1-S-T-NH-SD-SMP-HP
+++ b/rcutorture/configs/v3.3/N1-S-T-NH-SD-SMP-HP
diff --git a/rcutorture/configs/rcu/v3.3/N2-2-t-nh-sd-SMP-hp b/rcutorture/configs/v3.3/N2-2-t-nh-sd-SMP-hp
index 02e4185..02e4185 100644
--- a/rcutorture/configs/rcu/v3.3/N2-2-t-nh-sd-SMP-hp
+++ b/rcutorture/configs/v3.3/N2-2-t-nh-sd-SMP-hp
diff --git a/rcutorture/configs/rcu/v3.3/N3-3-T-nh-SD-SMP-hp b/rcutorture/configs/v3.3/N3-3-T-nh-SD-SMP-hp
index b3100f6..b3100f6 100644
--- a/rcutorture/configs/rcu/v3.3/N3-3-T-nh-SD-SMP-hp
+++ b/rcutorture/configs/v3.3/N3-3-T-nh-SD-SMP-hp
diff --git a/rcutorture/configs/rcu/v3.3/N4-A-t-NH-sd-SMP-HP b/rcutorture/configs/v3.3/N4-A-t-NH-sd-SMP-HP
index c56b445..c56b445 100644
--- a/rcutorture/configs/rcu/v3.3/N4-A-t-NH-sd-SMP-HP
+++ b/rcutorture/configs/v3.3/N4-A-t-NH-sd-SMP-HP
diff --git a/rcutorture/configs/rcu/v3.3/N5-U-T-NH-sd-SMP-hp b/rcutorture/configs/v3.3/N5-U-T-NH-sd-SMP-hp
index 90d924f..90d924f 100644
--- a/rcutorture/configs/rcu/v3.3/N5-U-T-NH-sd-SMP-hp
+++ b/rcutorture/configs/v3.3/N5-U-T-NH-sd-SMP-hp
diff --git a/rcutorture/configs/rcu/v3.3/NT1-nh b/rcutorture/configs/v3.3/NT1-nh
index 023f312..023f312 100644
--- a/rcutorture/configs/rcu/v3.3/NT1-nh
+++ b/rcutorture/configs/v3.3/NT1-nh
diff --git a/rcutorture/configs/rcu/v3.3/NT3-NH b/rcutorture/configs/v3.3/NT3-NH
index 6fd0235..6fd0235 100644
--- a/rcutorture/configs/rcu/v3.3/NT3-NH
+++ b/rcutorture/configs/v3.3/NT3-NH
diff --git a/rcutorture/configs/rcu/v3.3/P1-S-T-NH-SD-SMP-HP b/rcutorture/configs/v3.3/P1-S-T-NH-SD-SMP-HP
index 9647c44..9647c44 100644
--- a/rcutorture/configs/rcu/v3.3/P1-S-T-NH-SD-SMP-HP
+++ b/rcutorture/configs/v3.3/P1-S-T-NH-SD-SMP-HP
diff --git a/rcutorture/configs/rcu/v3.3/P2-2-t-nh-sd-SMP-hp b/rcutorture/configs/v3.3/P2-2-t-nh-sd-SMP-hp
index 0f3b667..0f3b667 100644
--- a/rcutorture/configs/rcu/v3.3/P2-2-t-nh-sd-SMP-hp
+++ b/rcutorture/configs/v3.3/P2-2-t-nh-sd-SMP-hp
diff --git a/rcutorture/configs/rcu/v3.3/P3-3-T-nh-SD-SMP-hp b/rcutorture/configs/v3.3/P3-3-T-nh-SD-SMP-hp
index b035e14..b035e14 100644
--- a/rcutorture/configs/rcu/v3.3/P3-3-T-nh-SD-SMP-hp
+++ b/rcutorture/configs/v3.3/P3-3-T-nh-SD-SMP-hp
diff --git a/rcutorture/configs/rcu/v3.3/P4-A-t-NH-sd-SMP-HP b/rcutorture/configs/v3.3/P4-A-t-NH-sd-SMP-HP
index 3ccf6a9..3ccf6a9 100644
--- a/rcutorture/configs/rcu/v3.3/P4-A-t-NH-sd-SMP-HP
+++ b/rcutorture/configs/v3.3/P4-A-t-NH-sd-SMP-HP
diff --git a/rcutorture/configs/rcu/v3.3/P5-U-T-NH-sd-SMP-hp b/rcutorture/configs/v3.3/P5-U-T-NH-sd-SMP-hp
index a55c008..ef624ce 100644
--- a/rcutorture/configs/rcu/v3.3/P5-U-T-NH-sd-SMP-hp
+++ b/rcutorture/configs/v3.3/P5-U-T-NH-sd-SMP-hp
@@ -13,6 +13,7 @@ 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
diff --git a/rcutorture/configs/rcu/v3.3/PT1-nh b/rcutorture/configs/v3.3/PT1-nh
index e3361c3..e3361c3 100644
--- a/rcutorture/configs/rcu/v3.3/PT1-nh
+++ b/rcutorture/configs/v3.3/PT1-nh
diff --git a/rcutorture/configs/rcu/v3.3/PT2-NH b/rcutorture/configs/v3.3/PT2-NH
index 64abfc3..64abfc3 100644
--- a/rcutorture/configs/rcu/v3.3/PT2-NH
+++ b/rcutorture/configs/v3.3/PT2-NH
diff --git a/rcutorture/configs/rcu/ver_functions.sh b/rcutorture/configs/v3.3/ver_functions.sh
index 8977d8d..c37432f 100644
--- a/rcutorture/configs/rcu/ver_functions.sh
+++ b/rcutorture/configs/v3.3/ver_functions.sh
@@ -24,12 +24,7 @@
#
# 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
+ echo $1
}
# rcutorture_param_onoff bootparam-string config-file
@@ -38,20 +33,9 @@ rcutorture_param_n_barrier_cbs () {
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
+ echo CPU-hotplug kernel, adding rcutorture onoff.
+ echo $1 rcutorture.onoff_interval=3 rcutorture.onoff_holdoff=30
+ else
+ echo $1
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/v3.5/CFLIST b/rcutorture/configs/v3.5/CFLIST
index 1822394..1822394 100644
--- a/rcutorture/configs/rcu/v3.5/CFLIST
+++ b/rcutorture/configs/v3.5/CFLIST
diff --git a/rcutorture/configs/rcu/v3.5/N1-S-T-NH-SD-SMP-HP b/rcutorture/configs/v3.5/N1-S-T-NH-SD-SMP-HP
index d81e11d..d81e11d 100644
--- a/rcutorture/configs/rcu/v3.5/N1-S-T-NH-SD-SMP-HP
+++ b/rcutorture/configs/v3.5/N1-S-T-NH-SD-SMP-HP
diff --git a/rcutorture/configs/rcu/v3.5/N2-2-t-nh-sd-SMP-hp b/rcutorture/configs/v3.5/N2-2-t-nh-sd-SMP-hp
index 02e4185..02e4185 100644
--- a/rcutorture/configs/rcu/v3.5/N2-2-t-nh-sd-SMP-hp
+++ b/rcutorture/configs/v3.5/N2-2-t-nh-sd-SMP-hp
diff --git a/rcutorture/configs/rcu/v3.5/N3-3-T-nh-SD-SMP-hp b/rcutorture/configs/v3.5/N3-3-T-nh-SD-SMP-hp
index b3100f6..b3100f6 100644
--- a/rcutorture/configs/rcu/v3.5/N3-3-T-nh-SD-SMP-hp
+++ b/rcutorture/configs/v3.5/N3-3-T-nh-SD-SMP-hp
diff --git a/rcutorture/configs/rcu/v3.5/N4-A-t-NH-sd-SMP-HP b/rcutorture/configs/v3.5/N4-A-t-NH-sd-SMP-HP
index c56b445..c56b445 100644
--- a/rcutorture/configs/rcu/v3.5/N4-A-t-NH-sd-SMP-HP
+++ b/rcutorture/configs/v3.5/N4-A-t-NH-sd-SMP-HP
diff --git a/rcutorture/configs/rcu/v3.5/N5-U-T-NH-sd-SMP-hp b/rcutorture/configs/v3.5/N5-U-T-NH-sd-SMP-hp
index 90d924f..90d924f 100644
--- a/rcutorture/configs/rcu/v3.5/N5-U-T-NH-sd-SMP-hp
+++ b/rcutorture/configs/v3.5/N5-U-T-NH-sd-SMP-hp
diff --git a/rcutorture/configs/rcu/v3.5/NT1-nh b/rcutorture/configs/v3.5/NT1-nh
index 023f312..023f312 100644
--- a/rcutorture/configs/rcu/v3.5/NT1-nh
+++ b/rcutorture/configs/v3.5/NT1-nh
diff --git a/rcutorture/configs/rcu/v3.5/NT3-NH b/rcutorture/configs/v3.5/NT3-NH
index 6fd0235..6fd0235 100644
--- a/rcutorture/configs/rcu/v3.5/NT3-NH
+++ b/rcutorture/configs/v3.5/NT3-NH
diff --git a/rcutorture/configs/rcu/v3.5/P1-S-T-NH-SD-SMP-HP b/rcutorture/configs/v3.5/P1-S-T-NH-SD-SMP-HP
index 9647c44..9647c44 100644
--- a/rcutorture/configs/rcu/v3.5/P1-S-T-NH-SD-SMP-HP
+++ b/rcutorture/configs/v3.5/P1-S-T-NH-SD-SMP-HP
diff --git a/rcutorture/configs/rcu/v3.5/P2-2-t-nh-sd-SMP-hp b/rcutorture/configs/v3.5/P2-2-t-nh-sd-SMP-hp
index 0f3b667..0f3b667 100644
--- a/rcutorture/configs/rcu/v3.5/P2-2-t-nh-sd-SMP-hp
+++ b/rcutorture/configs/v3.5/P2-2-t-nh-sd-SMP-hp
diff --git a/rcutorture/configs/rcu/v3.5/P3-3-T-nh-SD-SMP-hp b/rcutorture/configs/v3.5/P3-3-T-nh-SD-SMP-hp
index b035e14..b035e14 100644
--- a/rcutorture/configs/rcu/v3.5/P3-3-T-nh-SD-SMP-hp
+++ b/rcutorture/configs/v3.5/P3-3-T-nh-SD-SMP-hp
diff --git a/rcutorture/configs/rcu/v3.5/P4-A-t-NH-sd-SMP-HP b/rcutorture/configs/v3.5/P4-A-t-NH-sd-SMP-HP
index 3ccf6a9..3ccf6a9 100644
--- a/rcutorture/configs/rcu/v3.5/P4-A-t-NH-sd-SMP-HP
+++ b/rcutorture/configs/v3.5/P4-A-t-NH-sd-SMP-HP
diff --git a/rcutorture/configs/rcu/v0.0/P5-U-T-NH-sd-SMP-hp b/rcutorture/configs/v3.5/P5-U-T-NH-sd-SMP-hp
index a55c008..ef624ce 100644
--- a/rcutorture/configs/rcu/v0.0/P5-U-T-NH-sd-SMP-hp
+++ b/rcutorture/configs/v3.5/P5-U-T-NH-sd-SMP-hp
@@ -13,6 +13,7 @@ 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
diff --git a/rcutorture/configs/rcu/v3.5/PT1-nh b/rcutorture/configs/v3.5/PT1-nh
index e3361c3..e3361c3 100644
--- a/rcutorture/configs/rcu/v3.5/PT1-nh
+++ b/rcutorture/configs/v3.5/PT1-nh
diff --git a/rcutorture/configs/rcu/v3.5/PT2-NH b/rcutorture/configs/v3.5/PT2-NH
index 64abfc3..64abfc3 100644
--- a/rcutorture/configs/rcu/v3.5/PT2-NH
+++ b/rcutorture/configs/v3.5/PT2-NH
diff --git a/rcutorture/configs/rcu/v3.5/ver_functions.sh b/rcutorture/configs/v3.5/ver_functions.sh
index 8977d8d..6a5f13a 100644
--- a/rcutorture/configs/rcu/v3.5/ver_functions.sh
+++ b/rcutorture/configs/v3.5/ver_functions.sh
@@ -26,9 +26,9 @@
rcutorture_param_n_barrier_cbs () {
if echo $1 | grep -q "rcutorture\.n_barrier_cbs"
then
- :
+ echo $1
else
- echo rcutorture.n_barrier_cbs=4
+ echo $1 rcutorture.n_barrier_cbs=4
fi
}
@@ -38,20 +38,9 @@ rcutorture_param_n_barrier_cbs () {
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
+ echo CPU-hotplug kernel, adding rcutorture onoff.
+ echo $1 rcutorture.onoff_interval=3 rcutorture.onoff_holdoff=30
+ else
+ echo $1
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/v3.3/ver_functions.sh b/rcutorture/configs/ver_functions.sh
index bae5569..5e40ead 100644
--- a/rcutorture/configs/rcu/v3.3/ver_functions.sh
+++ b/rcutorture/configs/ver_functions.sh
@@ -20,6 +20,18 @@
#
# 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
+ echo $1
+ else
+ echo $1 rcutorture.n_barrier_cbs=4
+ fi
+}
+
# rcutorture_param_onoff bootparam-string config-file
#
# Adds onoff rcutorture module parameters to kernels having it.
@@ -27,18 +39,8 @@ 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
+ echo $1 rcutorture.onoff_interval=3 rcutorture.onoff_holdoff=30
+ else
+ echo $1
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/doc/TREE_RCU-kconfig.txt b/rcutorture/doc/TREE_RCU-Kconfig.txt
index 3e588db..adbb76c 100644
--- a/rcutorture/doc/TREE_RCU-kconfig.txt
+++ b/rcutorture/doc/TREE_RCU-Kconfig.txt
@@ -14,6 +14,7 @@ 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.
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