diff options
author | Ingo Molnar <mingo@kernel.org> | 2016-05-05 02:41:36 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2016-05-05 02:41:36 -0400 |
commit | f3391a160b22f8e006f3fb8ef39aa01da749fbf0 (patch) | |
tree | 9a8f61fe1a3dd0d12e7511567b2344f80f5aa531 /tools | |
parent | d7847a7017b2a2759dd5590c0cffdbdf2994918e (diff) | |
parent | 04974df8049fc4240d22759a91e035082ccd18b4 (diff) |
Merge tag 'v4.6-rc6' into x86/cpu, to refresh the tree
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/lib/lockdep/run_tests.sh | 12 | ||||
-rw-r--r-- | tools/objtool/Documentation/stack-validation.txt | 38 | ||||
-rw-r--r-- | tools/objtool/builtin-check.c | 97 | ||||
-rw-r--r-- | tools/perf/MANIFEST | 1 | ||||
-rw-r--r-- | tools/perf/arch/powerpc/util/header.c | 2 | ||||
-rwxr-xr-x | tools/perf/tests/perf-targz-src-pkg | 2 | ||||
-rw-r--r-- | tools/perf/ui/browsers/hists.c | 2 | ||||
-rw-r--r-- | tools/perf/util/event.c | 23 | ||||
-rw-r--r-- | tools/perf/util/genelf.h | 24 | ||||
-rw-r--r-- | tools/perf/util/intel-bts.c | 1 | ||||
-rw-r--r-- | tools/perf/util/intel-pt.c | 5 | ||||
-rw-r--r-- | tools/perf/util/jitdump.c | 2 | ||||
-rw-r--r-- | tools/power/x86/turbostat/turbostat.c | 117 | ||||
-rw-r--r-- | tools/testing/selftests/net/.gitignore | 1 | ||||
-rw-r--r-- | tools/testing/selftests/net/Makefile | 2 | ||||
-rw-r--r-- | tools/testing/selftests/net/reuseport_dualstack.c | 208 | ||||
-rw-r--r-- | tools/testing/selftests/seccomp/seccomp_bpf.c | 22 |
17 files changed, 475 insertions, 84 deletions
diff --git a/tools/lib/lockdep/run_tests.sh b/tools/lib/lockdep/run_tests.sh index 5334ad9d39b7..1069d96248c1 100755 --- a/tools/lib/lockdep/run_tests.sh +++ b/tools/lib/lockdep/run_tests.sh | |||
@@ -3,7 +3,7 @@ | |||
3 | make &> /dev/null | 3 | make &> /dev/null |
4 | 4 | ||
5 | for i in `ls tests/*.c`; do | 5 | for i in `ls tests/*.c`; do |
6 | testname=$(basename -s .c "$i") | 6 | testname=$(basename "$i" .c) |
7 | gcc -o tests/$testname -pthread -lpthread $i liblockdep.a -Iinclude -D__USE_LIBLOCKDEP &> /dev/null | 7 | gcc -o tests/$testname -pthread -lpthread $i liblockdep.a -Iinclude -D__USE_LIBLOCKDEP &> /dev/null |
8 | echo -ne "$testname... " | 8 | echo -ne "$testname... " |
9 | if [ $(timeout 1 ./tests/$testname | wc -l) -gt 0 ]; then | 9 | if [ $(timeout 1 ./tests/$testname | wc -l) -gt 0 ]; then |
@@ -11,11 +11,13 @@ for i in `ls tests/*.c`; do | |||
11 | else | 11 | else |
12 | echo "FAILED!" | 12 | echo "FAILED!" |
13 | fi | 13 | fi |
14 | rm tests/$testname | 14 | if [ -f "tests/$testname" ]; then |
15 | rm tests/$testname | ||
16 | fi | ||
15 | done | 17 | done |
16 | 18 | ||
17 | for i in `ls tests/*.c`; do | 19 | for i in `ls tests/*.c`; do |
18 | testname=$(basename -s .c "$i") | 20 | testname=$(basename "$i" .c) |
19 | gcc -o tests/$testname -pthread -lpthread -Iinclude $i &> /dev/null | 21 | gcc -o tests/$testname -pthread -lpthread -Iinclude $i &> /dev/null |
20 | echo -ne "(PRELOAD) $testname... " | 22 | echo -ne "(PRELOAD) $testname... " |
21 | if [ $(timeout 1 ./lockdep ./tests/$testname | wc -l) -gt 0 ]; then | 23 | if [ $(timeout 1 ./lockdep ./tests/$testname | wc -l) -gt 0 ]; then |
@@ -23,5 +25,7 @@ for i in `ls tests/*.c`; do | |||
23 | else | 25 | else |
24 | echo "FAILED!" | 26 | echo "FAILED!" |
25 | fi | 27 | fi |
26 | rm tests/$testname | 28 | if [ -f "tests/$testname" ]; then |
29 | rm tests/$testname | ||
30 | fi | ||
27 | done | 31 | done |
diff --git a/tools/objtool/Documentation/stack-validation.txt b/tools/objtool/Documentation/stack-validation.txt index 5a95896105bc..55a60d331f47 100644 --- a/tools/objtool/Documentation/stack-validation.txt +++ b/tools/objtool/Documentation/stack-validation.txt | |||
@@ -299,18 +299,38 @@ they mean, and suggestions for how to fix them. | |||
299 | Errors in .c files | 299 | Errors in .c files |
300 | ------------------ | 300 | ------------------ |
301 | 301 | ||
302 | If you're getting an objtool error in a compiled .c file, chances are | 302 | 1. c_file.o: warning: objtool: funcA() falls through to next function funcB() |
303 | the file uses an asm() statement which has a "call" instruction. An | ||
304 | asm() statement with a call instruction must declare the use of the | ||
305 | stack pointer in its output operand. For example, on x86_64: | ||
306 | 303 | ||
307 | register void *__sp asm("rsp"); | 304 | This means that funcA() doesn't end with a return instruction or an |
308 | asm volatile("call func" : "+r" (__sp)); | 305 | unconditional jump, and that objtool has determined that the function |
306 | can fall through into the next function. There could be different | ||
307 | reasons for this: | ||
309 | 308 | ||
310 | Otherwise the stack frame may not get created before the call. | 309 | 1) funcA()'s last instruction is a call to a "noreturn" function like |
310 | panic(). In this case the noreturn function needs to be added to | ||
311 | objtool's hard-coded global_noreturns array. Feel free to bug the | ||
312 | objtool maintainer, or you can submit a patch. | ||
311 | 313 | ||
312 | Another possible cause for errors in C code is if the Makefile removes | 314 | 2) funcA() uses the unreachable() annotation in a section of code |
313 | -fno-omit-frame-pointer or adds -fomit-frame-pointer to the gcc options. | 315 | that is actually reachable. |
316 | |||
317 | 3) If funcA() calls an inline function, the object code for funcA() | ||
318 | might be corrupt due to a gcc bug. For more details, see: | ||
319 | https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70646 | ||
320 | |||
321 | 2. If you're getting any other objtool error in a compiled .c file, it | ||
322 | may be because the file uses an asm() statement which has a "call" | ||
323 | instruction. An asm() statement with a call instruction must declare | ||
324 | the use of the stack pointer in its output operand. For example, on | ||
325 | x86_64: | ||
326 | |||
327 | register void *__sp asm("rsp"); | ||
328 | asm volatile("call func" : "+r" (__sp)); | ||
329 | |||
330 | Otherwise the stack frame may not get created before the call. | ||
331 | |||
332 | 3. Another possible cause for errors in C code is if the Makefile removes | ||
333 | -fno-omit-frame-pointer or adds -fomit-frame-pointer to the gcc options. | ||
314 | 334 | ||
315 | Also see the above section for .S file errors for more information what | 335 | Also see the above section for .S file errors for more information what |
316 | the individual error messages mean. | 336 | the individual error messages mean. |
diff --git a/tools/objtool/builtin-check.c b/tools/objtool/builtin-check.c index 7515cb2e879a..e8a1e69eb92c 100644 --- a/tools/objtool/builtin-check.c +++ b/tools/objtool/builtin-check.c | |||
@@ -54,6 +54,7 @@ struct instruction { | |||
54 | struct symbol *call_dest; | 54 | struct symbol *call_dest; |
55 | struct instruction *jump_dest; | 55 | struct instruction *jump_dest; |
56 | struct list_head alts; | 56 | struct list_head alts; |
57 | struct symbol *func; | ||
57 | }; | 58 | }; |
58 | 59 | ||
59 | struct alternative { | 60 | struct alternative { |
@@ -66,6 +67,7 @@ struct objtool_file { | |||
66 | struct list_head insn_list; | 67 | struct list_head insn_list; |
67 | DECLARE_HASHTABLE(insn_hash, 16); | 68 | DECLARE_HASHTABLE(insn_hash, 16); |
68 | struct section *rodata, *whitelist; | 69 | struct section *rodata, *whitelist; |
70 | bool ignore_unreachables, c_file; | ||
69 | }; | 71 | }; |
70 | 72 | ||
71 | const char *objname; | 73 | const char *objname; |
@@ -228,7 +230,7 @@ static int __dead_end_function(struct objtool_file *file, struct symbol *func, | |||
228 | } | 230 | } |
229 | } | 231 | } |
230 | 232 | ||
231 | if (insn->type == INSN_JUMP_DYNAMIC) | 233 | if (insn->type == INSN_JUMP_DYNAMIC && list_empty(&insn->alts)) |
232 | /* sibling call */ | 234 | /* sibling call */ |
233 | return 0; | 235 | return 0; |
234 | } | 236 | } |
@@ -248,6 +250,7 @@ static int dead_end_function(struct objtool_file *file, struct symbol *func) | |||
248 | static int decode_instructions(struct objtool_file *file) | 250 | static int decode_instructions(struct objtool_file *file) |
249 | { | 251 | { |
250 | struct section *sec; | 252 | struct section *sec; |
253 | struct symbol *func; | ||
251 | unsigned long offset; | 254 | unsigned long offset; |
252 | struct instruction *insn; | 255 | struct instruction *insn; |
253 | int ret; | 256 | int ret; |
@@ -281,6 +284,21 @@ static int decode_instructions(struct objtool_file *file) | |||
281 | hash_add(file->insn_hash, &insn->hash, insn->offset); | 284 | hash_add(file->insn_hash, &insn->hash, insn->offset); |
282 | list_add_tail(&insn->list, &file->insn_list); | 285 | list_add_tail(&insn->list, &file->insn_list); |
283 | } | 286 | } |
287 | |||
288 | list_for_each_entry(func, &sec->symbol_list, list) { | ||
289 | if (func->type != STT_FUNC) | ||
290 | continue; | ||
291 | |||
292 | if (!find_insn(file, sec, func->offset)) { | ||
293 | WARN("%s(): can't find starting instruction", | ||
294 | func->name); | ||
295 | return -1; | ||
296 | } | ||
297 | |||
298 | func_for_each_insn(file, func, insn) | ||
299 | if (!insn->func) | ||
300 | insn->func = func; | ||
301 | } | ||
284 | } | 302 | } |
285 | 303 | ||
286 | return 0; | 304 | return 0; |
@@ -664,13 +682,40 @@ static int add_func_switch_tables(struct objtool_file *file, | |||
664 | text_rela->addend); | 682 | text_rela->addend); |
665 | 683 | ||
666 | /* | 684 | /* |
667 | * TODO: Document where this is needed, or get rid of it. | ||
668 | * | ||
669 | * rare case: jmpq *[addr](%rip) | 685 | * rare case: jmpq *[addr](%rip) |
686 | * | ||
687 | * This check is for a rare gcc quirk, currently only seen in | ||
688 | * three driver functions in the kernel, only with certain | ||
689 | * obscure non-distro configs. | ||
690 | * | ||
691 | * As part of an optimization, gcc makes a copy of an existing | ||
692 | * switch jump table, modifies it, and then hard-codes the jump | ||
693 | * (albeit with an indirect jump) to use a single entry in the | ||
694 | * table. The rest of the jump table and some of its jump | ||
695 | * targets remain as dead code. | ||
696 | * | ||
697 | * In such a case we can just crudely ignore all unreachable | ||
698 | * instruction warnings for the entire object file. Ideally we | ||
699 | * would just ignore them for the function, but that would | ||
700 | * require redesigning the code quite a bit. And honestly | ||
701 | * that's just not worth doing: unreachable instruction | ||
702 | * warnings are of questionable value anyway, and this is such | ||
703 | * a rare issue. | ||
704 | * | ||
705 | * kbuild reports: | ||
706 | * - https://lkml.kernel.org/r/201603231906.LWcVUpxm%25fengguang.wu@intel.com | ||
707 | * - https://lkml.kernel.org/r/201603271114.K9i45biy%25fengguang.wu@intel.com | ||
708 | * - https://lkml.kernel.org/r/201603291058.zuJ6ben1%25fengguang.wu@intel.com | ||
709 | * | ||
710 | * gcc bug: | ||
711 | * - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70604 | ||
670 | */ | 712 | */ |
671 | if (!rodata_rela) | 713 | if (!rodata_rela) { |
672 | rodata_rela = find_rela_by_dest(file->rodata, | 714 | rodata_rela = find_rela_by_dest(file->rodata, |
673 | text_rela->addend + 4); | 715 | text_rela->addend + 4); |
716 | if (rodata_rela) | ||
717 | file->ignore_unreachables = true; | ||
718 | } | ||
674 | 719 | ||
675 | if (!rodata_rela) | 720 | if (!rodata_rela) |
676 | continue; | 721 | continue; |
@@ -732,9 +777,6 @@ static int decode_sections(struct objtool_file *file) | |||
732 | { | 777 | { |
733 | int ret; | 778 | int ret; |
734 | 779 | ||
735 | file->whitelist = find_section_by_name(file->elf, "__func_stack_frame_non_standard"); | ||
736 | file->rodata = find_section_by_name(file->elf, ".rodata"); | ||
737 | |||
738 | ret = decode_instructions(file); | 780 | ret = decode_instructions(file); |
739 | if (ret) | 781 | if (ret) |
740 | return ret; | 782 | return ret; |
@@ -799,6 +841,7 @@ static int validate_branch(struct objtool_file *file, | |||
799 | struct alternative *alt; | 841 | struct alternative *alt; |
800 | struct instruction *insn; | 842 | struct instruction *insn; |
801 | struct section *sec; | 843 | struct section *sec; |
844 | struct symbol *func = NULL; | ||
802 | unsigned char state; | 845 | unsigned char state; |
803 | int ret; | 846 | int ret; |
804 | 847 | ||
@@ -813,6 +856,16 @@ static int validate_branch(struct objtool_file *file, | |||
813 | } | 856 | } |
814 | 857 | ||
815 | while (1) { | 858 | while (1) { |
859 | if (file->c_file && insn->func) { | ||
860 | if (func && func != insn->func) { | ||
861 | WARN("%s() falls through to next function %s()", | ||
862 | func->name, insn->func->name); | ||
863 | return 1; | ||
864 | } | ||
865 | |||
866 | func = insn->func; | ||
867 | } | ||
868 | |||
816 | if (insn->visited) { | 869 | if (insn->visited) { |
817 | if (frame_state(insn->state) != frame_state(state)) { | 870 | if (frame_state(insn->state) != frame_state(state)) { |
818 | WARN_FUNC("frame pointer state mismatch", | 871 | WARN_FUNC("frame pointer state mismatch", |
@@ -823,13 +876,6 @@ static int validate_branch(struct objtool_file *file, | |||
823 | return 0; | 876 | return 0; |
824 | } | 877 | } |
825 | 878 | ||
826 | /* | ||
827 | * Catch a rare case where a noreturn function falls through to | ||
828 | * the next function. | ||
829 | */ | ||
830 | if (is_fentry_call(insn) && (state & STATE_FENTRY)) | ||
831 | return 0; | ||
832 | |||
833 | insn->visited = true; | 879 | insn->visited = true; |
834 | insn->state = state; | 880 | insn->state = state; |
835 | 881 | ||
@@ -1035,12 +1081,8 @@ static int validate_functions(struct objtool_file *file) | |||
1035 | continue; | 1081 | continue; |
1036 | 1082 | ||
1037 | insn = find_insn(file, sec, func->offset); | 1083 | insn = find_insn(file, sec, func->offset); |
1038 | if (!insn) { | 1084 | if (!insn) |
1039 | WARN("%s(): can't find starting instruction", | ||
1040 | func->name); | ||
1041 | warnings++; | ||
1042 | continue; | 1085 | continue; |
1043 | } | ||
1044 | 1086 | ||
1045 | ret = validate_branch(file, insn, 0); | 1087 | ret = validate_branch(file, insn, 0); |
1046 | warnings += ret; | 1088 | warnings += ret; |
@@ -1056,13 +1098,14 @@ static int validate_functions(struct objtool_file *file) | |||
1056 | if (insn->visited) | 1098 | if (insn->visited) |
1057 | continue; | 1099 | continue; |
1058 | 1100 | ||
1059 | if (!ignore_unreachable_insn(func, insn) && | ||
1060 | !warnings) { | ||
1061 | WARN_FUNC("function has unreachable instruction", insn->sec, insn->offset); | ||
1062 | warnings++; | ||
1063 | } | ||
1064 | |||
1065 | insn->visited = true; | 1101 | insn->visited = true; |
1102 | |||
1103 | if (file->ignore_unreachables || warnings || | ||
1104 | ignore_unreachable_insn(func, insn)) | ||
1105 | continue; | ||
1106 | |||
1107 | WARN_FUNC("function has unreachable instruction", insn->sec, insn->offset); | ||
1108 | warnings++; | ||
1066 | } | 1109 | } |
1067 | } | 1110 | } |
1068 | } | 1111 | } |
@@ -1133,6 +1176,10 @@ int cmd_check(int argc, const char **argv) | |||
1133 | 1176 | ||
1134 | INIT_LIST_HEAD(&file.insn_list); | 1177 | INIT_LIST_HEAD(&file.insn_list); |
1135 | hash_init(file.insn_hash); | 1178 | hash_init(file.insn_hash); |
1179 | file.whitelist = find_section_by_name(file.elf, "__func_stack_frame_non_standard"); | ||
1180 | file.rodata = find_section_by_name(file.elf, ".rodata"); | ||
1181 | file.ignore_unreachables = false; | ||
1182 | file.c_file = find_section_by_name(file.elf, ".comment"); | ||
1136 | 1183 | ||
1137 | ret = decode_sections(&file); | 1184 | ret = decode_sections(&file); |
1138 | if (ret < 0) | 1185 | if (ret < 0) |
diff --git a/tools/perf/MANIFEST b/tools/perf/MANIFEST index 2e1fa2357528..8c8c6b9ce915 100644 --- a/tools/perf/MANIFEST +++ b/tools/perf/MANIFEST | |||
@@ -74,6 +74,7 @@ arch/*/include/uapi/asm/unistd*.h | |||
74 | arch/*/include/uapi/asm/perf_regs.h | 74 | arch/*/include/uapi/asm/perf_regs.h |
75 | arch/*/lib/memcpy*.S | 75 | arch/*/lib/memcpy*.S |
76 | arch/*/lib/memset*.S | 76 | arch/*/lib/memset*.S |
77 | arch/*/include/asm/*features.h | ||
77 | include/linux/poison.h | 78 | include/linux/poison.h |
78 | include/linux/hw_breakpoint.h | 79 | include/linux/hw_breakpoint.h |
79 | include/uapi/linux/perf_event.h | 80 | include/uapi/linux/perf_event.h |
diff --git a/tools/perf/arch/powerpc/util/header.c b/tools/perf/arch/powerpc/util/header.c index 6138bdef6e63..f8ccee132867 100644 --- a/tools/perf/arch/powerpc/util/header.c +++ b/tools/perf/arch/powerpc/util/header.c | |||
@@ -4,6 +4,8 @@ | |||
4 | #include <stdlib.h> | 4 | #include <stdlib.h> |
5 | #include <string.h> | 5 | #include <string.h> |
6 | #include <linux/stringify.h> | 6 | #include <linux/stringify.h> |
7 | #include "header.h" | ||
8 | #include "util.h" | ||
7 | 9 | ||
8 | #define mfspr(rn) ({unsigned long rval; \ | 10 | #define mfspr(rn) ({unsigned long rval; \ |
9 | asm volatile("mfspr %0," __stringify(rn) \ | 11 | asm volatile("mfspr %0," __stringify(rn) \ |
diff --git a/tools/perf/tests/perf-targz-src-pkg b/tools/perf/tests/perf-targz-src-pkg index 238aa3927c71..f2d9c5fe58e0 100755 --- a/tools/perf/tests/perf-targz-src-pkg +++ b/tools/perf/tests/perf-targz-src-pkg | |||
@@ -15,7 +15,7 @@ TMP_DEST=$(mktemp -d) | |||
15 | tar xf ${TARBALL} -C $TMP_DEST | 15 | tar xf ${TARBALL} -C $TMP_DEST |
16 | rm -f ${TARBALL} | 16 | rm -f ${TARBALL} |
17 | cd - > /dev/null | 17 | cd - > /dev/null |
18 | make -C $TMP_DEST/perf*/tools/perf > /dev/null 2>&1 | 18 | make -C $TMP_DEST/perf*/tools/perf > /dev/null |
19 | RC=$? | 19 | RC=$? |
20 | rm -rf ${TMP_DEST} | 20 | rm -rf ${TMP_DEST} |
21 | exit $RC | 21 | exit $RC |
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index 4b9816555946..2a83414159a6 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c | |||
@@ -337,7 +337,7 @@ static void callchain_node__init_have_children(struct callchain_node *node, | |||
337 | chain = list_entry(node->val.next, struct callchain_list, list); | 337 | chain = list_entry(node->val.next, struct callchain_list, list); |
338 | chain->has_children = has_sibling; | 338 | chain->has_children = has_sibling; |
339 | 339 | ||
340 | if (node->val.next != node->val.prev) { | 340 | if (!list_empty(&node->val)) { |
341 | chain = list_entry(node->val.prev, struct callchain_list, list); | 341 | chain = list_entry(node->val.prev, struct callchain_list, list); |
342 | chain->has_children = !RB_EMPTY_ROOT(&node->rb_root); | 342 | chain->has_children = !RB_EMPTY_ROOT(&node->rb_root); |
343 | } | 343 | } |
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 52cf479bc593..dad55d04ffdd 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c | |||
@@ -56,13 +56,22 @@ const char *perf_event__name(unsigned int id) | |||
56 | return perf_event__names[id]; | 56 | return perf_event__names[id]; |
57 | } | 57 | } |
58 | 58 | ||
59 | static struct perf_sample synth_sample = { | 59 | static int perf_tool__process_synth_event(struct perf_tool *tool, |
60 | union perf_event *event, | ||
61 | struct machine *machine, | ||
62 | perf_event__handler_t process) | ||
63 | { | ||
64 | struct perf_sample synth_sample = { | ||
60 | .pid = -1, | 65 | .pid = -1, |
61 | .tid = -1, | 66 | .tid = -1, |
62 | .time = -1, | 67 | .time = -1, |
63 | .stream_id = -1, | 68 | .stream_id = -1, |
64 | .cpu = -1, | 69 | .cpu = -1, |
65 | .period = 1, | 70 | .period = 1, |
71 | .cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK, | ||
72 | }; | ||
73 | |||
74 | return process(tool, event, &synth_sample, machine); | ||
66 | }; | 75 | }; |
67 | 76 | ||
68 | /* | 77 | /* |
@@ -186,7 +195,7 @@ pid_t perf_event__synthesize_comm(struct perf_tool *tool, | |||
186 | if (perf_event__prepare_comm(event, pid, machine, &tgid, &ppid) != 0) | 195 | if (perf_event__prepare_comm(event, pid, machine, &tgid, &ppid) != 0) |
187 | return -1; | 196 | return -1; |
188 | 197 | ||
189 | if (process(tool, event, &synth_sample, machine) != 0) | 198 | if (perf_tool__process_synth_event(tool, event, machine, process) != 0) |
190 | return -1; | 199 | return -1; |
191 | 200 | ||
192 | return tgid; | 201 | return tgid; |
@@ -218,7 +227,7 @@ static int perf_event__synthesize_fork(struct perf_tool *tool, | |||
218 | 227 | ||
219 | event->fork.header.size = (sizeof(event->fork) + machine->id_hdr_size); | 228 | event->fork.header.size = (sizeof(event->fork) + machine->id_hdr_size); |
220 | 229 | ||
221 | if (process(tool, event, &synth_sample, machine) != 0) | 230 | if (perf_tool__process_synth_event(tool, event, machine, process) != 0) |
222 | return -1; | 231 | return -1; |
223 | 232 | ||
224 | return 0; | 233 | return 0; |
@@ -344,7 +353,7 @@ out: | |||
344 | event->mmap2.pid = tgid; | 353 | event->mmap2.pid = tgid; |
345 | event->mmap2.tid = pid; | 354 | event->mmap2.tid = pid; |
346 | 355 | ||
347 | if (process(tool, event, &synth_sample, machine) != 0) { | 356 | if (perf_tool__process_synth_event(tool, event, machine, process) != 0) { |
348 | rc = -1; | 357 | rc = -1; |
349 | break; | 358 | break; |
350 | } | 359 | } |
@@ -402,7 +411,7 @@ int perf_event__synthesize_modules(struct perf_tool *tool, | |||
402 | 411 | ||
403 | memcpy(event->mmap.filename, pos->dso->long_name, | 412 | memcpy(event->mmap.filename, pos->dso->long_name, |
404 | pos->dso->long_name_len + 1); | 413 | pos->dso->long_name_len + 1); |
405 | if (process(tool, event, &synth_sample, machine) != 0) { | 414 | if (perf_tool__process_synth_event(tool, event, machine, process) != 0) { |
406 | rc = -1; | 415 | rc = -1; |
407 | break; | 416 | break; |
408 | } | 417 | } |
@@ -472,7 +481,7 @@ static int __event__synthesize_thread(union perf_event *comm_event, | |||
472 | /* | 481 | /* |
473 | * Send the prepared comm event | 482 | * Send the prepared comm event |
474 | */ | 483 | */ |
475 | if (process(tool, comm_event, &synth_sample, machine) != 0) | 484 | if (perf_tool__process_synth_event(tool, comm_event, machine, process) != 0) |
476 | break; | 485 | break; |
477 | 486 | ||
478 | rc = 0; | 487 | rc = 0; |
@@ -701,7 +710,7 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, | |||
701 | event->mmap.len = map->end - event->mmap.start; | 710 | event->mmap.len = map->end - event->mmap.start; |
702 | event->mmap.pid = machine->pid; | 711 | event->mmap.pid = machine->pid; |
703 | 712 | ||
704 | err = process(tool, event, &synth_sample, machine); | 713 | err = perf_tool__process_synth_event(tool, event, machine, process); |
705 | free(event); | 714 | free(event); |
706 | 715 | ||
707 | return err; | 716 | return err; |
diff --git a/tools/perf/util/genelf.h b/tools/perf/util/genelf.h index cd67e64a0494..2fbeb59c4bdd 100644 --- a/tools/perf/util/genelf.h +++ b/tools/perf/util/genelf.h | |||
@@ -9,36 +9,32 @@ int jit_add_debug_info(Elf *e, uint64_t code_addr, void *debug, int nr_debug_ent | |||
9 | 9 | ||
10 | #if defined(__arm__) | 10 | #if defined(__arm__) |
11 | #define GEN_ELF_ARCH EM_ARM | 11 | #define GEN_ELF_ARCH EM_ARM |
12 | #define GEN_ELF_ENDIAN ELFDATA2LSB | ||
13 | #define GEN_ELF_CLASS ELFCLASS32 | 12 | #define GEN_ELF_CLASS ELFCLASS32 |
14 | #elif defined(__aarch64__) | 13 | #elif defined(__aarch64__) |
15 | #define GEN_ELF_ARCH EM_AARCH64 | 14 | #define GEN_ELF_ARCH EM_AARCH64 |
16 | #define GEN_ELF_ENDIAN ELFDATA2LSB | ||
17 | #define GEN_ELF_CLASS ELFCLASS64 | 15 | #define GEN_ELF_CLASS ELFCLASS64 |
18 | #elif defined(__x86_64__) | 16 | #elif defined(__x86_64__) |
19 | #define GEN_ELF_ARCH EM_X86_64 | 17 | #define GEN_ELF_ARCH EM_X86_64 |
20 | #define GEN_ELF_ENDIAN ELFDATA2LSB | ||
21 | #define GEN_ELF_CLASS ELFCLASS64 | 18 | #define GEN_ELF_CLASS ELFCLASS64 |
22 | #elif defined(__i386__) | 19 | #elif defined(__i386__) |
23 | #define GEN_ELF_ARCH EM_386 | 20 | #define GEN_ELF_ARCH EM_386 |
24 | #define GEN_ELF_ENDIAN ELFDATA2LSB | ||
25 | #define GEN_ELF_CLASS ELFCLASS32 | 21 | #define GEN_ELF_CLASS ELFCLASS32 |
26 | #elif defined(__ppcle__) | 22 | #elif defined(__powerpc64__) |
27 | #define GEN_ELF_ARCH EM_PPC | ||
28 | #define GEN_ELF_ENDIAN ELFDATA2LSB | ||
29 | #define GEN_ELF_CLASS ELFCLASS64 | ||
30 | #elif defined(__powerpc__) | ||
31 | #define GEN_ELF_ARCH EM_PPC64 | ||
32 | #define GEN_ELF_ENDIAN ELFDATA2MSB | ||
33 | #define GEN_ELF_CLASS ELFCLASS64 | ||
34 | #elif defined(__powerpcle__) | ||
35 | #define GEN_ELF_ARCH EM_PPC64 | 23 | #define GEN_ELF_ARCH EM_PPC64 |
36 | #define GEN_ELF_ENDIAN ELFDATA2LSB | ||
37 | #define GEN_ELF_CLASS ELFCLASS64 | 24 | #define GEN_ELF_CLASS ELFCLASS64 |
25 | #elif defined(__powerpc__) | ||
26 | #define GEN_ELF_ARCH EM_PPC | ||
27 | #define GEN_ELF_CLASS ELFCLASS32 | ||
38 | #else | 28 | #else |
39 | #error "unsupported architecture" | 29 | #error "unsupported architecture" |
40 | #endif | 30 | #endif |
41 | 31 | ||
32 | #if __BYTE_ORDER == __BIG_ENDIAN | ||
33 | #define GEN_ELF_ENDIAN ELFDATA2MSB | ||
34 | #else | ||
35 | #define GEN_ELF_ENDIAN ELFDATA2LSB | ||
36 | #endif | ||
37 | |||
42 | #if GEN_ELF_CLASS == ELFCLASS64 | 38 | #if GEN_ELF_CLASS == ELFCLASS64 |
43 | #define elf_newehdr elf64_newehdr | 39 | #define elf_newehdr elf64_newehdr |
44 | #define elf_getshdr elf64_getshdr | 40 | #define elf_getshdr elf64_getshdr |
diff --git a/tools/perf/util/intel-bts.c b/tools/perf/util/intel-bts.c index 6bc3ecd2e7ca..abf1366e2a24 100644 --- a/tools/perf/util/intel-bts.c +++ b/tools/perf/util/intel-bts.c | |||
@@ -279,6 +279,7 @@ static int intel_bts_synth_branch_sample(struct intel_bts_queue *btsq, | |||
279 | event.sample.header.misc = PERF_RECORD_MISC_USER; | 279 | event.sample.header.misc = PERF_RECORD_MISC_USER; |
280 | event.sample.header.size = sizeof(struct perf_event_header); | 280 | event.sample.header.size = sizeof(struct perf_event_header); |
281 | 281 | ||
282 | sample.cpumode = PERF_RECORD_MISC_USER; | ||
282 | sample.ip = le64_to_cpu(branch->from); | 283 | sample.ip = le64_to_cpu(branch->from); |
283 | sample.pid = btsq->pid; | 284 | sample.pid = btsq->pid; |
284 | sample.tid = btsq->tid; | 285 | sample.tid = btsq->tid; |
diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c index 05d815851be1..617578440989 100644 --- a/tools/perf/util/intel-pt.c +++ b/tools/perf/util/intel-pt.c | |||
@@ -979,6 +979,7 @@ static int intel_pt_synth_branch_sample(struct intel_pt_queue *ptq) | |||
979 | if (!pt->timeless_decoding) | 979 | if (!pt->timeless_decoding) |
980 | sample.time = tsc_to_perf_time(ptq->timestamp, &pt->tc); | 980 | sample.time = tsc_to_perf_time(ptq->timestamp, &pt->tc); |
981 | 981 | ||
982 | sample.cpumode = PERF_RECORD_MISC_USER; | ||
982 | sample.ip = ptq->state->from_ip; | 983 | sample.ip = ptq->state->from_ip; |
983 | sample.pid = ptq->pid; | 984 | sample.pid = ptq->pid; |
984 | sample.tid = ptq->tid; | 985 | sample.tid = ptq->tid; |
@@ -1035,6 +1036,7 @@ static int intel_pt_synth_instruction_sample(struct intel_pt_queue *ptq) | |||
1035 | if (!pt->timeless_decoding) | 1036 | if (!pt->timeless_decoding) |
1036 | sample.time = tsc_to_perf_time(ptq->timestamp, &pt->tc); | 1037 | sample.time = tsc_to_perf_time(ptq->timestamp, &pt->tc); |
1037 | 1038 | ||
1039 | sample.cpumode = PERF_RECORD_MISC_USER; | ||
1038 | sample.ip = ptq->state->from_ip; | 1040 | sample.ip = ptq->state->from_ip; |
1039 | sample.pid = ptq->pid; | 1041 | sample.pid = ptq->pid; |
1040 | sample.tid = ptq->tid; | 1042 | sample.tid = ptq->tid; |
@@ -1092,6 +1094,7 @@ static int intel_pt_synth_transaction_sample(struct intel_pt_queue *ptq) | |||
1092 | if (!pt->timeless_decoding) | 1094 | if (!pt->timeless_decoding) |
1093 | sample.time = tsc_to_perf_time(ptq->timestamp, &pt->tc); | 1095 | sample.time = tsc_to_perf_time(ptq->timestamp, &pt->tc); |
1094 | 1096 | ||
1097 | sample.cpumode = PERF_RECORD_MISC_USER; | ||
1095 | sample.ip = ptq->state->from_ip; | 1098 | sample.ip = ptq->state->from_ip; |
1096 | sample.pid = ptq->pid; | 1099 | sample.pid = ptq->pid; |
1097 | sample.tid = ptq->tid; | 1100 | sample.tid = ptq->tid; |
@@ -1127,7 +1130,7 @@ static int intel_pt_synth_transaction_sample(struct intel_pt_queue *ptq) | |||
1127 | pr_err("Intel Processor Trace: failed to deliver transaction event, error %d\n", | 1130 | pr_err("Intel Processor Trace: failed to deliver transaction event, error %d\n", |
1128 | ret); | 1131 | ret); |
1129 | 1132 | ||
1130 | if (pt->synth_opts.callchain) | 1133 | if (pt->synth_opts.last_branch) |
1131 | intel_pt_reset_last_branch_rb(ptq); | 1134 | intel_pt_reset_last_branch_rb(ptq); |
1132 | 1135 | ||
1133 | return ret; | 1136 | return ret; |
diff --git a/tools/perf/util/jitdump.c b/tools/perf/util/jitdump.c index cd272cc21e05..ad0c0bb1fbc7 100644 --- a/tools/perf/util/jitdump.c +++ b/tools/perf/util/jitdump.c | |||
@@ -417,6 +417,7 @@ static int jit_repipe_code_load(struct jit_buf_desc *jd, union jr_entry *jr) | |||
417 | * use first address as sample address | 417 | * use first address as sample address |
418 | */ | 418 | */ |
419 | memset(&sample, 0, sizeof(sample)); | 419 | memset(&sample, 0, sizeof(sample)); |
420 | sample.cpumode = PERF_RECORD_MISC_USER; | ||
420 | sample.pid = pid; | 421 | sample.pid = pid; |
421 | sample.tid = tid; | 422 | sample.tid = tid; |
422 | sample.time = id->time; | 423 | sample.time = id->time; |
@@ -505,6 +506,7 @@ static int jit_repipe_code_move(struct jit_buf_desc *jd, union jr_entry *jr) | |||
505 | * use first address as sample address | 506 | * use first address as sample address |
506 | */ | 507 | */ |
507 | memset(&sample, 0, sizeof(sample)); | 508 | memset(&sample, 0, sizeof(sample)); |
509 | sample.cpumode = PERF_RECORD_MISC_USER; | ||
508 | sample.pid = pid; | 510 | sample.pid = pid; |
509 | sample.tid = tid; | 511 | sample.tid = tid; |
510 | sample.time = id->time; | 512 | sample.time = id->time; |
diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c index 20a257a12ea5..acbf7ff2ee6e 100644 --- a/tools/power/x86/turbostat/turbostat.c +++ b/tools/power/x86/turbostat/turbostat.c | |||
@@ -66,6 +66,8 @@ unsigned int do_slm_cstates; | |||
66 | unsigned int use_c1_residency_msr; | 66 | unsigned int use_c1_residency_msr; |
67 | unsigned int has_aperf; | 67 | unsigned int has_aperf; |
68 | unsigned int has_epb; | 68 | unsigned int has_epb; |
69 | unsigned int do_irtl_snb; | ||
70 | unsigned int do_irtl_hsw; | ||
69 | unsigned int units = 1000000; /* MHz etc */ | 71 | unsigned int units = 1000000; /* MHz etc */ |
70 | unsigned int genuine_intel; | 72 | unsigned int genuine_intel; |
71 | unsigned int has_invariant_tsc; | 73 | unsigned int has_invariant_tsc; |
@@ -187,7 +189,7 @@ struct pkg_data { | |||
187 | unsigned long long pkg_any_core_c0; | 189 | unsigned long long pkg_any_core_c0; |
188 | unsigned long long pkg_any_gfxe_c0; | 190 | unsigned long long pkg_any_gfxe_c0; |
189 | unsigned long long pkg_both_core_gfxe_c0; | 191 | unsigned long long pkg_both_core_gfxe_c0; |
190 | unsigned long long gfx_rc6_ms; | 192 | long long gfx_rc6_ms; |
191 | unsigned int gfx_mhz; | 193 | unsigned int gfx_mhz; |
192 | unsigned int package_id; | 194 | unsigned int package_id; |
193 | unsigned int energy_pkg; /* MSR_PKG_ENERGY_STATUS */ | 195 | unsigned int energy_pkg; /* MSR_PKG_ENERGY_STATUS */ |
@@ -621,8 +623,14 @@ int format_counters(struct thread_data *t, struct core_data *c, | |||
621 | outp += sprintf(outp, "%8d", p->pkg_temp_c); | 623 | outp += sprintf(outp, "%8d", p->pkg_temp_c); |
622 | 624 | ||
623 | /* GFXrc6 */ | 625 | /* GFXrc6 */ |
624 | if (do_gfx_rc6_ms) | 626 | if (do_gfx_rc6_ms) { |
625 | outp += sprintf(outp, "%8.2f", 100.0 * p->gfx_rc6_ms / 1000.0 / interval_float); | 627 | if (p->gfx_rc6_ms == -1) { /* detect counter reset */ |
628 | outp += sprintf(outp, " ***.**"); | ||
629 | } else { | ||
630 | outp += sprintf(outp, "%8.2f", | ||
631 | p->gfx_rc6_ms / 10.0 / interval_float); | ||
632 | } | ||
633 | } | ||
626 | 634 | ||
627 | /* GFXMHz */ | 635 | /* GFXMHz */ |
628 | if (do_gfx_mhz) | 636 | if (do_gfx_mhz) |
@@ -766,7 +774,12 @@ delta_package(struct pkg_data *new, struct pkg_data *old) | |||
766 | old->pc10 = new->pc10 - old->pc10; | 774 | old->pc10 = new->pc10 - old->pc10; |
767 | old->pkg_temp_c = new->pkg_temp_c; | 775 | old->pkg_temp_c = new->pkg_temp_c; |
768 | 776 | ||
769 | old->gfx_rc6_ms = new->gfx_rc6_ms - old->gfx_rc6_ms; | 777 | /* flag an error when rc6 counter resets/wraps */ |
778 | if (old->gfx_rc6_ms > new->gfx_rc6_ms) | ||
779 | old->gfx_rc6_ms = -1; | ||
780 | else | ||
781 | old->gfx_rc6_ms = new->gfx_rc6_ms - old->gfx_rc6_ms; | ||
782 | |||
770 | old->gfx_mhz = new->gfx_mhz; | 783 | old->gfx_mhz = new->gfx_mhz; |
771 | 784 | ||
772 | DELTA_WRAP32(new->energy_pkg, old->energy_pkg); | 785 | DELTA_WRAP32(new->energy_pkg, old->energy_pkg); |
@@ -1296,6 +1309,7 @@ int hsw_pkg_cstate_limits[16] = {PCL__0, PCL__2, PCL__3, PCL__6, PCL__7, PCL_7S, | |||
1296 | int slv_pkg_cstate_limits[16] = {PCL__0, PCL__1, PCLRSV, PCLRSV, PCL__4, PCLRSV, PCL__6, PCL__7, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV}; | 1309 | int slv_pkg_cstate_limits[16] = {PCL__0, PCL__1, PCLRSV, PCLRSV, PCL__4, PCLRSV, PCL__6, PCL__7, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV}; |
1297 | int amt_pkg_cstate_limits[16] = {PCL__0, PCL__1, PCL__2, PCLRSV, PCLRSV, PCLRSV, PCL__6, PCL__7, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV}; | 1310 | int amt_pkg_cstate_limits[16] = {PCL__0, PCL__1, PCL__2, PCLRSV, PCLRSV, PCLRSV, PCL__6, PCL__7, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV}; |
1298 | int phi_pkg_cstate_limits[16] = {PCL__0, PCL__2, PCL_6N, PCL_6R, PCLRSV, PCLRSV, PCLRSV, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV}; | 1311 | int phi_pkg_cstate_limits[16] = {PCL__0, PCL__2, PCL_6N, PCL_6R, PCLRSV, PCLRSV, PCLRSV, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV}; |
1312 | int bxt_pkg_cstate_limits[16] = {PCL__0, PCL__2, PCLUNL, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV, PCLRSV}; | ||
1299 | 1313 | ||
1300 | 1314 | ||
1301 | static void | 1315 | static void |
@@ -1579,6 +1593,47 @@ dump_config_tdp(void) | |||
1579 | fprintf(outf, " lock=%d", (unsigned int)(msr >> 31) & 1); | 1593 | fprintf(outf, " lock=%d", (unsigned int)(msr >> 31) & 1); |
1580 | fprintf(outf, ")\n"); | 1594 | fprintf(outf, ")\n"); |
1581 | } | 1595 | } |
1596 | |||
1597 | unsigned int irtl_time_units[] = {1, 32, 1024, 32768, 1048576, 33554432, 0, 0 }; | ||
1598 | |||
1599 | void print_irtl(void) | ||
1600 | { | ||
1601 | unsigned long long msr; | ||
1602 | |||
1603 | get_msr(base_cpu, MSR_PKGC3_IRTL, &msr); | ||
1604 | fprintf(outf, "cpu%d: MSR_PKGC3_IRTL: 0x%08llx (", base_cpu, msr); | ||
1605 | fprintf(outf, "%svalid, %lld ns)\n", msr & (1 << 15) ? "" : "NOT", | ||
1606 | (msr & 0x3FF) * irtl_time_units[(msr >> 10) & 0x3]); | ||
1607 | |||
1608 | get_msr(base_cpu, MSR_PKGC6_IRTL, &msr); | ||
1609 | fprintf(outf, "cpu%d: MSR_PKGC6_IRTL: 0x%08llx (", base_cpu, msr); | ||
1610 | fprintf(outf, "%svalid, %lld ns)\n", msr & (1 << 15) ? "" : "NOT", | ||
1611 | (msr & 0x3FF) * irtl_time_units[(msr >> 10) & 0x3]); | ||
1612 | |||
1613 | get_msr(base_cpu, MSR_PKGC7_IRTL, &msr); | ||
1614 | fprintf(outf, "cpu%d: MSR_PKGC7_IRTL: 0x%08llx (", base_cpu, msr); | ||
1615 | fprintf(outf, "%svalid, %lld ns)\n", msr & (1 << 15) ? "" : "NOT", | ||
1616 | (msr & 0x3FF) * irtl_time_units[(msr >> 10) & 0x3]); | ||
1617 | |||
1618 | if (!do_irtl_hsw) | ||
1619 | return; | ||
1620 | |||
1621 | get_msr(base_cpu, MSR_PKGC8_IRTL, &msr); | ||
1622 | fprintf(outf, "cpu%d: MSR_PKGC8_IRTL: 0x%08llx (", base_cpu, msr); | ||
1623 | fprintf(outf, "%svalid, %lld ns)\n", msr & (1 << 15) ? "" : "NOT", | ||
1624 | (msr & 0x3FF) * irtl_time_units[(msr >> 10) & 0x3]); | ||
1625 | |||
1626 | get_msr(base_cpu, MSR_PKGC9_IRTL, &msr); | ||
1627 | fprintf(outf, "cpu%d: MSR_PKGC9_IRTL: 0x%08llx (", base_cpu, msr); | ||
1628 | fprintf(outf, "%svalid, %lld ns)\n", msr & (1 << 15) ? "" : "NOT", | ||
1629 | (msr & 0x3FF) * irtl_time_units[(msr >> 10) & 0x3]); | ||
1630 | |||
1631 | get_msr(base_cpu, MSR_PKGC10_IRTL, &msr); | ||
1632 | fprintf(outf, "cpu%d: MSR_PKGC10_IRTL: 0x%08llx (", base_cpu, msr); | ||
1633 | fprintf(outf, "%svalid, %lld ns)\n", msr & (1 << 15) ? "" : "NOT", | ||
1634 | (msr & 0x3FF) * irtl_time_units[(msr >> 10) & 0x3]); | ||
1635 | |||
1636 | } | ||
1582 | void free_fd_percpu(void) | 1637 | void free_fd_percpu(void) |
1583 | { | 1638 | { |
1584 | int i; | 1639 | int i; |
@@ -2144,6 +2199,9 @@ int probe_nhm_msrs(unsigned int family, unsigned int model) | |||
2144 | case 0x56: /* BDX-DE */ | 2199 | case 0x56: /* BDX-DE */ |
2145 | case 0x4E: /* SKL */ | 2200 | case 0x4E: /* SKL */ |
2146 | case 0x5E: /* SKL */ | 2201 | case 0x5E: /* SKL */ |
2202 | case 0x8E: /* KBL */ | ||
2203 | case 0x9E: /* KBL */ | ||
2204 | case 0x55: /* SKX */ | ||
2147 | pkg_cstate_limits = hsw_pkg_cstate_limits; | 2205 | pkg_cstate_limits = hsw_pkg_cstate_limits; |
2148 | break; | 2206 | break; |
2149 | case 0x37: /* BYT */ | 2207 | case 0x37: /* BYT */ |
@@ -2156,6 +2214,9 @@ int probe_nhm_msrs(unsigned int family, unsigned int model) | |||
2156 | case 0x57: /* PHI */ | 2214 | case 0x57: /* PHI */ |
2157 | pkg_cstate_limits = phi_pkg_cstate_limits; | 2215 | pkg_cstate_limits = phi_pkg_cstate_limits; |
2158 | break; | 2216 | break; |
2217 | case 0x5C: /* BXT */ | ||
2218 | pkg_cstate_limits = bxt_pkg_cstate_limits; | ||
2219 | break; | ||
2159 | default: | 2220 | default: |
2160 | return 0; | 2221 | return 0; |
2161 | } | 2222 | } |
@@ -2248,6 +2309,9 @@ int has_config_tdp(unsigned int family, unsigned int model) | |||
2248 | case 0x56: /* BDX-DE */ | 2309 | case 0x56: /* BDX-DE */ |
2249 | case 0x4E: /* SKL */ | 2310 | case 0x4E: /* SKL */ |
2250 | case 0x5E: /* SKL */ | 2311 | case 0x5E: /* SKL */ |
2312 | case 0x8E: /* KBL */ | ||
2313 | case 0x9E: /* KBL */ | ||
2314 | case 0x55: /* SKX */ | ||
2251 | 2315 | ||
2252 | case 0x57: /* Knights Landing */ | 2316 | case 0x57: /* Knights Landing */ |
2253 | return 1; | 2317 | return 1; |
@@ -2585,13 +2649,19 @@ void rapl_probe(unsigned int family, unsigned int model) | |||
2585 | case 0x47: /* BDW */ | 2649 | case 0x47: /* BDW */ |
2586 | do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_GFX | RAPL_PKG_POWER_INFO; | 2650 | do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_GFX | RAPL_PKG_POWER_INFO; |
2587 | break; | 2651 | break; |
2652 | case 0x5C: /* BXT */ | ||
2653 | do_rapl = RAPL_PKG | RAPL_PKG_POWER_INFO; | ||
2654 | break; | ||
2588 | case 0x4E: /* SKL */ | 2655 | case 0x4E: /* SKL */ |
2589 | case 0x5E: /* SKL */ | 2656 | case 0x5E: /* SKL */ |
2657 | case 0x8E: /* KBL */ | ||
2658 | case 0x9E: /* KBL */ | ||
2590 | do_rapl = RAPL_PKG | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_PKG_POWER_INFO; | 2659 | do_rapl = RAPL_PKG | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_PKG_POWER_INFO; |
2591 | break; | 2660 | break; |
2592 | case 0x3F: /* HSX */ | 2661 | case 0x3F: /* HSX */ |
2593 | case 0x4F: /* BDX */ | 2662 | case 0x4F: /* BDX */ |
2594 | case 0x56: /* BDX-DE */ | 2663 | case 0x56: /* BDX-DE */ |
2664 | case 0x55: /* SKX */ | ||
2595 | case 0x57: /* KNL */ | 2665 | case 0x57: /* KNL */ |
2596 | do_rapl = RAPL_PKG | RAPL_DRAM | RAPL_DRAM_POWER_INFO | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_PKG_POWER_INFO; | 2666 | do_rapl = RAPL_PKG | RAPL_DRAM | RAPL_DRAM_POWER_INFO | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_PKG_POWER_INFO; |
2597 | break; | 2667 | break; |
@@ -2871,6 +2941,10 @@ int has_snb_msrs(unsigned int family, unsigned int model) | |||
2871 | case 0x56: /* BDX-DE */ | 2941 | case 0x56: /* BDX-DE */ |
2872 | case 0x4E: /* SKL */ | 2942 | case 0x4E: /* SKL */ |
2873 | case 0x5E: /* SKL */ | 2943 | case 0x5E: /* SKL */ |
2944 | case 0x8E: /* KBL */ | ||
2945 | case 0x9E: /* KBL */ | ||
2946 | case 0x55: /* SKX */ | ||
2947 | case 0x5C: /* BXT */ | ||
2874 | return 1; | 2948 | return 1; |
2875 | } | 2949 | } |
2876 | return 0; | 2950 | return 0; |
@@ -2879,9 +2953,14 @@ int has_snb_msrs(unsigned int family, unsigned int model) | |||
2879 | /* | 2953 | /* |
2880 | * HSW adds support for additional MSRs: | 2954 | * HSW adds support for additional MSRs: |
2881 | * | 2955 | * |
2882 | * MSR_PKG_C8_RESIDENCY 0x00000630 | 2956 | * MSR_PKG_C8_RESIDENCY 0x00000630 |
2883 | * MSR_PKG_C9_RESIDENCY 0x00000631 | 2957 | * MSR_PKG_C9_RESIDENCY 0x00000631 |
2884 | * MSR_PKG_C10_RESIDENCY 0x00000632 | 2958 | * MSR_PKG_C10_RESIDENCY 0x00000632 |
2959 | * | ||
2960 | * MSR_PKGC8_IRTL 0x00000633 | ||
2961 | * MSR_PKGC9_IRTL 0x00000634 | ||
2962 | * MSR_PKGC10_IRTL 0x00000635 | ||
2963 | * | ||
2885 | */ | 2964 | */ |
2886 | int has_hsw_msrs(unsigned int family, unsigned int model) | 2965 | int has_hsw_msrs(unsigned int family, unsigned int model) |
2887 | { | 2966 | { |
@@ -2893,6 +2972,9 @@ int has_hsw_msrs(unsigned int family, unsigned int model) | |||
2893 | case 0x3D: /* BDW */ | 2972 | case 0x3D: /* BDW */ |
2894 | case 0x4E: /* SKL */ | 2973 | case 0x4E: /* SKL */ |
2895 | case 0x5E: /* SKL */ | 2974 | case 0x5E: /* SKL */ |
2975 | case 0x8E: /* KBL */ | ||
2976 | case 0x9E: /* KBL */ | ||
2977 | case 0x5C: /* BXT */ | ||
2896 | return 1; | 2978 | return 1; |
2897 | } | 2979 | } |
2898 | return 0; | 2980 | return 0; |
@@ -2914,6 +2996,8 @@ int has_skl_msrs(unsigned int family, unsigned int model) | |||
2914 | switch (model) { | 2996 | switch (model) { |
2915 | case 0x4E: /* SKL */ | 2997 | case 0x4E: /* SKL */ |
2916 | case 0x5E: /* SKL */ | 2998 | case 0x5E: /* SKL */ |
2999 | case 0x8E: /* KBL */ | ||
3000 | case 0x9E: /* KBL */ | ||
2917 | return 1; | 3001 | return 1; |
2918 | } | 3002 | } |
2919 | return 0; | 3003 | return 0; |
@@ -3187,7 +3271,7 @@ void process_cpuid() | |||
3187 | if (debug) | 3271 | if (debug) |
3188 | decode_misc_enable_msr(); | 3272 | decode_misc_enable_msr(); |
3189 | 3273 | ||
3190 | if (max_level >= 0x7) { | 3274 | if (max_level >= 0x7 && debug) { |
3191 | int has_sgx; | 3275 | int has_sgx; |
3192 | 3276 | ||
3193 | ecx = 0; | 3277 | ecx = 0; |
@@ -3221,7 +3305,15 @@ void process_cpuid() | |||
3221 | switch(model) { | 3305 | switch(model) { |
3222 | case 0x4E: /* SKL */ | 3306 | case 0x4E: /* SKL */ |
3223 | case 0x5E: /* SKL */ | 3307 | case 0x5E: /* SKL */ |
3224 | crystal_hz = 24000000; /* 24 MHz */ | 3308 | case 0x8E: /* KBL */ |
3309 | case 0x9E: /* KBL */ | ||
3310 | crystal_hz = 24000000; /* 24.0 MHz */ | ||
3311 | break; | ||
3312 | case 0x55: /* SKX */ | ||
3313 | crystal_hz = 25000000; /* 25.0 MHz */ | ||
3314 | break; | ||
3315 | case 0x5C: /* BXT */ | ||
3316 | crystal_hz = 19200000; /* 19.2 MHz */ | ||
3225 | break; | 3317 | break; |
3226 | default: | 3318 | default: |
3227 | crystal_hz = 0; | 3319 | crystal_hz = 0; |
@@ -3254,11 +3346,13 @@ void process_cpuid() | |||
3254 | 3346 | ||
3255 | do_nhm_platform_info = do_nhm_cstates = do_smi = probe_nhm_msrs(family, model); | 3347 | do_nhm_platform_info = do_nhm_cstates = do_smi = probe_nhm_msrs(family, model); |
3256 | do_snb_cstates = has_snb_msrs(family, model); | 3348 | do_snb_cstates = has_snb_msrs(family, model); |
3349 | do_irtl_snb = has_snb_msrs(family, model); | ||
3257 | do_pc2 = do_snb_cstates && (pkg_cstate_limit >= PCL__2); | 3350 | do_pc2 = do_snb_cstates && (pkg_cstate_limit >= PCL__2); |
3258 | do_pc3 = (pkg_cstate_limit >= PCL__3); | 3351 | do_pc3 = (pkg_cstate_limit >= PCL__3); |
3259 | do_pc6 = (pkg_cstate_limit >= PCL__6); | 3352 | do_pc6 = (pkg_cstate_limit >= PCL__6); |
3260 | do_pc7 = do_snb_cstates && (pkg_cstate_limit >= PCL__7); | 3353 | do_pc7 = do_snb_cstates && (pkg_cstate_limit >= PCL__7); |
3261 | do_c8_c9_c10 = has_hsw_msrs(family, model); | 3354 | do_c8_c9_c10 = has_hsw_msrs(family, model); |
3355 | do_irtl_hsw = has_hsw_msrs(family, model); | ||
3262 | do_skl_residency = has_skl_msrs(family, model); | 3356 | do_skl_residency = has_skl_msrs(family, model); |
3263 | do_slm_cstates = is_slm(family, model); | 3357 | do_slm_cstates = is_slm(family, model); |
3264 | do_knl_cstates = is_knl(family, model); | 3358 | do_knl_cstates = is_knl(family, model); |
@@ -3564,6 +3658,9 @@ void turbostat_init() | |||
3564 | 3658 | ||
3565 | if (debug) | 3659 | if (debug) |
3566 | for_all_cpus(print_thermal, ODD_COUNTERS); | 3660 | for_all_cpus(print_thermal, ODD_COUNTERS); |
3661 | |||
3662 | if (debug && do_irtl_snb) | ||
3663 | print_irtl(); | ||
3567 | } | 3664 | } |
3568 | 3665 | ||
3569 | int fork_it(char **argv) | 3666 | int fork_it(char **argv) |
@@ -3629,7 +3726,7 @@ int get_and_dump_counters(void) | |||
3629 | } | 3726 | } |
3630 | 3727 | ||
3631 | void print_version() { | 3728 | void print_version() { |
3632 | fprintf(outf, "turbostat version 4.11 27 Feb 2016" | 3729 | fprintf(outf, "turbostat version 4.12 5 Apr 2016" |
3633 | " - Len Brown <lenb@kernel.org>\n"); | 3730 | " - Len Brown <lenb@kernel.org>\n"); |
3634 | } | 3731 | } |
3635 | 3732 | ||
diff --git a/tools/testing/selftests/net/.gitignore b/tools/testing/selftests/net/.gitignore index 69bb3fc38fb2..0840684deb7d 100644 --- a/tools/testing/selftests/net/.gitignore +++ b/tools/testing/selftests/net/.gitignore | |||
@@ -3,3 +3,4 @@ psock_fanout | |||
3 | psock_tpacket | 3 | psock_tpacket |
4 | reuseport_bpf | 4 | reuseport_bpf |
5 | reuseport_bpf_cpu | 5 | reuseport_bpf_cpu |
6 | reuseport_dualstack | ||
diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile index c658792d47b4..0e5340742620 100644 --- a/tools/testing/selftests/net/Makefile +++ b/tools/testing/selftests/net/Makefile | |||
@@ -4,7 +4,7 @@ CFLAGS = -Wall -O2 -g | |||
4 | 4 | ||
5 | CFLAGS += -I../../../../usr/include/ | 5 | CFLAGS += -I../../../../usr/include/ |
6 | 6 | ||
7 | NET_PROGS = socket psock_fanout psock_tpacket reuseport_bpf reuseport_bpf_cpu | 7 | NET_PROGS = socket psock_fanout psock_tpacket reuseport_bpf reuseport_bpf_cpu reuseport_dualstack |
8 | 8 | ||
9 | all: $(NET_PROGS) | 9 | all: $(NET_PROGS) |
10 | %: %.c | 10 | %: %.c |
diff --git a/tools/testing/selftests/net/reuseport_dualstack.c b/tools/testing/selftests/net/reuseport_dualstack.c new file mode 100644 index 000000000000..90958aaaafb9 --- /dev/null +++ b/tools/testing/selftests/net/reuseport_dualstack.c | |||
@@ -0,0 +1,208 @@ | |||
1 | /* | ||
2 | * It is possible to use SO_REUSEPORT to open multiple sockets bound to | ||
3 | * equivalent local addresses using AF_INET and AF_INET6 at the same time. If | ||
4 | * the AF_INET6 socket has IPV6_V6ONLY set, it's clear which socket should | ||
5 | * receive a given incoming packet. However, when it is not set, incoming v4 | ||
6 | * packets should prefer the AF_INET socket(s). This behavior was defined with | ||
7 | * the original SO_REUSEPORT implementation, but broke with | ||
8 | * e32ea7e74727 ("soreuseport: fast reuseport UDP socket selection") | ||
9 | * This test creates these mixed AF_INET/AF_INET6 sockets and asserts the | ||
10 | * AF_INET preference for v4 packets. | ||
11 | */ | ||
12 | |||
13 | #define _GNU_SOURCE | ||
14 | |||
15 | #include <arpa/inet.h> | ||
16 | #include <errno.h> | ||
17 | #include <error.h> | ||
18 | #include <linux/in.h> | ||
19 | #include <linux/unistd.h> | ||
20 | #include <stdio.h> | ||
21 | #include <stdlib.h> | ||
22 | #include <string.h> | ||
23 | #include <sys/epoll.h> | ||
24 | #include <sys/types.h> | ||
25 | #include <sys/socket.h> | ||
26 | #include <unistd.h> | ||
27 | |||
28 | static const int PORT = 8888; | ||
29 | |||
30 | static void build_rcv_fd(int family, int proto, int *rcv_fds, int count) | ||
31 | { | ||
32 | struct sockaddr_storage addr; | ||
33 | struct sockaddr_in *addr4; | ||
34 | struct sockaddr_in6 *addr6; | ||
35 | int opt, i; | ||
36 | |||
37 | switch (family) { | ||
38 | case AF_INET: | ||
39 | addr4 = (struct sockaddr_in *)&addr; | ||
40 | addr4->sin_family = AF_INET; | ||
41 | addr4->sin_addr.s_addr = htonl(INADDR_ANY); | ||
42 | addr4->sin_port = htons(PORT); | ||
43 | break; | ||
44 | case AF_INET6: | ||
45 | addr6 = (struct sockaddr_in6 *)&addr; | ||
46 | addr6->sin6_family = AF_INET6; | ||
47 | addr6->sin6_addr = in6addr_any; | ||
48 | addr6->sin6_port = htons(PORT); | ||
49 | break; | ||
50 | default: | ||
51 | error(1, 0, "Unsupported family %d", family); | ||
52 | } | ||
53 | |||
54 | for (i = 0; i < count; ++i) { | ||
55 | rcv_fds[i] = socket(family, proto, 0); | ||
56 | if (rcv_fds[i] < 0) | ||
57 | error(1, errno, "failed to create receive socket"); | ||
58 | |||
59 | opt = 1; | ||
60 | if (setsockopt(rcv_fds[i], SOL_SOCKET, SO_REUSEPORT, &opt, | ||
61 | sizeof(opt))) | ||
62 | error(1, errno, "failed to set SO_REUSEPORT"); | ||
63 | |||
64 | if (bind(rcv_fds[i], (struct sockaddr *)&addr, sizeof(addr))) | ||
65 | error(1, errno, "failed to bind receive socket"); | ||
66 | |||
67 | if (proto == SOCK_STREAM && listen(rcv_fds[i], 10)) | ||
68 | error(1, errno, "failed to listen on receive port"); | ||
69 | } | ||
70 | } | ||
71 | |||
72 | static void send_from_v4(int proto) | ||
73 | { | ||
74 | struct sockaddr_in saddr, daddr; | ||
75 | int fd; | ||
76 | |||
77 | saddr.sin_family = AF_INET; | ||
78 | saddr.sin_addr.s_addr = htonl(INADDR_ANY); | ||
79 | saddr.sin_port = 0; | ||
80 | |||
81 | daddr.sin_family = AF_INET; | ||
82 | daddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); | ||
83 | daddr.sin_port = htons(PORT); | ||
84 | |||
85 | fd = socket(AF_INET, proto, 0); | ||
86 | if (fd < 0) | ||
87 | error(1, errno, "failed to create send socket"); | ||
88 | |||
89 | if (bind(fd, (struct sockaddr *)&saddr, sizeof(saddr))) | ||
90 | error(1, errno, "failed to bind send socket"); | ||
91 | |||
92 | if (connect(fd, (struct sockaddr *)&daddr, sizeof(daddr))) | ||
93 | error(1, errno, "failed to connect send socket"); | ||
94 | |||
95 | if (send(fd, "a", 1, 0) < 0) | ||
96 | error(1, errno, "failed to send message"); | ||
97 | |||
98 | close(fd); | ||
99 | } | ||
100 | |||
101 | static int receive_once(int epfd, int proto) | ||
102 | { | ||
103 | struct epoll_event ev; | ||
104 | int i, fd; | ||
105 | char buf[8]; | ||
106 | |||
107 | i = epoll_wait(epfd, &ev, 1, -1); | ||
108 | if (i < 0) | ||
109 | error(1, errno, "epoll_wait failed"); | ||
110 | |||
111 | if (proto == SOCK_STREAM) { | ||
112 | fd = accept(ev.data.fd, NULL, NULL); | ||
113 | if (fd < 0) | ||
114 | error(1, errno, "failed to accept"); | ||
115 | i = recv(fd, buf, sizeof(buf), 0); | ||
116 | close(fd); | ||
117 | } else { | ||
118 | i = recv(ev.data.fd, buf, sizeof(buf), 0); | ||
119 | } | ||
120 | |||
121 | if (i < 0) | ||
122 | error(1, errno, "failed to recv"); | ||
123 | |||
124 | return ev.data.fd; | ||
125 | } | ||
126 | |||
127 | static void test(int *rcv_fds, int count, int proto) | ||
128 | { | ||
129 | struct epoll_event ev; | ||
130 | int epfd, i, test_fd; | ||
131 | uint16_t test_family; | ||
132 | socklen_t len; | ||
133 | |||
134 | epfd = epoll_create(1); | ||
135 | if (epfd < 0) | ||
136 | error(1, errno, "failed to create epoll"); | ||
137 | |||
138 | ev.events = EPOLLIN; | ||
139 | for (i = 0; i < count; ++i) { | ||
140 | ev.data.fd = rcv_fds[i]; | ||
141 | if (epoll_ctl(epfd, EPOLL_CTL_ADD, rcv_fds[i], &ev)) | ||
142 | error(1, errno, "failed to register sock epoll"); | ||
143 | } | ||
144 | |||
145 | send_from_v4(proto); | ||
146 | |||
147 | test_fd = receive_once(epfd, proto); | ||
148 | if (getsockopt(test_fd, SOL_SOCKET, SO_DOMAIN, &test_family, &len)) | ||
149 | error(1, errno, "failed to read socket domain"); | ||
150 | if (test_family != AF_INET) | ||
151 | error(1, 0, "expected to receive on v4 socket but got v6 (%d)", | ||
152 | test_family); | ||
153 | |||
154 | close(epfd); | ||
155 | } | ||
156 | |||
157 | int main(void) | ||
158 | { | ||
159 | int rcv_fds[32], i; | ||
160 | |||
161 | fprintf(stderr, "---- UDP IPv4 created before IPv6 ----\n"); | ||
162 | build_rcv_fd(AF_INET, SOCK_DGRAM, rcv_fds, 5); | ||
163 | build_rcv_fd(AF_INET6, SOCK_DGRAM, &(rcv_fds[5]), 5); | ||
164 | test(rcv_fds, 10, SOCK_DGRAM); | ||
165 | for (i = 0; i < 10; ++i) | ||
166 | close(rcv_fds[i]); | ||
167 | |||
168 | fprintf(stderr, "---- UDP IPv6 created before IPv4 ----\n"); | ||
169 | build_rcv_fd(AF_INET6, SOCK_DGRAM, rcv_fds, 5); | ||
170 | build_rcv_fd(AF_INET, SOCK_DGRAM, &(rcv_fds[5]), 5); | ||
171 | test(rcv_fds, 10, SOCK_DGRAM); | ||
172 | for (i = 0; i < 10; ++i) | ||
173 | close(rcv_fds[i]); | ||
174 | |||
175 | /* NOTE: UDP socket lookups traverse a different code path when there | ||
176 | * are > 10 sockets in a group. | ||
177 | */ | ||
178 | fprintf(stderr, "---- UDP IPv4 created before IPv6 (large) ----\n"); | ||
179 | build_rcv_fd(AF_INET, SOCK_DGRAM, rcv_fds, 16); | ||
180 | build_rcv_fd(AF_INET6, SOCK_DGRAM, &(rcv_fds[16]), 16); | ||
181 | test(rcv_fds, 32, SOCK_DGRAM); | ||
182 | for (i = 0; i < 32; ++i) | ||
183 | close(rcv_fds[i]); | ||
184 | |||
185 | fprintf(stderr, "---- UDP IPv6 created before IPv4 (large) ----\n"); | ||
186 | build_rcv_fd(AF_INET6, SOCK_DGRAM, rcv_fds, 16); | ||
187 | build_rcv_fd(AF_INET, SOCK_DGRAM, &(rcv_fds[16]), 16); | ||
188 | test(rcv_fds, 32, SOCK_DGRAM); | ||
189 | for (i = 0; i < 32; ++i) | ||
190 | close(rcv_fds[i]); | ||
191 | |||
192 | fprintf(stderr, "---- TCP IPv4 created before IPv6 ----\n"); | ||
193 | build_rcv_fd(AF_INET, SOCK_STREAM, rcv_fds, 5); | ||
194 | build_rcv_fd(AF_INET6, SOCK_STREAM, &(rcv_fds[5]), 5); | ||
195 | test(rcv_fds, 10, SOCK_STREAM); | ||
196 | for (i = 0; i < 10; ++i) | ||
197 | close(rcv_fds[i]); | ||
198 | |||
199 | fprintf(stderr, "---- TCP IPv6 created before IPv4 ----\n"); | ||
200 | build_rcv_fd(AF_INET6, SOCK_STREAM, rcv_fds, 5); | ||
201 | build_rcv_fd(AF_INET, SOCK_STREAM, &(rcv_fds[5]), 5); | ||
202 | test(rcv_fds, 10, SOCK_STREAM); | ||
203 | for (i = 0; i < 10; ++i) | ||
204 | close(rcv_fds[i]); | ||
205 | |||
206 | fprintf(stderr, "SUCCESS\n"); | ||
207 | return 0; | ||
208 | } | ||
diff --git a/tools/testing/selftests/seccomp/seccomp_bpf.c b/tools/testing/selftests/seccomp/seccomp_bpf.c index b9453b838162..150829dd7998 100644 --- a/tools/testing/selftests/seccomp/seccomp_bpf.c +++ b/tools/testing/selftests/seccomp/seccomp_bpf.c | |||
@@ -1497,15 +1497,15 @@ TEST_F(TRACE_syscall, syscall_dropped) | |||
1497 | #define SECCOMP_SET_MODE_FILTER 1 | 1497 | #define SECCOMP_SET_MODE_FILTER 1 |
1498 | #endif | 1498 | #endif |
1499 | 1499 | ||
1500 | #ifndef SECCOMP_FLAG_FILTER_TSYNC | 1500 | #ifndef SECCOMP_FILTER_FLAG_TSYNC |
1501 | #define SECCOMP_FLAG_FILTER_TSYNC 1 | 1501 | #define SECCOMP_FILTER_FLAG_TSYNC 1 |
1502 | #endif | 1502 | #endif |
1503 | 1503 | ||
1504 | #ifndef seccomp | 1504 | #ifndef seccomp |
1505 | int seccomp(unsigned int op, unsigned int flags, struct sock_fprog *filter) | 1505 | int seccomp(unsigned int op, unsigned int flags, void *args) |
1506 | { | 1506 | { |
1507 | errno = 0; | 1507 | errno = 0; |
1508 | return syscall(__NR_seccomp, op, flags, filter); | 1508 | return syscall(__NR_seccomp, op, flags, args); |
1509 | } | 1509 | } |
1510 | #endif | 1510 | #endif |
1511 | 1511 | ||
@@ -1613,7 +1613,7 @@ TEST(TSYNC_first) | |||
1613 | TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!"); | 1613 | TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!"); |
1614 | } | 1614 | } |
1615 | 1615 | ||
1616 | ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC, | 1616 | ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC, |
1617 | &prog); | 1617 | &prog); |
1618 | ASSERT_NE(ENOSYS, errno) { | 1618 | ASSERT_NE(ENOSYS, errno) { |
1619 | TH_LOG("Kernel does not support seccomp syscall!"); | 1619 | TH_LOG("Kernel does not support seccomp syscall!"); |
@@ -1831,7 +1831,7 @@ TEST_F(TSYNC, two_siblings_with_ancestor) | |||
1831 | self->sibling_count++; | 1831 | self->sibling_count++; |
1832 | } | 1832 | } |
1833 | 1833 | ||
1834 | ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC, | 1834 | ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC, |
1835 | &self->apply_prog); | 1835 | &self->apply_prog); |
1836 | ASSERT_EQ(0, ret) { | 1836 | ASSERT_EQ(0, ret) { |
1837 | TH_LOG("Could install filter on all threads!"); | 1837 | TH_LOG("Could install filter on all threads!"); |
@@ -1892,7 +1892,7 @@ TEST_F(TSYNC, two_siblings_with_no_filter) | |||
1892 | TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!"); | 1892 | TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!"); |
1893 | } | 1893 | } |
1894 | 1894 | ||
1895 | ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC, | 1895 | ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC, |
1896 | &self->apply_prog); | 1896 | &self->apply_prog); |
1897 | ASSERT_NE(ENOSYS, errno) { | 1897 | ASSERT_NE(ENOSYS, errno) { |
1898 | TH_LOG("Kernel does not support seccomp syscall!"); | 1898 | TH_LOG("Kernel does not support seccomp syscall!"); |
@@ -1940,7 +1940,7 @@ TEST_F(TSYNC, two_siblings_with_one_divergence) | |||
1940 | self->sibling_count++; | 1940 | self->sibling_count++; |
1941 | } | 1941 | } |
1942 | 1942 | ||
1943 | ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC, | 1943 | ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC, |
1944 | &self->apply_prog); | 1944 | &self->apply_prog); |
1945 | ASSERT_EQ(self->sibling[0].system_tid, ret) { | 1945 | ASSERT_EQ(self->sibling[0].system_tid, ret) { |
1946 | TH_LOG("Did not fail on diverged sibling."); | 1946 | TH_LOG("Did not fail on diverged sibling."); |
@@ -1992,7 +1992,7 @@ TEST_F(TSYNC, two_siblings_not_under_filter) | |||
1992 | TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER!"); | 1992 | TH_LOG("Kernel does not support SECCOMP_SET_MODE_FILTER!"); |
1993 | } | 1993 | } |
1994 | 1994 | ||
1995 | ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC, | 1995 | ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC, |
1996 | &self->apply_prog); | 1996 | &self->apply_prog); |
1997 | ASSERT_EQ(ret, self->sibling[0].system_tid) { | 1997 | ASSERT_EQ(ret, self->sibling[0].system_tid) { |
1998 | TH_LOG("Did not fail on diverged sibling."); | 1998 | TH_LOG("Did not fail on diverged sibling."); |
@@ -2021,7 +2021,7 @@ TEST_F(TSYNC, two_siblings_not_under_filter) | |||
2021 | /* Switch to the remaining sibling */ | 2021 | /* Switch to the remaining sibling */ |
2022 | sib = !sib; | 2022 | sib = !sib; |
2023 | 2023 | ||
2024 | ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC, | 2024 | ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC, |
2025 | &self->apply_prog); | 2025 | &self->apply_prog); |
2026 | ASSERT_EQ(0, ret) { | 2026 | ASSERT_EQ(0, ret) { |
2027 | TH_LOG("Expected the remaining sibling to sync"); | 2027 | TH_LOG("Expected the remaining sibling to sync"); |
@@ -2044,7 +2044,7 @@ TEST_F(TSYNC, two_siblings_not_under_filter) | |||
2044 | while (!kill(self->sibling[sib].system_tid, 0)) | 2044 | while (!kill(self->sibling[sib].system_tid, 0)) |
2045 | sleep(0.1); | 2045 | sleep(0.1); |
2046 | 2046 | ||
2047 | ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FLAG_FILTER_TSYNC, | 2047 | ret = seccomp(SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_TSYNC, |
2048 | &self->apply_prog); | 2048 | &self->apply_prog); |
2049 | ASSERT_EQ(0, ret); /* just us chickens */ | 2049 | ASSERT_EQ(0, ret); /* just us chickens */ |
2050 | } | 2050 | } |