Commit 87419c9a authored by David Ahern's avatar David Ahern Committed by Arnaldo Carvalho de Melo

perf kvm: Disable live command if timerfd is not supported

If the OS does not have timerfd support (e.g., older OS'es like RHEL5)
disable perf kvm stat live.
Signed-off-by: default avatarDavid Ahern <dsahern@gmail.com>
Reviewed-by: default avatarJiri Olsa <jolsa@redhat.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1383064996-20933-2-git-send-email-dsahern@gmail.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 41a4e6e2
...@@ -20,7 +20,9 @@ ...@@ -20,7 +20,9 @@
#include "util/data.h" #include "util/data.h"
#include <sys/prctl.h> #include <sys/prctl.h>
#ifdef HAVE_TIMERFD_SUPPORT
#include <sys/timerfd.h> #include <sys/timerfd.h>
#endif
#include <termios.h> #include <termios.h>
#include <semaphore.h> #include <semaphore.h>
...@@ -337,6 +339,7 @@ static void init_kvm_event_record(struct perf_kvm_stat *kvm) ...@@ -337,6 +339,7 @@ static void init_kvm_event_record(struct perf_kvm_stat *kvm)
INIT_LIST_HEAD(&kvm->kvm_events_cache[i]); INIT_LIST_HEAD(&kvm->kvm_events_cache[i]);
} }
#ifdef HAVE_TIMERFD_SUPPORT
static void clear_events_cache_stats(struct list_head *kvm_events_cache) static void clear_events_cache_stats(struct list_head *kvm_events_cache)
{ {
struct list_head *head; struct list_head *head;
...@@ -358,6 +361,7 @@ static void clear_events_cache_stats(struct list_head *kvm_events_cache) ...@@ -358,6 +361,7 @@ static void clear_events_cache_stats(struct list_head *kvm_events_cache)
} }
} }
} }
#endif
static int kvm_events_hash_fn(u64 key) static int kvm_events_hash_fn(u64 key)
{ {
...@@ -783,6 +787,7 @@ static void print_result(struct perf_kvm_stat *kvm) ...@@ -783,6 +787,7 @@ static void print_result(struct perf_kvm_stat *kvm)
pr_info("\nLost events: %" PRIu64 "\n\n", kvm->lost_events); pr_info("\nLost events: %" PRIu64 "\n\n", kvm->lost_events);
} }
#ifdef HAVE_TIMERFD_SUPPORT
static int process_lost_event(struct perf_tool *tool, static int process_lost_event(struct perf_tool *tool,
union perf_event *event __maybe_unused, union perf_event *event __maybe_unused,
struct perf_sample *sample __maybe_unused, struct perf_sample *sample __maybe_unused,
...@@ -793,6 +798,7 @@ static int process_lost_event(struct perf_tool *tool, ...@@ -793,6 +798,7 @@ static int process_lost_event(struct perf_tool *tool,
kvm->lost_events++; kvm->lost_events++;
return 0; return 0;
} }
#endif
static bool skip_sample(struct perf_kvm_stat *kvm, static bool skip_sample(struct perf_kvm_stat *kvm,
struct perf_sample *sample) struct perf_sample *sample)
...@@ -872,6 +878,7 @@ static bool verify_vcpu(int vcpu) ...@@ -872,6 +878,7 @@ static bool verify_vcpu(int vcpu)
return true; return true;
} }
#ifdef HAVE_TIMERFD_SUPPORT
/* keeping the max events to a modest level to keep /* keeping the max events to a modest level to keep
* the processing of samples per mmap smooth. * the processing of samples per mmap smooth.
*/ */
...@@ -1213,6 +1220,7 @@ static int kvm_live_open_events(struct perf_kvm_stat *kvm) ...@@ -1213,6 +1220,7 @@ static int kvm_live_open_events(struct perf_kvm_stat *kvm)
out: out:
return rc; return rc;
} }
#endif
static int read_events(struct perf_kvm_stat *kvm) static int read_events(struct perf_kvm_stat *kvm)
{ {
...@@ -1379,6 +1387,7 @@ kvm_events_report(struct perf_kvm_stat *kvm, int argc, const char **argv) ...@@ -1379,6 +1387,7 @@ kvm_events_report(struct perf_kvm_stat *kvm, int argc, const char **argv)
return kvm_events_report_vcpu(kvm); return kvm_events_report_vcpu(kvm);
} }
#ifdef HAVE_TIMERFD_SUPPORT
static struct perf_evlist *kvm_live_event_list(void) static struct perf_evlist *kvm_live_event_list(void)
{ {
struct perf_evlist *evlist; struct perf_evlist *evlist;
...@@ -1566,6 +1575,7 @@ static int kvm_events_live(struct perf_kvm_stat *kvm, ...@@ -1566,6 +1575,7 @@ static int kvm_events_live(struct perf_kvm_stat *kvm,
return err; return err;
} }
#endif
static void print_kvm_stat_usage(void) static void print_kvm_stat_usage(void)
{ {
...@@ -1604,8 +1614,10 @@ static int kvm_cmd_stat(const char *file_name, int argc, const char **argv) ...@@ -1604,8 +1614,10 @@ static int kvm_cmd_stat(const char *file_name, int argc, const char **argv)
if (!strncmp(argv[1], "rep", 3)) if (!strncmp(argv[1], "rep", 3))
return kvm_events_report(&kvm, argc - 1 , argv + 1); return kvm_events_report(&kvm, argc - 1 , argv + 1);
#ifdef HAVE_TIMERFD_SUPPORT
if (!strncmp(argv[1], "live", 4)) if (!strncmp(argv[1], "live", 4))
return kvm_events_live(&kvm, argc - 1 , argv + 1); return kvm_events_live(&kvm, argc - 1 , argv + 1);
#endif
perf_stat: perf_stat:
return cmd_stat(argc, argv, NULL); return cmd_stat(argc, argv, NULL);
......
...@@ -397,6 +397,13 @@ else ...@@ -397,6 +397,13 @@ else
endif endif
endif endif
$(call feature_check,timerfd)
ifeq ($(feature-timerfd), 1)
CFLAGS += -DHAVE_TIMERFD_SUPPORT
else
msg := $(warning No timerfd support. Disables 'perf kvm stat live');
endif
disable-python = $(eval $(disable-python_code)) disable-python = $(eval $(disable-python_code))
define disable-python_code define disable-python_code
CFLAGS += -DNO_LIBPYTHON CFLAGS += -DNO_LIBPYTHON
......
...@@ -25,7 +25,8 @@ FILES= \ ...@@ -25,7 +25,8 @@ FILES= \
test-libunwind \ test-libunwind \
test-on-exit \ test-on-exit \
test-stackprotector-all \ test-stackprotector-all \
test-stackprotector test-stackprotector \
test-timerfd
CC := $(CC) -MD CC := $(CC) -MD
...@@ -136,6 +137,9 @@ test-on-exit: ...@@ -136,6 +137,9 @@ test-on-exit:
test-backtrace: test-backtrace:
$(BUILD) $(BUILD)
test-timerfd:
$(BUILD)
-include *.d -include *.d
############################### ###############################
......
...@@ -81,6 +81,10 @@ ...@@ -81,6 +81,10 @@
# include "test-libnuma.c" # include "test-libnuma.c"
#undef main #undef main
#define main main_test_timerfd
# include "test-timerfd.c"
#undef main
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
main_test_libpython(); main_test_libpython();
...@@ -101,6 +105,7 @@ int main(int argc, char *argv[]) ...@@ -101,6 +105,7 @@ int main(int argc, char *argv[])
main_test_on_exit(); main_test_on_exit();
main_test_backtrace(); main_test_backtrace();
main_test_libnuma(); main_test_libnuma();
main_test_timerfd();
return 0; return 0;
} }
/*
* test for timerfd functions used by perf-kvm-stat-live
*/
#include <sys/timerfd.h>
int main(void)
{
struct itimerspec new_value;
int fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK);
if (fd < 0)
return 1;
if (timerfd_settime(fd, 0, &new_value, NULL) != 0)
return 1;
return 0;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment