aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorIngo Molnar2012-12-08 08:25:06 -0600
committerIngo Molnar2012-12-08 08:25:06 -0600
commitf0b9abfb044649bc452fb2fb975ff2fd599cc6a3 (patch)
tree7800081c5cb16a4dfee1e57a70f3be90f7b50d9a /tools
parentadc1ef1e37358d3c17d1a74a58b2e104fc0bda15 (diff)
parent1b3c393cd43f22ead8a6a2f839efc6df8ebd7465 (diff)
downloadkernel-video-f0b9abfb044649bc452fb2fb975ff2fd599cc6a3.tar.gz
kernel-video-f0b9abfb044649bc452fb2fb975ff2fd599cc6a3.tar.xz
kernel-video-f0b9abfb044649bc452fb2fb975ff2fd599cc6a3.zip
Merge branch 'linus' into perf/core
Conflicts: tools/perf/Makefile tools/perf/builtin-test.c tools/perf/perf.h tools/perf/tests/parse-events.c tools/perf/util/evsel.h Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'tools')
-rw-r--r--tools/perf/Makefile30
-rw-r--r--tools/perf/arch/x86/include/perf_regs.h2
-rw-r--r--tools/perf/builtin-kvm.c121
-rw-r--r--tools/perf/perf.h15
-rw-r--r--tools/perf/tests/parse-events.c2
-rw-r--r--tools/perf/util/evsel.c4
-rw-r--r--tools/perf/util/evsel.h2
-rw-r--r--tools/perf/util/header.c2
-rw-r--r--tools/perf/util/header.h2
-rw-r--r--tools/perf/util/parse-events.c2
-rw-r--r--tools/perf/util/parse-events.h2
-rw-r--r--tools/perf/util/pmu.h2
-rw-r--r--tools/perf/util/session.h2
-rw-r--r--tools/perf/util/strbuf.c8
-rw-r--r--tools/power/x86/turbostat/turbostat.c28
-rwxr-xr-xtools/testing/ktest/ktest.pl6
-rw-r--r--tools/testing/selftests/Makefile2
-rw-r--r--tools/testing/selftests/epoll/Makefile11
-rw-r--r--tools/testing/selftests/epoll/test_epoll.c344
-rw-r--r--tools/vm/page-types.c2
20 files changed, 140 insertions, 449 deletions
diff --git a/tools/perf/Makefile b/tools/perf/Makefile
index a7c6aa8d4a8..891bc77bdb2 100644
--- a/tools/perf/Makefile
+++ b/tools/perf/Makefile
@@ -169,7 +169,35 @@ endif
169 169
170### --- END CONFIGURATION SECTION --- 170### --- END CONFIGURATION SECTION ---
171 171
172BASIC_CFLAGS = -Iutil/include -Iarch/$(ARCH)/include -I$(OUTPUT)util -Iutil -I. -I$(TRACE_EVENT_DIR) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE 172ifeq ($(srctree),)
173srctree := $(patsubst %/,%,$(dir $(shell pwd)))
174srctree := $(patsubst %/,%,$(dir $(srctree)))
175#$(info Determined 'srctree' to be $(srctree))
176endif
177
178ifneq ($(objtree),)
179#$(info Determined 'objtree' to be $(objtree))
180endif
181
182ifneq ($(OUTPUT),)
183#$(info Determined 'OUTPUT' to be $(OUTPUT))
184endif
185
186BASIC_CFLAGS = \
187 -Iutil/include \
188 -Iarch/$(ARCH)/include \
189 $(if $(objtree),-I$(objtree)/arch/$(ARCH)/include/generated/uapi) \
190 -I$(srctree)/arch/$(ARCH)/include/uapi \
191 -I$(srctree)/arch/$(ARCH)/include \
192 $(if $(objtree),-I$(objtree)/include/generated/uapi) \
193 -I$(srctree)/include/uapi \
194 -I$(srctree)/include \
195 -I$(OUTPUT)util \
196 -Iutil \
197 -I. \
198 -I$(TRACE_EVENT_DIR) \
199 -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
200
173BASIC_LDFLAGS = 201BASIC_LDFLAGS =
174 202
175ifeq ($(call try-cc,$(SOURCE_BIONIC),$(CFLAGS),bionic),y) 203ifeq ($(call try-cc,$(SOURCE_BIONIC),$(CFLAGS),bionic),y)
diff --git a/tools/perf/arch/x86/include/perf_regs.h b/tools/perf/arch/x86/include/perf_regs.h
index 46fc9f15c6b..7fcdcdbee91 100644
--- a/tools/perf/arch/x86/include/perf_regs.h
+++ b/tools/perf/arch/x86/include/perf_regs.h
@@ -3,7 +3,7 @@
3 3
4#include <stdlib.h> 4#include <stdlib.h>
5#include "../../util/types.h" 5#include "../../util/types.h"
6#include "../../../../../arch/x86/include/asm/perf_regs.h" 6#include <asm/perf_regs.h>
7 7
8#ifndef ARCH_X86_64 8#ifndef ARCH_X86_64
9#define PERF_REGS_MASK ((1ULL << PERF_REG_X86_32_MAX) - 1) 9#define PERF_REGS_MASK ((1ULL << PERF_REG_X86_32_MAX) - 1)
diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c
index 836c82f0137..ca3f80ebc10 100644
--- a/tools/perf/builtin-kvm.c
+++ b/tools/perf/builtin-kvm.c
@@ -22,9 +22,10 @@
22#include <pthread.h> 22#include <pthread.h>
23#include <math.h> 23#include <math.h>
24 24
25#include "../../arch/x86/include/asm/svm.h" 25#if defined(__i386__) || defined(__x86_64__)
26#include "../../arch/x86/include/asm/vmx.h" 26#include <asm/svm.h>
27#include "../../arch/x86/include/asm/kvm.h" 27#include <asm/vmx.h>
28#include <asm/kvm.h>
28 29
29struct event_key { 30struct event_key {
30 #define INVALID_KEY (~0ULL) 31 #define INVALID_KEY (~0ULL)
@@ -58,7 +59,7 @@ struct kvm_event_key {
58}; 59};
59 60
60 61
61struct perf_kvm; 62struct perf_kvm_stat;
62 63
63struct kvm_events_ops { 64struct kvm_events_ops {
64 bool (*is_begin_event)(struct perf_evsel *evsel, 65 bool (*is_begin_event)(struct perf_evsel *evsel,
@@ -66,7 +67,7 @@ struct kvm_events_ops {
66 struct event_key *key); 67 struct event_key *key);
67 bool (*is_end_event)(struct perf_evsel *evsel, 68 bool (*is_end_event)(struct perf_evsel *evsel,
68 struct perf_sample *sample, struct event_key *key); 69 struct perf_sample *sample, struct event_key *key);
69 void (*decode_key)(struct perf_kvm *kvm, struct event_key *key, 70 void (*decode_key)(struct perf_kvm_stat *kvm, struct event_key *key,
70 char decode[20]); 71 char decode[20]);
71 const char *name; 72 const char *name;
72}; 73};
@@ -79,7 +80,7 @@ struct exit_reasons_table {
79#define EVENTS_BITS 12 80#define EVENTS_BITS 12
80#define EVENTS_CACHE_SIZE (1UL << EVENTS_BITS) 81#define EVENTS_CACHE_SIZE (1UL << EVENTS_BITS)
81 82
82struct perf_kvm { 83struct perf_kvm_stat {
83 struct perf_tool tool; 84 struct perf_tool tool;
84 struct perf_session *session; 85 struct perf_session *session;
85 86
@@ -146,7 +147,7 @@ static struct exit_reasons_table svm_exit_reasons[] = {
146 SVM_EXIT_REASONS 147 SVM_EXIT_REASONS
147}; 148};
148 149
149static const char *get_exit_reason(struct perf_kvm *kvm, u64 exit_code) 150static const char *get_exit_reason(struct perf_kvm_stat *kvm, u64 exit_code)
150{ 151{
151 int i = kvm->exit_reasons_size; 152 int i = kvm->exit_reasons_size;
152 struct exit_reasons_table *tbl = kvm->exit_reasons; 153 struct exit_reasons_table *tbl = kvm->exit_reasons;
@@ -162,7 +163,7 @@ static const char *get_exit_reason(struct perf_kvm *kvm, u64 exit_code)
162 return "UNKNOWN"; 163 return "UNKNOWN";
163} 164}
164 165
165static void exit_event_decode_key(struct perf_kvm *kvm, 166static void exit_event_decode_key(struct perf_kvm_stat *kvm,
166 struct event_key *key, 167 struct event_key *key,
167 char decode[20]) 168 char decode[20])
168{ 169{
@@ -228,7 +229,7 @@ static bool mmio_event_end(struct perf_evsel *evsel, struct perf_sample *sample,
228 return false; 229 return false;
229} 230}
230 231
231static void mmio_event_decode_key(struct perf_kvm *kvm __maybe_unused, 232static void mmio_event_decode_key(struct perf_kvm_stat *kvm __maybe_unused,
232 struct event_key *key, 233 struct event_key *key,
233 char decode[20]) 234 char decode[20])
234{ 235{
@@ -271,7 +272,7 @@ static bool ioport_event_end(struct perf_evsel *evsel,
271 return kvm_entry_event(evsel); 272 return kvm_entry_event(evsel);
272} 273}
273 274
274static void ioport_event_decode_key(struct perf_kvm *kvm __maybe_unused, 275static void ioport_event_decode_key(struct perf_kvm_stat *kvm __maybe_unused,
275 struct event_key *key, 276 struct event_key *key,
276 char decode[20]) 277 char decode[20])
277{ 278{
@@ -286,7 +287,7 @@ static struct kvm_events_ops ioport_events = {
286 .name = "IO Port Access" 287 .name = "IO Port Access"
287}; 288};
288 289
289static bool register_kvm_events_ops(struct perf_kvm *kvm) 290static bool register_kvm_events_ops(struct perf_kvm_stat *kvm)
290{ 291{
291 bool ret = true; 292 bool ret = true;
292 293
@@ -311,7 +312,7 @@ struct vcpu_event_record {
311}; 312};
312 313
313 314
314static void init_kvm_event_record(struct perf_kvm *kvm) 315static void init_kvm_event_record(struct perf_kvm_stat *kvm)
315{ 316{
316 unsigned int i; 317 unsigned int i;
317 318
@@ -360,7 +361,7 @@ static struct kvm_event *kvm_alloc_init_event(struct event_key *key)
360 return event; 361 return event;
361} 362}
362 363
363static struct kvm_event *find_create_kvm_event(struct perf_kvm *kvm, 364static struct kvm_event *find_create_kvm_event(struct perf_kvm_stat *kvm,
364 struct event_key *key) 365 struct event_key *key)
365{ 366{
366 struct kvm_event *event; 367 struct kvm_event *event;
@@ -382,7 +383,7 @@ static struct kvm_event *find_create_kvm_event(struct perf_kvm *kvm,
382 return event; 383 return event;
383} 384}
384 385
385static bool handle_begin_event(struct perf_kvm *kvm, 386static bool handle_begin_event(struct perf_kvm_stat *kvm,
386 struct vcpu_event_record *vcpu_record, 387 struct vcpu_event_record *vcpu_record,
387 struct event_key *key, u64 timestamp) 388 struct event_key *key, u64 timestamp)
388{ 389{
@@ -429,7 +430,7 @@ static bool update_kvm_event(struct kvm_event *event, int vcpu_id,
429 return true; 430 return true;
430} 431}
431 432
432static bool handle_end_event(struct perf_kvm *kvm, 433static bool handle_end_event(struct perf_kvm_stat *kvm,
433 struct vcpu_event_record *vcpu_record, 434 struct vcpu_event_record *vcpu_record,
434 struct event_key *key, 435 struct event_key *key,
435 u64 timestamp) 436 u64 timestamp)
@@ -496,7 +497,7 @@ struct vcpu_event_record *per_vcpu_record(struct thread *thread,
496 return thread->priv; 497 return thread->priv;
497} 498}
498 499
499static bool handle_kvm_event(struct perf_kvm *kvm, 500static bool handle_kvm_event(struct perf_kvm_stat *kvm,
500 struct thread *thread, 501 struct thread *thread,
501 struct perf_evsel *evsel, 502 struct perf_evsel *evsel,
502 struct perf_sample *sample) 503 struct perf_sample *sample)
@@ -556,7 +557,7 @@ static struct kvm_event_key keys[] = {
556 { NULL, NULL } 557 { NULL, NULL }
557}; 558};
558 559
559static bool select_key(struct perf_kvm *kvm) 560static bool select_key(struct perf_kvm_stat *kvm)
560{ 561{
561 int i; 562 int i;
562 563
@@ -592,7 +593,8 @@ static void insert_to_result(struct rb_root *result, struct kvm_event *event,
592 rb_insert_color(&event->rb, result); 593 rb_insert_color(&event->rb, result);
593} 594}
594 595
595static void update_total_count(struct perf_kvm *kvm, struct kvm_event *event) 596static void
597update_total_count(struct perf_kvm_stat *kvm, struct kvm_event *event)
596{ 598{
597 int vcpu = kvm->trace_vcpu; 599 int vcpu = kvm->trace_vcpu;
598 600
@@ -605,7 +607,7 @@ static bool event_is_valid(struct kvm_event *event, int vcpu)
605 return !!get_event_count(event, vcpu); 607 return !!get_event_count(event, vcpu);
606} 608}
607 609
608static void sort_result(struct perf_kvm *kvm) 610static void sort_result(struct perf_kvm_stat *kvm)
609{ 611{
610 unsigned int i; 612 unsigned int i;
611 int vcpu = kvm->trace_vcpu; 613 int vcpu = kvm->trace_vcpu;
@@ -644,7 +646,7 @@ static void print_vcpu_info(int vcpu)
644 pr_info("VCPU %d:\n\n", vcpu); 646 pr_info("VCPU %d:\n\n", vcpu);
645} 647}
646 648
647static void print_result(struct perf_kvm *kvm) 649static void print_result(struct perf_kvm_stat *kvm)
648{ 650{
649 char decode[20]; 651 char decode[20];
650 struct kvm_event *event; 652 struct kvm_event *event;
@@ -687,7 +689,8 @@ static int process_sample_event(struct perf_tool *tool,
687 struct machine *machine) 689 struct machine *machine)
688{ 690{
689 struct thread *thread = machine__findnew_thread(machine, sample->tid); 691 struct thread *thread = machine__findnew_thread(machine, sample->tid);
690 struct perf_kvm *kvm = container_of(tool, struct perf_kvm, tool); 692 struct perf_kvm_stat *kvm = container_of(tool, struct perf_kvm_stat,
693 tool);
691 694
692 if (thread == NULL) { 695 if (thread == NULL) {
693 pr_debug("problem processing %d event, skipping it.\n", 696 pr_debug("problem processing %d event, skipping it.\n",
@@ -718,7 +721,7 @@ static int get_cpu_isa(struct perf_session *session)
718 return isa; 721 return isa;
719} 722}
720 723
721static int read_events(struct perf_kvm *kvm) 724static int read_events(struct perf_kvm_stat *kvm)
722{ 725{
723 int ret; 726 int ret;
724 727
@@ -767,7 +770,7 @@ static bool verify_vcpu(int vcpu)
767 return true; 770 return true;
768} 771}
769 772
770static int kvm_events_report_vcpu(struct perf_kvm *kvm) 773static int kvm_events_report_vcpu(struct perf_kvm_stat *kvm)
771{ 774{
772 int ret = -EINVAL; 775 int ret = -EINVAL;
773 int vcpu = kvm->trace_vcpu; 776 int vcpu = kvm->trace_vcpu;
@@ -815,7 +818,8 @@ static const char * const record_args[] = {
815 _p; \ 818 _p; \
816 }) 819 })
817 820
818static int kvm_events_record(struct perf_kvm *kvm, int argc, const char **argv) 821static int
822kvm_events_record(struct perf_kvm_stat *kvm, int argc, const char **argv)
819{ 823{
820 unsigned int rec_argc, i, j; 824 unsigned int rec_argc, i, j;
821 const char **rec_argv; 825 const char **rec_argv;
@@ -838,7 +842,8 @@ static int kvm_events_record(struct perf_kvm *kvm, int argc, const char **argv)
838 return cmd_record(i, rec_argv, NULL); 842 return cmd_record(i, rec_argv, NULL);
839} 843}
840 844
841static int kvm_events_report(struct perf_kvm *kvm, int argc, const char **argv) 845static int
846kvm_events_report(struct perf_kvm_stat *kvm, int argc, const char **argv)
842{ 847{
843 const struct option kvm_events_report_options[] = { 848 const struct option kvm_events_report_options[] = {
844 OPT_STRING(0, "event", &kvm->report_event, "report event", 849 OPT_STRING(0, "event", &kvm->report_event, "report event",
@@ -881,24 +886,37 @@ static void print_kvm_stat_usage(void)
881 printf("\nOtherwise, it is the alias of 'perf stat':\n"); 886 printf("\nOtherwise, it is the alias of 'perf stat':\n");
882} 887}
883 888
884static int kvm_cmd_stat(struct perf_kvm *kvm, int argc, const char **argv) 889static int kvm_cmd_stat(const char *file_name, int argc, const char **argv)
885{ 890{
891 struct perf_kvm_stat kvm = {
892 .file_name = file_name,
893
894 .trace_vcpu = -1,
895 .report_event = "vmexit",
896 .sort_key = "sample",
897
898 .exit_reasons = svm_exit_reasons,
899 .exit_reasons_size = ARRAY_SIZE(svm_exit_reasons),
900 .exit_reasons_isa = "SVM",
901 };
902
886 if (argc == 1) { 903 if (argc == 1) {
887 print_kvm_stat_usage(); 904 print_kvm_stat_usage();
888 goto perf_stat; 905 goto perf_stat;
889 } 906 }
890 907
891 if (!strncmp(argv[1], "rec", 3)) 908 if (!strncmp(argv[1], "rec", 3))
892 return kvm_events_record(kvm, argc - 1, argv + 1); 909 return kvm_events_record(&kvm, argc - 1, argv + 1);
893 910
894 if (!strncmp(argv[1], "rep", 3)) 911 if (!strncmp(argv[1], "rep", 3))
895 return kvm_events_report(kvm, argc - 1 , argv + 1); 912 return kvm_events_report(&kvm, argc - 1 , argv + 1);
896 913
897perf_stat: 914perf_stat:
898 return cmd_stat(argc, argv, NULL); 915 return cmd_stat(argc, argv, NULL);
899} 916}
917#endif
900 918
901static int __cmd_record(struct perf_kvm *kvm, int argc, const char **argv) 919static int __cmd_record(const char *file_name, int argc, const char **argv)
902{ 920{
903 int rec_argc, i = 0, j; 921 int rec_argc, i = 0, j;
904 const char **rec_argv; 922 const char **rec_argv;
@@ -907,7 +925,7 @@ static int __cmd_record(struct perf_kvm *kvm, int argc, const char **argv)
907 rec_argv = calloc(rec_argc + 1, sizeof(char *)); 925 rec_argv = calloc(rec_argc + 1, sizeof(char *));
908 rec_argv[i++] = strdup("record"); 926 rec_argv[i++] = strdup("record");
909 rec_argv[i++] = strdup("-o"); 927 rec_argv[i++] = strdup("-o");
910 rec_argv[i++] = strdup(kvm->file_name); 928 rec_argv[i++] = strdup(file_name);
911 for (j = 1; j < argc; j++, i++) 929 for (j = 1; j < argc; j++, i++)
912 rec_argv[i] = argv[j]; 930 rec_argv[i] = argv[j];
913 931
@@ -916,7 +934,7 @@ static int __cmd_record(struct perf_kvm *kvm, int argc, const char **argv)
916 return cmd_record(i, rec_argv, NULL); 934 return cmd_record(i, rec_argv, NULL);
917} 935}
918 936
919static int __cmd_report(struct perf_kvm *kvm, int argc, const char **argv) 937static int __cmd_report(const char *file_name, int argc, const char **argv)
920{ 938{
921 int rec_argc, i = 0, j; 939 int rec_argc, i = 0, j;
922 const char **rec_argv; 940 const char **rec_argv;
@@ -925,7 +943,7 @@ static int __cmd_report(struct perf_kvm *kvm, int argc, const char **argv)
925 rec_argv = calloc(rec_argc + 1, sizeof(char *)); 943 rec_argv = calloc(rec_argc + 1, sizeof(char *));
926 rec_argv[i++] = strdup("report"); 944 rec_argv[i++] = strdup("report");
927 rec_argv[i++] = strdup("-i"); 945 rec_argv[i++] = strdup("-i");
928 rec_argv[i++] = strdup(kvm->file_name); 946 rec_argv[i++] = strdup(file_name);
929 for (j = 1; j < argc; j++, i++) 947 for (j = 1; j < argc; j++, i++)
930 rec_argv[i] = argv[j]; 948 rec_argv[i] = argv[j];
931 949
@@ -934,7 +952,8 @@ static int __cmd_report(struct perf_kvm *kvm, int argc, const char **argv)
934 return cmd_report(i, rec_argv, NULL); 952 return cmd_report(i, rec_argv, NULL);
935} 953}
936 954
937static int __cmd_buildid_list(struct perf_kvm *kvm, int argc, const char **argv) 955static int
956__cmd_buildid_list(const char *file_name, int argc, const char **argv)
938{ 957{
939 int rec_argc, i = 0, j; 958 int rec_argc, i = 0, j;
940 const char **rec_argv; 959 const char **rec_argv;
@@ -943,7 +962,7 @@ static int __cmd_buildid_list(struct perf_kvm *kvm, int argc, const char **argv)
943 rec_argv = calloc(rec_argc + 1, sizeof(char *)); 962 rec_argv = calloc(rec_argc + 1, sizeof(char *));
944 rec_argv[i++] = strdup("buildid-list"); 963 rec_argv[i++] = strdup("buildid-list");
945 rec_argv[i++] = strdup("-i"); 964 rec_argv[i++] = strdup("-i");
946 rec_argv[i++] = strdup(kvm->file_name); 965 rec_argv[i++] = strdup(file_name);
947 for (j = 1; j < argc; j++, i++) 966 for (j = 1; j < argc; j++, i++)
948 rec_argv[i] = argv[j]; 967 rec_argv[i] = argv[j];
949 968
@@ -954,20 +973,12 @@ static int __cmd_buildid_list(struct perf_kvm *kvm, int argc, const char **argv)
954 973
955int cmd_kvm(int argc, const char **argv, const char *prefix __maybe_unused) 974int cmd_kvm(int argc, const char **argv, const char *prefix __maybe_unused)
956{ 975{
957 struct perf_kvm kvm = { 976 const char *file_name;
958 .trace_vcpu = -1,
959 .report_event = "vmexit",
960 .sort_key = "sample",
961
962 .exit_reasons = svm_exit_reasons,
963 .exit_reasons_size = ARRAY_SIZE(svm_exit_reasons),
964 .exit_reasons_isa = "SVM",
965 };
966 977
967 const struct option kvm_options[] = { 978 const struct option kvm_options[] = {
968 OPT_STRING('i', "input", &kvm.file_name, "file", 979 OPT_STRING('i', "input", &file_name, "file",
969 "Input file name"), 980 "Input file name"),
970 OPT_STRING('o', "output", &kvm.file_name, "file", 981 OPT_STRING('o', "output", &file_name, "file",
971 "Output file name"), 982 "Output file name"),
972 OPT_BOOLEAN(0, "guest", &perf_guest, 983 OPT_BOOLEAN(0, "guest", &perf_guest,
973 "Collect guest os data"), 984 "Collect guest os data"),
@@ -1002,32 +1013,34 @@ int cmd_kvm(int argc, const char **argv, const char *prefix __maybe_unused)
1002 if (!perf_host) 1013 if (!perf_host)
1003 perf_guest = 1; 1014 perf_guest = 1;
1004 1015
1005 if (!kvm.file_name) { 1016 if (!file_name) {
1006 if (perf_host && !perf_guest) 1017 if (perf_host && !perf_guest)
1007 kvm.file_name = strdup("perf.data.host"); 1018 file_name = strdup("perf.data.host");
1008 else if (!perf_host && perf_guest) 1019 else if (!perf_host && perf_guest)
1009 kvm.file_name = strdup("perf.data.guest"); 1020 file_name = strdup("perf.data.guest");
1010 else 1021 else
1011 kvm.file_name = strdup("perf.data.kvm"); 1022 file_name = strdup("perf.data.kvm");
1012 1023
1013 if (!kvm.file_name) { 1024 if (!file_name) {
1014 pr_err("Failed to allocate memory for filename\n"); 1025 pr_err("Failed to allocate memory for filename\n");
1015 return -ENOMEM; 1026 return -ENOMEM;
1016 } 1027 }
1017 } 1028 }
1018 1029
1019 if (!strncmp(argv[0], "rec", 3)) 1030 if (!strncmp(argv[0], "rec", 3))
1020 return __cmd_record(&kvm, argc, argv); 1031 return __cmd_record(file_name, argc, argv);
1021 else if (!strncmp(argv[0], "rep", 3)) 1032 else if (!strncmp(argv[0], "rep", 3))
1022 return __cmd_report(&kvm, argc, argv); 1033 return __cmd_report(file_name, argc, argv);
1023 else if (!strncmp(argv[0], "diff", 4)) 1034 else if (!strncmp(argv[0], "diff", 4))
1024 return cmd_diff(argc, argv, NULL); 1035 return cmd_diff(argc, argv, NULL);
1025 else if (!strncmp(argv[0], "top", 3)) 1036 else if (!strncmp(argv[0], "top", 3))
1026 return cmd_top(argc, argv, NULL); 1037 return cmd_top(argc, argv, NULL);
1027 else if (!strncmp(argv[0], "buildid-list", 12)) 1038 else if (!strncmp(argv[0], "buildid-list", 12))
1028 return __cmd_buildid_list(&kvm, argc, argv); 1039 return __cmd_buildid_list(file_name, argc, argv);
1040#if defined(__i386__) || defined(__x86_64__)
1029 else if (!strncmp(argv[0], "stat", 4)) 1041 else if (!strncmp(argv[0], "stat", 4))
1030 return kvm_cmd_stat(&kvm, argc, argv); 1042 return kvm_cmd_stat(file_name, argc, argv);
1043#endif
1031 else 1044 else
1032 usage_with_options(kvm_usage, kvm_options); 1045 usage_with_options(kvm_usage, kvm_options);
1033 1046
diff --git a/tools/perf/perf.h b/tools/perf/perf.h
index f53ee0bbee8..2c340e7da45 100644
--- a/tools/perf/perf.h
+++ b/tools/perf/perf.h
@@ -5,8 +5,9 @@ struct winsize;
5 5
6void get_term_dimensions(struct winsize *ws); 6void get_term_dimensions(struct winsize *ws);
7 7
8#include <asm/unistd.h>
9
8#if defined(__i386__) 10#if defined(__i386__)
9#include "../../arch/x86/include/asm/unistd.h"
10#define rmb() asm volatile("lock; addl $0,0(%%esp)" ::: "memory") 11#define rmb() asm volatile("lock; addl $0,0(%%esp)" ::: "memory")
11#define cpu_relax() asm volatile("rep; nop" ::: "memory"); 12#define cpu_relax() asm volatile("rep; nop" ::: "memory");
12#define CPUINFO_PROC "model name" 13#define CPUINFO_PROC "model name"
@@ -16,7 +17,6 @@ void get_term_dimensions(struct winsize *ws);
16#endif 17#endif
17 18
18#if defined(__x86_64__) 19#if defined(__x86_64__)
19#include "../../arch/x86/include/asm/unistd.h"
20#define rmb() asm volatile("lfence" ::: "memory") 20#define rmb() asm volatile("lfence" ::: "memory")
21#define cpu_relax() asm volatile("rep; nop" ::: "memory"); 21#define cpu_relax() asm volatile("rep; nop" ::: "memory");
22#define CPUINFO_PROC "model name" 22#define CPUINFO_PROC "model name"
@@ -33,13 +33,11 @@ void get_term_dimensions(struct winsize *ws);
33#endif 33#endif
34 34
35#ifdef __s390__ 35#ifdef __s390__
36#include "../../arch/s390/include/asm/unistd.h"
37#define rmb() asm volatile("bcr 15,0" ::: "memory") 36#define rmb() asm volatile("bcr 15,0" ::: "memory")
38#define cpu_relax() asm volatile("" ::: "memory"); 37#define cpu_relax() asm volatile("" ::: "memory");
39#endif 38#endif
40 39
41#ifdef __sh__ 40#ifdef __sh__
42#include "../../arch/sh/include/asm/unistd.h"
43#if defined(__SH4A__) || defined(__SH5__) 41#if defined(__SH4A__) || defined(__SH5__)
44# define rmb() asm volatile("synco" ::: "memory") 42# define rmb() asm volatile("synco" ::: "memory")
45#else 43#else
@@ -50,35 +48,30 @@ void get_term_dimensions(struct winsize *ws);
50#endif 48#endif
51 49
52#ifdef __hppa__ 50#ifdef __hppa__
53#include "../../arch/parisc/include/asm/unistd.h"
54#define rmb() asm volatile("" ::: "memory") 51#define rmb() asm volatile("" ::: "memory")
55#define cpu_relax() asm volatile("" ::: "memory"); 52#define cpu_relax() asm volatile("" ::: "memory");
56#define CPUINFO_PROC "cpu" 53#define CPUINFO_PROC "cpu"
57#endif 54#endif
58 55
59#ifdef __sparc__ 56#ifdef __sparc__
60#include "../../arch/sparc/include/uapi/asm/unistd.h"
61#define rmb() asm volatile("":::"memory") 57#define rmb() asm volatile("":::"memory")
62#define cpu_relax() asm volatile("":::"memory") 58#define cpu_relax() asm volatile("":::"memory")
63#define CPUINFO_PROC "cpu" 59#define CPUINFO_PROC "cpu"
64#endif 60#endif
65 61
66#ifdef __alpha__ 62#ifdef __alpha__
67#include "../../arch/alpha/include/asm/unistd.h"
68#define rmb() asm volatile("mb" ::: "memory") 63#define rmb() asm volatile("mb" ::: "memory")
69#define cpu_relax() asm volatile("" ::: "memory") 64#define cpu_relax() asm volatile("" ::: "memory")
70#define CPUINFO_PROC "cpu model" 65#define CPUINFO_PROC "cpu model"
71#endif 66#endif
72 67
73#ifdef __ia64__ 68#ifdef __ia64__
74#include "../../arch/ia64/include/asm/unistd.h"
75#define rmb() asm volatile ("mf" ::: "memory") 69#define rmb() asm volatile ("mf" ::: "memory")
76#define cpu_relax() asm volatile ("hint @pause" ::: "memory") 70#define cpu_relax() asm volatile ("hint @pause" ::: "memory")
77#define CPUINFO_PROC "model name" 71#define CPUINFO_PROC "model name"
78#endif 72#endif
79 73
80#ifdef __arm__ 74#ifdef __arm__
81#include "../../arch/arm/include/asm/unistd.h"
82/* 75/*
83 * Use the __kuser_memory_barrier helper in the CPU helper page. See 76 * Use the __kuser_memory_barrier helper in the CPU helper page. See
84 * arch/arm/kernel/entry-armv.S in the kernel source for details. 77 * arch/arm/kernel/entry-armv.S in the kernel source for details.
@@ -89,13 +82,11 @@ void get_term_dimensions(struct winsize *ws);
89#endif 82#endif
90 83
91#ifdef __aarch64__ 84#ifdef __aarch64__
92#include "../../arch/arm64/include/asm/unistd.h"
93#define rmb() asm volatile("dmb ld" ::: "memory") 85#define rmb() asm volatile("dmb ld" ::: "memory")
94#define cpu_relax() asm volatile("yield" ::: "memory") 86#define cpu_relax() asm volatile("yield" ::: "memory")
95#endif 87#endif
96 88
97#ifdef __mips__ 89#ifdef __mips__
98#include "../../arch/mips/include/asm/unistd.h"
99#define rmb() asm volatile( \ 90#define rmb() asm volatile( \
100 ".set mips2\n\t" \ 91 ".set mips2\n\t" \
101 "sync\n\t" \ 92 "sync\n\t" \
@@ -112,7 +103,7 @@ void get_term_dimensions(struct winsize *ws);
112#include <sys/types.h> 103#include <sys/types.h>
113#include <sys/syscall.h> 104#include <sys/syscall.h>
114 105
115#include "../../include/uapi/linux/perf_event.h" 106#include <linux/perf_event.h>
116#include "util/types.h" 107#include "util/types.h"
117#include <stdbool.h> 108#include <stdbool.h>
118 109
diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
index 42a0c8cd3cd..32ee478905e 100644
--- a/tools/perf/tests/parse-events.c
+++ b/tools/perf/tests/parse-events.c
@@ -3,8 +3,8 @@
3#include "evsel.h" 3#include "evsel.h"
4#include "evlist.h" 4#include "evlist.h"
5#include "sysfs.h" 5#include "sysfs.h"
6#include "../../../include/linux/hw_breakpoint.h"
7#include "tests.h" 6#include "tests.h"
7#include <linux/hw_breakpoint.h>
8 8
9#define TEST_ASSERT_VAL(text, cond) \ 9#define TEST_ASSERT_VAL(text, cond) \
10do { \ 10do { \
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 1fb636c550a..1b16dd1edc8 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -18,8 +18,8 @@
18#include "cpumap.h" 18#include "cpumap.h"
19#include "thread_map.h" 19#include "thread_map.h"
20#include "target.h" 20#include "target.h"
21#include "../../../include/linux/hw_breakpoint.h" 21#include <linux/hw_breakpoint.h>
22#include "../../../include/uapi/linux/perf_event.h" 22#include <linux/perf_event.h>
23#include "perf_regs.h" 23#include "perf_regs.h"
24 24
25#define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y)) 25#define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y))
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index a4c1dd4e149..3d2b8017438 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -4,7 +4,7 @@
4#include <linux/list.h> 4#include <linux/list.h>
5#include <stdbool.h> 5#include <stdbool.h>
6#include <stddef.h> 6#include <stddef.h>
7#include "../../../include/uapi/linux/perf_event.h" 7#include <linux/perf_event.h>
8#include "types.h" 8#include "types.h"
9#include "xyarray.h" 9#include "xyarray.h"
10#include "cgroup.h" 10#include "cgroup.h"
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 195a47a8f05..b7da4634a04 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -1379,6 +1379,8 @@ static void print_numa_topology(struct perf_header *ph, int fd __maybe_unused,
1379 1379
1380 str = tmp + 1; 1380 str = tmp + 1;
1381 fprintf(fp, "# node%u cpu list : %s\n", c, str); 1381 fprintf(fp, "# node%u cpu list : %s\n", c, str);
1382
1383 str += strlen(str) + 1;
1382 } 1384 }
1383 return; 1385 return;
1384error: 1386error:
diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h
index 5f1cd6884f3..20f0344accb 100644
--- a/tools/perf/util/header.h
+++ b/tools/perf/util/header.h
@@ -1,7 +1,7 @@
1#ifndef __PERF_HEADER_H 1#ifndef __PERF_HEADER_H
2#define __PERF_HEADER_H 2#define __PERF_HEADER_H
3 3
4#include "../../../include/uapi/linux/perf_event.h" 4#include <linux/perf_event.h>
5#include <sys/types.h> 5#include <sys/types.h>
6#include <stdbool.h> 6#include <stdbool.h>
7#include "types.h" 7#include "types.h"
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 020323af336..2d8d53bec17 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1,4 +1,4 @@
1#include "../../../include/linux/hw_breakpoint.h" 1#include <linux/hw_breakpoint.h>
2#include "util.h" 2#include "util.h"
3#include "../perf.h" 3#include "../perf.h"
4#include "evlist.h" 4#include "evlist.h"
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index f6399373d67..b7af80b8bdd 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -7,7 +7,7 @@
7#include <linux/list.h> 7#include <linux/list.h>
8#include <stdbool.h> 8#include <stdbool.h>
9#include "types.h" 9#include "types.h"
10#include "../../../include/uapi/linux/perf_event.h" 10#include <linux/perf_event.h>
11#include "types.h" 11#include "types.h"
12 12
13struct list_head; 13struct list_head;
diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h
index 07d553fe8d8..a313ed76a49 100644
--- a/tools/perf/util/pmu.h
+++ b/tools/perf/util/pmu.h
@@ -2,7 +2,7 @@
2#define __PMU_H 2#define __PMU_H
3 3
4#include <linux/bitops.h> 4#include <linux/bitops.h>
5#include "../../../include/uapi/linux/perf_event.h" 5#include <linux/perf_event.h>
6 6
7enum { 7enum {
8 PERF_PMU_FORMAT_VALUE_CONFIG, 8 PERF_PMU_FORMAT_VALUE_CONFIG,
diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h
index 18d1222b05a..cea133a6bdf 100644
--- a/tools/perf/util/session.h
+++ b/tools/perf/util/session.h
@@ -8,7 +8,7 @@
8#include "symbol.h" 8#include "symbol.h"
9#include "thread.h" 9#include "thread.h"
10#include <linux/rbtree.h> 10#include <linux/rbtree.h>
11#include "../../../include/uapi/linux/perf_event.h" 11#include <linux/perf_event.h>
12 12
13struct sample_queue; 13struct sample_queue;
14struct ip_callchain; 14struct ip_callchain;
diff --git a/tools/perf/util/strbuf.c b/tools/perf/util/strbuf.c
index 2eeb51baf07..cfa906882e2 100644
--- a/tools/perf/util/strbuf.c
+++ b/tools/perf/util/strbuf.c
@@ -90,17 +90,17 @@ void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
90 if (!strbuf_avail(sb)) 90 if (!strbuf_avail(sb))
91 strbuf_grow(sb, 64); 91 strbuf_grow(sb, 64);
92 va_start(ap, fmt); 92 va_start(ap, fmt);
93 len = vscnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap); 93 len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
94 va_end(ap); 94 va_end(ap);
95 if (len < 0) 95 if (len < 0)
96 die("your vscnprintf is broken"); 96 die("your vsnprintf is broken");
97 if (len > strbuf_avail(sb)) { 97 if (len > strbuf_avail(sb)) {
98 strbuf_grow(sb, len); 98 strbuf_grow(sb, len);
99 va_start(ap, fmt); 99 va_start(ap, fmt);
100 len = vscnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap); 100 len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
101 va_end(ap); 101 va_end(ap);
102 if (len > strbuf_avail(sb)) { 102 if (len > strbuf_avail(sb)) {
103 die("this should not happen, your snprintf is broken"); 103 die("this should not happen, your vsnprintf is broken");
104 } 104 }
105 } 105 }
106 strbuf_setlen(sb, sb->len + len); 106 strbuf_setlen(sb, sb->len + len);
diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c
index 2655ae9a3ad..ea095abbe97 100644
--- a/tools/power/x86/turbostat/turbostat.c
+++ b/tools/power/x86/turbostat/turbostat.c
@@ -206,8 +206,10 @@ int get_msr(int cpu, off_t offset, unsigned long long *msr)
206 retval = pread(fd, msr, sizeof *msr, offset); 206 retval = pread(fd, msr, sizeof *msr, offset);
207 close(fd); 207 close(fd);
208 208
209 if (retval != sizeof *msr) 209 if (retval != sizeof *msr) {
210 fprintf(stderr, "%s offset 0x%zx read failed\n", pathname, offset);
210 return -1; 211 return -1;
212 }
211 213
212 return 0; 214 return 0;
213} 215}
@@ -1101,7 +1103,9 @@ void turbostat_loop()
1101 1103
1102restart: 1104restart:
1103 retval = for_all_cpus(get_counters, EVEN_COUNTERS); 1105 retval = for_all_cpus(get_counters, EVEN_COUNTERS);
1104 if (retval) { 1106 if (retval < -1) {
1107 exit(retval);
1108 } else if (retval == -1) {
1105 re_initialize(); 1109 re_initialize();
1106 goto restart; 1110 goto restart;
1107 } 1111 }
@@ -1114,7 +1118,9 @@ restart:
1114 } 1118 }
1115 sleep(interval_sec); 1119 sleep(interval_sec);
1116 retval = for_all_cpus(get_counters, ODD_COUNTERS); 1120 retval = for_all_cpus(get_counters, ODD_COUNTERS);
1117 if (retval) { 1121 if (retval < -1) {
1122 exit(retval);
1123 } else if (retval == -1) {
1118 re_initialize(); 1124 re_initialize();
1119 goto restart; 1125 goto restart;
1120 } 1126 }
@@ -1126,7 +1132,9 @@ restart:
1126 flush_stdout(); 1132 flush_stdout();
1127 sleep(interval_sec); 1133 sleep(interval_sec);
1128 retval = for_all_cpus(get_counters, EVEN_COUNTERS); 1134 retval = for_all_cpus(get_counters, EVEN_COUNTERS);
1129 if (retval) { 1135 if (retval < -1) {
1136 exit(retval);
1137 } else if (retval == -1) {
1130 re_initialize(); 1138 re_initialize();
1131 goto restart; 1139 goto restart;
1132 } 1140 }
@@ -1545,8 +1553,11 @@ void turbostat_init()
1545int fork_it(char **argv) 1553int fork_it(char **argv)
1546{ 1554{
1547 pid_t child_pid; 1555 pid_t child_pid;
1556 int status;
1548 1557
1549 for_all_cpus(get_counters, EVEN_COUNTERS); 1558 status = for_all_cpus(get_counters, EVEN_COUNTERS);
1559 if (status)
1560 exit(status);
1550 /* clear affinity side-effect of get_counters() */ 1561 /* clear affinity side-effect of get_counters() */
1551 sched_setaffinity(0, cpu_present_setsize, cpu_present_set); 1562 sched_setaffinity(0, cpu_present_setsize, cpu_present_set);
1552 gettimeofday(&tv_even, (struct timezone *)NULL); 1563 gettimeofday(&tv_even, (struct timezone *)NULL);
@@ -1556,7 +1567,6 @@ int fork_it(char **argv)
1556 /* child */ 1567 /* child */
1557 execvp(argv[0], argv); 1568 execvp(argv[0], argv);
1558 } else { 1569 } else {
1559 int status;
1560 1570
1561 /* parent */ 1571 /* parent */
1562 if (child_pid == -1) { 1572 if (child_pid == -1) {
@@ -1568,7 +1578,7 @@ int fork_it(char **argv)
1568 signal(SIGQUIT, SIG_IGN); 1578 signal(SIGQUIT, SIG_IGN);
1569 if (waitpid(child_pid, &status, 0) == -1) { 1579 if (waitpid(child_pid, &status, 0) == -1) {
1570 perror("wait"); 1580 perror("wait");
1571 exit(1); 1581 exit(status);
1572 } 1582 }
1573 } 1583 }
1574 /* 1584 /*
@@ -1585,7 +1595,7 @@ int fork_it(char **argv)
1585 1595
1586 fprintf(stderr, "%.6f sec\n", tv_delta.tv_sec + tv_delta.tv_usec/1000000.0); 1596 fprintf(stderr, "%.6f sec\n", tv_delta.tv_sec + tv_delta.tv_usec/1000000.0);
1587 1597
1588 return 0; 1598 return status;
1589} 1599}
1590 1600
1591void cmdline(int argc, char **argv) 1601void cmdline(int argc, char **argv)
@@ -1594,7 +1604,7 @@ void cmdline(int argc, char **argv)
1594 1604
1595 progname = argv[0]; 1605 progname = argv[0];
1596 1606
1597 while ((opt = getopt(argc, argv, "+pPSvisc:sC:m:M:")) != -1) { 1607 while ((opt = getopt(argc, argv, "+pPSvi:sc:sC:m:M:")) != -1) {
1598 switch (opt) { 1608 switch (opt) {
1599 case 'p': 1609 case 'p':
1600 show_core_only++; 1610 show_core_only++;
diff --git a/tools/testing/ktest/ktest.pl b/tools/testing/ktest/ktest.pl
index b51d787176d..c7ba7614061 100755
--- a/tools/testing/ktest/ktest.pl
+++ b/tools/testing/ktest/ktest.pl
@@ -1740,8 +1740,10 @@ sub install {
1740 open(IN, "$output_config") or dodie("Can't read config file"); 1740 open(IN, "$output_config") or dodie("Can't read config file");
1741 while (<IN>) { 1741 while (<IN>) {
1742 if (/CONFIG_MODULES(=y)?/) { 1742 if (/CONFIG_MODULES(=y)?/) {
1743 $install_mods = 1 if (defined($1)); 1743 if (defined($1)) {
1744 last; 1744 $install_mods = 1;
1745 last;
1746 }
1745 } 1747 }
1746 } 1748 }
1747 close(IN); 1749 close(IN);
diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile
index 43480149119..85baf11e2ac 100644
--- a/tools/testing/selftests/Makefile
+++ b/tools/testing/selftests/Makefile
@@ -1,4 +1,4 @@
1TARGETS = breakpoints kcmp mqueue vm cpu-hotplug memory-hotplug epoll 1TARGETS = breakpoints kcmp mqueue vm cpu-hotplug memory-hotplug
2 2
3all: 3all:
4 for TARGET in $(TARGETS); do \ 4 for TARGET in $(TARGETS); do \
diff --git a/tools/testing/selftests/epoll/Makefile b/tools/testing/selftests/epoll/Makefile
deleted file mode 100644
index 19806ed62f5..00000000000
--- a/tools/testing/selftests/epoll/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
1# Makefile for epoll selftests
2
3all: test_epoll
4%: %.c
5 gcc -pthread -g -o $@ $^
6
7run_tests: all
8 ./test_epoll
9
10clean:
11 $(RM) test_epoll
diff --git a/tools/testing/selftests/epoll/test_epoll.c b/tools/testing/selftests/epoll/test_epoll.c
deleted file mode 100644
index e0fcff1e833..00000000000
--- a/tools/testing/selftests/epoll/test_epoll.c
+++ /dev/null
@@ -1,344 +0,0 @@
1/*
2 * tools/testing/selftests/epoll/test_epoll.c
3 *
4 * Copyright 2012 Adobe Systems Incorporated
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * Paton J. Lewis <palewis@adobe.com>
12 *
13 */
14
15#include <errno.h>
16#include <fcntl.h>
17#include <pthread.h>
18#include <stdio.h>
19#include <stdlib.h>
20#include <unistd.h>
21#include <sys/epoll.h>
22#include <sys/socket.h>
23
24/*
25 * A pointer to an epoll_item_private structure will be stored in the epoll
26 * item's event structure so that we can get access to the epoll_item_private
27 * data after calling epoll_wait:
28 */
29struct epoll_item_private {
30 int index; /* Position of this struct within the epoll_items array. */
31 int fd;
32 uint32_t events;
33 pthread_mutex_t mutex; /* Guards the following variables... */
34 int stop;
35 int status; /* Stores any error encountered while handling item. */
36 /* The following variable allows us to test whether we have encountered
37 a problem while attempting to cancel and delete the associated
38 event. When the test program exits, 'deleted' should be exactly
39 one. If it is greater than one, then the failed test reflects a real
40 world situation where we would have tried to access the epoll item's
41 private data after deleting it: */
42 int deleted;
43};
44
45struct epoll_item_private *epoll_items;
46
47/*
48 * Delete the specified item from the epoll set. In a real-world secneario this
49 * is where we would free the associated data structure, but in this testing
50 * environment we retain the structure so that we can test for double-deletion:
51 */
52void delete_item(int index)
53{
54 __sync_fetch_and_add(&epoll_items[index].deleted, 1);
55}
56
57/*
58 * A pointer to a read_thread_data structure will be passed as the argument to
59 * each read thread:
60 */
61struct read_thread_data {
62 int stop;
63 int status; /* Indicates any error encountered by the read thread. */
64 int epoll_set;
65};
66
67/*
68 * The function executed by the read threads:
69 */
70void *read_thread_function(void *function_data)
71{
72 struct read_thread_data *thread_data =
73 (struct read_thread_data *)function_data;
74 struct epoll_event event_data;
75 struct epoll_item_private *item_data;
76 char socket_data;
77
78 /* Handle events until we encounter an error or this thread's 'stop'
79 condition is set: */
80 while (1) {
81 int result = epoll_wait(thread_data->epoll_set,
82 &event_data,
83 1, /* Number of desired events */
84 1000); /* Timeout in ms */
85 if (result < 0) {
86 /* Breakpoints signal all threads. Ignore that while
87 debugging: */
88 if (errno == EINTR)
89 continue;
90 thread_data->status = errno;
91 return 0;
92 } else if (thread_data->stop)
93 return 0;
94 else if (result == 0) /* Timeout */
95 continue;
96
97 /* We need the mutex here because checking for the stop
98 condition and re-enabling the epoll item need to be done
99 together as one atomic operation when EPOLL_CTL_DISABLE is
100 available: */
101 item_data = (struct epoll_item_private *)event_data.data.ptr;
102 pthread_mutex_lock(&item_data->mutex);
103
104 /* Remove the item from the epoll set if we want to stop
105 handling that event: */
106 if (item_data->stop)
107 delete_item(item_data->index);
108 else {
109 /* Clear the data that was written to the other end of
110 our non-blocking socket: */
111 do {
112 if (read(item_data->fd, &socket_data, 1) < 1) {
113 if ((errno == EAGAIN) ||
114 (errno == EWOULDBLOCK))
115 break;
116 else
117 goto error_unlock;
118 }
119 } while (item_data->events & EPOLLET);
120
121 /* The item was one-shot, so re-enable it: */
122 event_data.events = item_data->events;
123 if (epoll_ctl(thread_data->epoll_set,
124 EPOLL_CTL_MOD,
125 item_data->fd,
126 &event_data) < 0)
127 goto error_unlock;
128 }
129
130 pthread_mutex_unlock(&item_data->mutex);
131 }
132
133error_unlock:
134 thread_data->status = item_data->status = errno;
135 pthread_mutex_unlock(&item_data->mutex);
136 return 0;
137}
138
139/*
140 * A pointer to a write_thread_data structure will be passed as the argument to
141 * the write thread:
142 */
143struct write_thread_data {
144 int stop;
145 int status; /* Indicates any error encountered by the write thread. */
146 int n_fds;
147 int *fds;
148};
149
150/*
151 * The function executed by the write thread. It writes a single byte to each
152 * socket in turn until the stop condition for this thread is set. If writing to
153 * a socket would block (i.e. errno was EAGAIN), we leave that socket alone for
154 * the moment and just move on to the next socket in the list. We don't care
155 * about the order in which we deliver events to the epoll set. In fact we don't
156 * care about the data we're writing to the pipes at all; we just want to
157 * trigger epoll events:
158 */
159void *write_thread_function(void *function_data)
160{
161 const char data = 'X';
162 int index;
163 struct write_thread_data *thread_data =
164 (struct write_thread_data *)function_data;
165 while (!write_thread_data->stop)
166 for (index = 0;
167 !thread_data->stop && (index < thread_data->n_fds);
168 ++index)
169 if ((write(thread_data->fds[index], &data, 1) < 1) &&
170 (errno != EAGAIN) &&
171 (errno != EWOULDBLOCK)) {
172 write_thread_data->status = errno;
173 return;
174 }
175}
176
177/*
178 * Arguments are currently ignored:
179 */
180int main(int argc, char **argv)
181{
182 const int n_read_threads = 100;
183 const int n_epoll_items = 500;
184 int index;
185 int epoll_set = epoll_create1(0);
186 struct write_thread_data write_thread_data = {
187 0, 0, n_epoll_items, malloc(n_epoll_items * sizeof(int))
188 };
189 struct read_thread_data *read_thread_data =
190 malloc(n_read_threads * sizeof(struct read_thread_data));
191 pthread_t *read_threads = malloc(n_read_threads * sizeof(pthread_t));
192 pthread_t write_thread;
193
194 printf("-----------------\n");
195 printf("Runing test_epoll\n");
196 printf("-----------------\n");
197
198 epoll_items = malloc(n_epoll_items * sizeof(struct epoll_item_private));
199
200 if (epoll_set < 0 || epoll_items == 0 || write_thread_data.fds == 0 ||
201 read_thread_data == 0 || read_threads == 0)
202 goto error;
203
204 if (sysconf(_SC_NPROCESSORS_ONLN) < 2) {
205 printf("Error: please run this test on a multi-core system.\n");
206 goto error;
207 }
208
209 /* Create the socket pairs and epoll items: */
210 for (index = 0; index < n_epoll_items; ++index) {
211 int socket_pair[2];
212 struct epoll_event event_data;
213 if (socketpair(AF_UNIX,
214 SOCK_STREAM | SOCK_NONBLOCK,
215 0,
216 socket_pair) < 0)
217 goto error;
218 write_thread_data.fds[index] = socket_pair[0];
219 epoll_items[index].index = index;
220 epoll_items[index].fd = socket_pair[1];
221 if (pthread_mutex_init(&epoll_items[index].mutex, NULL) != 0)
222 goto error;
223 /* We always use EPOLLONESHOT because this test is currently
224 structured to demonstrate the need for EPOLL_CTL_DISABLE,
225 which only produces useful information in the EPOLLONESHOT
226 case (without EPOLLONESHOT, calling epoll_ctl with
227 EPOLL_CTL_DISABLE will never return EBUSY). If support for
228 testing events without EPOLLONESHOT is desired, it should
229 probably be implemented in a separate unit test. */
230 epoll_items[index].events = EPOLLIN | EPOLLONESHOT;
231 if (index < n_epoll_items / 2)
232 epoll_items[index].events |= EPOLLET;
233 epoll_items[index].stop = 0;
234 epoll_items[index].status = 0;
235 epoll_items[index].deleted = 0;
236 event_data.events = epoll_items[index].events;
237 event_data.data.ptr = &epoll_items[index];
238 if (epoll_ctl(epoll_set,
239 EPOLL_CTL_ADD,
240 epoll_items[index].fd,
241 &event_data) < 0)
242 goto error;
243 }
244
245 /* Create and start the read threads: */
246 for (index = 0; index < n_read_threads; ++index) {
247 read_thread_data[index].stop = 0;
248 read_thread_data[index].status = 0;
249 read_thread_data[index].epoll_set = epoll_set;
250 if (pthread_create(&read_threads[index],
251 NULL,
252 read_thread_function,
253 &read_thread_data[index]) != 0)
254 goto error;
255 }
256
257 if (pthread_create(&write_thread,
258 NULL,
259 write_thread_function,
260 &write_thread_data) != 0)
261 goto error;
262
263 /* Cancel all event pollers: */
264#ifdef EPOLL_CTL_DISABLE
265 for (index = 0; index < n_epoll_items; ++index) {
266 pthread_mutex_lock(&epoll_items[index].mutex);
267 ++epoll_items[index].stop;
268 if (epoll_ctl(epoll_set,
269 EPOLL_CTL_DISABLE,
270 epoll_items[index].fd,
271 NULL) == 0)
272 delete_item(index);
273 else if (errno != EBUSY) {
274 pthread_mutex_unlock(&epoll_items[index].mutex);
275 goto error;
276 }
277 /* EBUSY means events were being handled; allow the other thread
278 to delete the item. */
279 pthread_mutex_unlock(&epoll_items[index].mutex);
280 }
281#else
282 for (index = 0; index < n_epoll_items; ++index) {
283 pthread_mutex_lock(&epoll_items[index].mutex);
284 ++epoll_items[index].stop;
285 pthread_mutex_unlock(&epoll_items[index].mutex);
286 /* Wait in case a thread running read_thread_function is
287 currently executing code between epoll_wait and
288 pthread_mutex_lock with this item. Note that a longer delay
289 would make double-deletion less likely (at the expense of
290 performance), but there is no guarantee that any delay would
291 ever be sufficient. Note also that we delete all event
292 pollers at once for testing purposes, but in a real-world
293 environment we are likely to want to be able to cancel event
294 pollers at arbitrary times. Therefore we can't improve this
295 situation by just splitting this loop into two loops
296 (i.e. signal 'stop' for all items, sleep, and then delete all
297 items). We also can't fix the problem via EPOLL_CTL_DEL
298 because that command can't prevent the case where some other
299 thread is executing read_thread_function within the region
300 mentioned above: */
301 usleep(1);
302 pthread_mutex_lock(&epoll_items[index].mutex);
303 if (!epoll_items[index].deleted)
304 delete_item(index);
305 pthread_mutex_unlock(&epoll_items[index].mutex);
306 }
307#endif
308
309 /* Shut down the read threads: */
310 for (index = 0; index < n_read_threads; ++index)
311 __sync_fetch_and_add(&read_thread_data[index].stop, 1);
312 for (index = 0; index < n_read_threads; ++index) {
313 if (pthread_join(read_threads[index], NULL) != 0)
314 goto error;
315 if (read_thread_data[index].status)
316 goto error;
317 }
318
319 /* Shut down the write thread: */
320 __sync_fetch_and_add(&write_thread_data.stop, 1);
321 if ((pthread_join(write_thread, NULL) != 0) || write_thread_data.status)
322 goto error;
323
324 /* Check for final error conditions: */
325 for (index = 0; index < n_epoll_items; ++index) {
326 if (epoll_items[index].status != 0)
327 goto error;
328 if (pthread_mutex_destroy(&epoll_items[index].mutex) < 0)
329 goto error;
330 }
331 for (index = 0; index < n_epoll_items; ++index)
332 if (epoll_items[index].deleted != 1) {
333 printf("Error: item data deleted %1d times.\n",
334 epoll_items[index].deleted);
335 goto error;
336 }
337
338 printf("[PASS]\n");
339 return 0;
340
341 error:
342 printf("[FAIL]\n");
343 return errno;
344}
diff --git a/tools/vm/page-types.c b/tools/vm/page-types.c
index cd1b03e8089..b76edf2f833 100644
--- a/tools/vm/page-types.c
+++ b/tools/vm/page-types.c
@@ -35,7 +35,7 @@
35#include <sys/mount.h> 35#include <sys/mount.h>
36#include <sys/statfs.h> 36#include <sys/statfs.h>
37#include "../../include/uapi/linux/magic.h" 37#include "../../include/uapi/linux/magic.h"
38#include "../../include/linux/kernel-page-flags.h" 38#include "../../include/uapi/linux/kernel-page-flags.h"
39 39
40 40
41#ifndef MAX_PATH 41#ifndef MAX_PATH