diff --git a/misc/tools/acrntrace/Makefile b/misc/tools/acrntrace/Makefile index 22ff4f901..c44532e31 100644 --- a/misc/tools/acrntrace/Makefile +++ b/misc/tools/acrntrace/Makefile @@ -11,6 +11,7 @@ TRACE_CFLAGS += -Werror TRACE_CFLAGS += -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 TRACE_CFLAGS += -Wformat -Wformat-security -fno-strict-aliasing TRACE_CFLAGS += -fpie -fpic +TRACE_CFLAGS += -lnuma TRACE_CFLAGS += $(CFLAGS) GCC_MAJOR=$(shell echo __GNUC__ | $(CC) -E -x c - | tail -n 1) diff --git a/misc/tools/acrntrace/README.rst b/misc/tools/acrntrace/README.rst index b56e7c2b9..786427f8f 100644 --- a/misc/tools/acrntrace/README.rst +++ b/misc/tools/acrntrace/README.rst @@ -24,6 +24,7 @@ Options: -i period specify polling interval in milliseconds [1-999] -t max_time max time to capture trace data (in second) -c clear the buffered old data +-a cpu-set only capture the trace data on these configured cpu-set acrntrace_format.py =================== diff --git a/misc/tools/acrntrace/acrntrace.c b/misc/tools/acrntrace/acrntrace.c index 03078a44b..2cbdef985 100644 --- a/misc/tools/acrntrace/acrntrace.c +++ b/misc/tools/acrntrace/acrntrace.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "acrntrace.h" @@ -29,7 +30,7 @@ static int exiting = 0; /* for opt */ static uint64_t period = 10000; -static const char optString[] = "i:hct:"; +static const char optString[] = "i:hct:a:"; static const char dev_prefix[] = "acrn_trace_"; static uint32_t flags; @@ -38,6 +39,8 @@ static char trace_file_dir[TRACE_FILE_DIR_LEN]; static reader_struct *reader; static int dev_cnt = 0; /* Count of /dev/acrn_trace_xxx devices */ +static struct bitmask *cpu_bitmask = NULL; + static void display_usage(void) { printf("acrntrace - tool to collect ACRN trace data\n" @@ -46,7 +49,8 @@ static void display_usage(void) "\t-h: print this message\n" "\t-i: period_in_ms: specify polling interval [1-999]\n" "\t-t: max time to capture trace data (in second)\n" - "\t-c: clear the buffered old data\n"); + "\t-c: clear the buffered old data\n" + "\t-a: cpu-set: only capture the trace data on these configured cpu-set\n"); } static void timer_handler(union sigval sv) @@ -116,6 +120,9 @@ static int parse_opt(int argc, char *argv[]) case 'c': flags |= FLAG_CLEAR_BUF; break; + case 'a': + cpu_bitmask = numa_parse_cpustring_all(optarg); + break; case 'h': display_usage(); return -EINVAL; @@ -316,8 +323,10 @@ static void handle_on_exit(void) pr_info("exiting - to release resources...\n"); - foreach_dev(dev_id) - destory_reader(&reader[dev_id]); + foreach_dev(dev_id) { + if (numa_bitmask_isbitset(cpu_bitmask, dev_id)) + destory_reader(&reader[dev_id]); + } } static void signal_exit_handler(int sig) @@ -341,6 +350,14 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } + /* if we don't set the -a option or set it by mistake, capture the trace on all possible dev */ + if (!cpu_bitmask) { + /* numa_bitmask_alloc will cause the process exiting on failure */ + cpu_bitmask = numa_bitmask_alloc(dev_cnt); + foreach_dev(dev_id) + numa_bitmask_setbit(cpu_bitmask, dev_id); + } + reader = calloc(1, sizeof(reader_struct) * dev_cnt); if (!reader) { pr_err("Failed to allocate reader memory\n"); @@ -366,9 +383,11 @@ int main(int argc, char *argv[]) /* acquair res for each trace dev */ flags |= FLAG_TO_REL; - foreach_dev(dev_id) - if (create_reader(&reader[dev_id], dev_id) < 0) - goto out_free; + foreach_dev(dev_id) { + if (numa_bitmask_isbitset(cpu_bitmask, dev_id)) + if (create_reader(&reader[dev_id], dev_id) < 0) + goto out_free; + } /* for kill exit handling */ signal(SIGTERM, signal_exit_handler); @@ -380,8 +399,10 @@ int main(int argc, char *argv[]) printf("q to quit:\n"); out_free: - foreach_dev(dev_id) - destory_reader(&reader[dev_id]); + foreach_dev(dev_id) { + if (numa_bitmask_isbitset(cpu_bitmask, dev_id)) + destory_reader(&reader[dev_id]); + } free(reader); flags &= ~FLAG_TO_REL;