builtin-trace.c (1e28fe0a4ff8680d5a0fb84995fd2444dac19cc4) builtin-trace.c (e281a9606d7073c517f2571e83faaff029ddc1cf)
1#include <traceevent/event-parse.h>
2#include "builtin.h"
3#include "util/color.h"
4#include "util/debug.h"
5#include "util/evlist.h"
6#include "util/machine.h"
7#include "util/session.h"
8#include "util/thread.h"

--- 1201 unchanged lines hidden (view full) ---

1210 bool live;
1211 bool full_time;
1212 bool sched;
1213 bool multiple_threads;
1214 bool summary;
1215 bool summary_only;
1216 bool show_comm;
1217 bool show_tool_stats;
1#include <traceevent/event-parse.h>
2#include "builtin.h"
3#include "util/color.h"
4#include "util/debug.h"
5#include "util/evlist.h"
6#include "util/machine.h"
7#include "util/session.h"
8#include "util/thread.h"

--- 1201 unchanged lines hidden (view full) ---

1210 bool live;
1211 bool full_time;
1212 bool sched;
1213 bool multiple_threads;
1214 bool summary;
1215 bool summary_only;
1216 bool show_comm;
1217 bool show_tool_stats;
1218 bool trace_syscalls;
1218 int trace_pgfaults;
1219};
1220
1221static int trace__set_fd_pathname(struct thread *thread, int fd, const char *pathname)
1222{
1223 struct thread_trace *ttrace = thread->priv;
1224
1225 if (fd > ttrace->paths.max) {

--- 696 unchanged lines hidden (view full) ---

1922
1923 if (rec_argv == NULL)
1924 return -ENOMEM;
1925
1926 j = 0;
1927 for (i = 0; i < ARRAY_SIZE(record_args); i++)
1928 rec_argv[j++] = record_args[i];
1929
1219 int trace_pgfaults;
1220};
1221
1222static int trace__set_fd_pathname(struct thread *thread, int fd, const char *pathname)
1223{
1224 struct thread_trace *ttrace = thread->priv;
1225
1226 if (fd > ttrace->paths.max) {

--- 696 unchanged lines hidden (view full) ---

1923
1924 if (rec_argv == NULL)
1925 return -ENOMEM;
1926
1927 j = 0;
1928 for (i = 0; i < ARRAY_SIZE(record_args); i++)
1929 rec_argv[j++] = record_args[i];
1930
1930 for (i = 0; i < sc_args_nr; i++)
1931 rec_argv[j++] = sc_args[i];
1931 if (trace->trace_syscalls) {
1932 for (i = 0; i < sc_args_nr; i++)
1933 rec_argv[j++] = sc_args[i];
1932
1934
1933 /* event string may be different for older kernels - e.g., RHEL6 */
1934 if (is_valid_tracepoint("raw_syscalls:sys_enter"))
1935 rec_argv[j++] = "raw_syscalls:sys_enter,raw_syscalls:sys_exit";
1936 else if (is_valid_tracepoint("syscalls:sys_enter"))
1937 rec_argv[j++] = "syscalls:sys_enter,syscalls:sys_exit";
1938 else {
1939 pr_err("Neither raw_syscalls nor syscalls events exist.\n");
1940 return -1;
1935 /* event string may be different for older kernels - e.g., RHEL6 */
1936 if (is_valid_tracepoint("raw_syscalls:sys_enter"))
1937 rec_argv[j++] = "raw_syscalls:sys_enter,raw_syscalls:sys_exit";
1938 else if (is_valid_tracepoint("syscalls:sys_enter"))
1939 rec_argv[j++] = "syscalls:sys_enter,syscalls:sys_exit";
1940 else {
1941 pr_err("Neither raw_syscalls nor syscalls events exist.\n");
1942 return -1;
1943 }
1941 }
1942
1943 if (trace->trace_pgfaults & TRACE_PFMAJ)
1944 for (i = 0; i < majpf_args_nr; i++)
1945 rec_argv[j++] = majpf_args[i];
1946
1947 if (trace->trace_pgfaults & TRACE_PFMIN)
1948 for (i = 0; i < minpf_args_nr; i++)

--- 56 unchanged lines hidden (view full) ---

2005
2006 trace->live = true;
2007
2008 if (evlist == NULL) {
2009 fprintf(trace->output, "Not enough memory to run!\n");
2010 goto out;
2011 }
2012
1944 }
1945
1946 if (trace->trace_pgfaults & TRACE_PFMAJ)
1947 for (i = 0; i < majpf_args_nr; i++)
1948 rec_argv[j++] = majpf_args[i];
1949
1950 if (trace->trace_pgfaults & TRACE_PFMIN)
1951 for (i = 0; i < minpf_args_nr; i++)

--- 56 unchanged lines hidden (view full) ---

2008
2009 trace->live = true;
2010
2011 if (evlist == NULL) {
2012 fprintf(trace->output, "Not enough memory to run!\n");
2013 goto out;
2014 }
2015
2013 if (perf_evlist__add_syscall_newtp(evlist, trace__sys_enter, trace__sys_exit))
2016 if (trace->trace_syscalls &&
2017 perf_evlist__add_syscall_newtp(evlist, trace__sys_enter,
2018 trace__sys_exit))
2014 goto out_error_tp;
2015
2019 goto out_error_tp;
2020
2016 perf_evlist__add_vfs_getname(evlist);
2021 if (trace->trace_syscalls)
2022 perf_evlist__add_vfs_getname(evlist);
2017
2018 if ((trace->trace_pgfaults & TRACE_PFMAJ) &&
2019 perf_evlist__add_pgfault(evlist, PERF_COUNT_SW_PAGE_FAULTS_MAJ))
2020 goto out_error_tp;
2021
2022 if ((trace->trace_pgfaults & TRACE_PFMIN) &&
2023 perf_evlist__add_pgfault(evlist, PERF_COUNT_SW_PAGE_FAULTS_MIN))
2024 goto out_error_tp;

--- 185 unchanged lines hidden (view full) ---

2210 goto out;
2211
2212 evsel = perf_evlist__find_tracepoint_by_name(session->evlist,
2213 "raw_syscalls:sys_enter");
2214 /* older kernels have syscalls tp versus raw_syscalls */
2215 if (evsel == NULL)
2216 evsel = perf_evlist__find_tracepoint_by_name(session->evlist,
2217 "syscalls:sys_enter");
2023
2024 if ((trace->trace_pgfaults & TRACE_PFMAJ) &&
2025 perf_evlist__add_pgfault(evlist, PERF_COUNT_SW_PAGE_FAULTS_MAJ))
2026 goto out_error_tp;
2027
2028 if ((trace->trace_pgfaults & TRACE_PFMIN) &&
2029 perf_evlist__add_pgfault(evlist, PERF_COUNT_SW_PAGE_FAULTS_MIN))
2030 goto out_error_tp;

--- 185 unchanged lines hidden (view full) ---

2216 goto out;
2217
2218 evsel = perf_evlist__find_tracepoint_by_name(session->evlist,
2219 "raw_syscalls:sys_enter");
2220 /* older kernels have syscalls tp versus raw_syscalls */
2221 if (evsel == NULL)
2222 evsel = perf_evlist__find_tracepoint_by_name(session->evlist,
2223 "syscalls:sys_enter");
2218 if (evsel == NULL) {
2219 pr_err("Data file does not have raw_syscalls:sys_enter event\n");
2220 goto out;
2221 }
2222
2224
2223 if (perf_evsel__init_syscall_tp(evsel, trace__sys_enter) < 0 ||
2224 perf_evsel__init_sc_tp_ptr_field(evsel, args)) {
2225 if (evsel &&
2226 (perf_evsel__init_syscall_tp(evsel, trace__sys_enter) < 0 ||
2227 perf_evsel__init_sc_tp_ptr_field(evsel, args))) {
2225 pr_err("Error during initialize raw_syscalls:sys_enter event\n");
2226 goto out;
2227 }
2228
2229 evsel = perf_evlist__find_tracepoint_by_name(session->evlist,
2230 "raw_syscalls:sys_exit");
2231 if (evsel == NULL)
2232 evsel = perf_evlist__find_tracepoint_by_name(session->evlist,
2233 "syscalls:sys_exit");
2228 pr_err("Error during initialize raw_syscalls:sys_enter event\n");
2229 goto out;
2230 }
2231
2232 evsel = perf_evlist__find_tracepoint_by_name(session->evlist,
2233 "raw_syscalls:sys_exit");
2234 if (evsel == NULL)
2235 evsel = perf_evlist__find_tracepoint_by_name(session->evlist,
2236 "syscalls:sys_exit");
2234 if (evsel == NULL) {
2235 pr_err("Data file does not have raw_syscalls:sys_exit event\n");
2236 goto out;
2237 }
2238
2239 if (perf_evsel__init_syscall_tp(evsel, trace__sys_exit) < 0 ||
2240 perf_evsel__init_sc_tp_uint_field(evsel, ret)) {
2237 if (evsel &&
2238 (perf_evsel__init_syscall_tp(evsel, trace__sys_exit) < 0 ||
2239 perf_evsel__init_sc_tp_uint_field(evsel, ret))) {
2241 pr_err("Error during initialize raw_syscalls:sys_exit event\n");
2242 goto out;
2243 }
2244
2245 evlist__for_each(session->evlist, evsel) {
2246 if (evsel->attr.type == PERF_TYPE_SOFTWARE &&
2247 (evsel->attr.config == PERF_COUNT_SW_PAGE_FAULTS_MAJ ||
2248 evsel->attr.config == PERF_COUNT_SW_PAGE_FAULTS_MIN ||

--- 186 unchanged lines hidden (view full) ---

2435 },
2436 .user_freq = UINT_MAX,
2437 .user_interval = ULLONG_MAX,
2438 .no_buffering = true,
2439 .mmap_pages = 1024,
2440 },
2441 .output = stdout,
2442 .show_comm = true,
2240 pr_err("Error during initialize raw_syscalls:sys_exit event\n");
2241 goto out;
2242 }
2243
2244 evlist__for_each(session->evlist, evsel) {
2245 if (evsel->attr.type == PERF_TYPE_SOFTWARE &&
2246 (evsel->attr.config == PERF_COUNT_SW_PAGE_FAULTS_MAJ ||
2247 evsel->attr.config == PERF_COUNT_SW_PAGE_FAULTS_MIN ||

--- 186 unchanged lines hidden (view full) ---

2434 },
2435 .user_freq = UINT_MAX,
2436 .user_interval = ULLONG_MAX,
2437 .no_buffering = true,
2438 .mmap_pages = 1024,
2439 },
2440 .output = stdout,
2441 .show_comm = true,
2442 .trace_syscalls = true,
2443 };
2444 const char *output_name = NULL;
2445 const char *ev_qualifier_str = NULL;
2446 const struct option trace_options[] = {
2447 OPT_BOOLEAN(0, "comm", &trace.show_comm,
2448 "show the thread COMM next to its id"),
2449 OPT_BOOLEAN(0, "tool_stats", &trace.show_tool_stats, "show tool stats"),
2450 OPT_STRING('e', "expr", &ev_qualifier_str, "expr",

--- 23 unchanged lines hidden (view full) ---

2474 OPT_BOOLEAN('T', "time", &trace.full_time,
2475 "Show full timestamp, not time relative to first start"),
2476 OPT_BOOLEAN('s', "summary", &trace.summary_only,
2477 "Show only syscall summary with statistics"),
2478 OPT_BOOLEAN('S', "with-summary", &trace.summary,
2479 "Show all syscalls and summary with statistics"),
2480 OPT_CALLBACK_DEFAULT('F', "pf", &trace.trace_pgfaults, "all|maj|min",
2481 "Trace pagefaults", parse_pagefaults, "maj"),
2443 };
2444 const char *output_name = NULL;
2445 const char *ev_qualifier_str = NULL;
2446 const struct option trace_options[] = {
2447 OPT_BOOLEAN(0, "comm", &trace.show_comm,
2448 "show the thread COMM next to its id"),
2449 OPT_BOOLEAN(0, "tool_stats", &trace.show_tool_stats, "show tool stats"),
2450 OPT_STRING('e', "expr", &ev_qualifier_str, "expr",

--- 23 unchanged lines hidden (view full) ---

2474 OPT_BOOLEAN('T', "time", &trace.full_time,
2475 "Show full timestamp, not time relative to first start"),
2476 OPT_BOOLEAN('s', "summary", &trace.summary_only,
2477 "Show only syscall summary with statistics"),
2478 OPT_BOOLEAN('S', "with-summary", &trace.summary,
2479 "Show all syscalls and summary with statistics"),
2480 OPT_CALLBACK_DEFAULT('F', "pf", &trace.trace_pgfaults, "all|maj|min",
2481 "Trace pagefaults", parse_pagefaults, "maj"),
2482 OPT_BOOLEAN(0, "syscalls", &trace.trace_syscalls, "Trace syscalls"),
2482 OPT_END()
2483 };
2484 int err;
2485 char bf[BUFSIZ];
2486
2487 argc = parse_options(argc, argv, trace_options, trace_usage,
2488 PARSE_OPT_STOP_AT_NON_OPTION);
2489

--- 4 unchanged lines hidden (view full) ---

2494
2495 if ((argc >= 1) && (strcmp(argv[0], "record") == 0))
2496 return trace__record(&trace, argc-1, &argv[1]);
2497
2498 /* summary_only implies summary option, but don't overwrite summary if set */
2499 if (trace.summary_only)
2500 trace.summary = trace.summary_only;
2501
2483 OPT_END()
2484 };
2485 int err;
2486 char bf[BUFSIZ];
2487
2488 argc = parse_options(argc, argv, trace_options, trace_usage,
2489 PARSE_OPT_STOP_AT_NON_OPTION);
2490

--- 4 unchanged lines hidden (view full) ---

2495
2496 if ((argc >= 1) && (strcmp(argv[0], "record") == 0))
2497 return trace__record(&trace, argc-1, &argv[1]);
2498
2499 /* summary_only implies summary option, but don't overwrite summary if set */
2500 if (trace.summary_only)
2501 trace.summary = trace.summary_only;
2502
2503 if (!trace.trace_syscalls && !trace.trace_pgfaults) {
2504 pr_err("Please specify something to trace.\n");
2505 return -1;
2506 }
2507
2502 if (output_name != NULL) {
2503 err = trace__open_output(&trace, output_name);
2504 if (err < 0) {
2505 perror("failed to create output file");
2506 goto out;
2507 }
2508 }
2509

--- 43 unchanged lines hidden ---
2508 if (output_name != NULL) {
2509 err = trace__open_output(&trace, output_name);
2510 if (err < 0) {
2511 perror("failed to create output file");
2512 goto out;
2513 }
2514 }
2515

--- 43 unchanged lines hidden ---