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 --- |