|
@@ -572,6 +572,8 @@ void perf_evsel__config_callchain(struct perf_evsel *evsel,
|
|
|
|
|
|
perf_evsel__set_sample_bit(evsel, CALLCHAIN);
|
|
perf_evsel__set_sample_bit(evsel, CALLCHAIN);
|
|
|
|
|
|
|
|
+ attr->sample_max_stack = param->max_stack;
|
|
|
|
+
|
|
if (param->record_mode == CALLCHAIN_LBR) {
|
|
if (param->record_mode == CALLCHAIN_LBR) {
|
|
if (!opts->branch_stack) {
|
|
if (!opts->branch_stack) {
|
|
if (attr->exclude_user) {
|
|
if (attr->exclude_user) {
|
|
@@ -635,7 +637,8 @@ static void apply_config_terms(struct perf_evsel *evsel,
|
|
struct perf_event_attr *attr = &evsel->attr;
|
|
struct perf_event_attr *attr = &evsel->attr;
|
|
struct callchain_param param;
|
|
struct callchain_param param;
|
|
u32 dump_size = 0;
|
|
u32 dump_size = 0;
|
|
- char *callgraph_buf = NULL;
|
|
|
|
|
|
+ int max_stack = 0;
|
|
|
|
+ const char *callgraph_buf = NULL;
|
|
|
|
|
|
/* callgraph default */
|
|
/* callgraph default */
|
|
param.record_mode = callchain_param.record_mode;
|
|
param.record_mode = callchain_param.record_mode;
|
|
@@ -662,6 +665,9 @@ static void apply_config_terms(struct perf_evsel *evsel,
|
|
case PERF_EVSEL__CONFIG_TERM_STACK_USER:
|
|
case PERF_EVSEL__CONFIG_TERM_STACK_USER:
|
|
dump_size = term->val.stack_user;
|
|
dump_size = term->val.stack_user;
|
|
break;
|
|
break;
|
|
|
|
+ case PERF_EVSEL__CONFIG_TERM_MAX_STACK:
|
|
|
|
+ max_stack = term->val.max_stack;
|
|
|
|
+ break;
|
|
case PERF_EVSEL__CONFIG_TERM_INHERIT:
|
|
case PERF_EVSEL__CONFIG_TERM_INHERIT:
|
|
/*
|
|
/*
|
|
* attr->inherit should has already been set by
|
|
* attr->inherit should has already been set by
|
|
@@ -677,7 +683,12 @@ static void apply_config_terms(struct perf_evsel *evsel,
|
|
}
|
|
}
|
|
|
|
|
|
/* User explicitly set per-event callgraph, clear the old setting and reset. */
|
|
/* User explicitly set per-event callgraph, clear the old setting and reset. */
|
|
- if ((callgraph_buf != NULL) || (dump_size > 0)) {
|
|
|
|
|
|
+ if ((callgraph_buf != NULL) || (dump_size > 0) || max_stack) {
|
|
|
|
+ if (max_stack) {
|
|
|
|
+ param.max_stack = max_stack;
|
|
|
|
+ if (callgraph_buf == NULL)
|
|
|
|
+ callgraph_buf = "fp";
|
|
|
|
+ }
|
|
|
|
|
|
/* parse callgraph parameters */
|
|
/* parse callgraph parameters */
|
|
if (callgraph_buf != NULL) {
|
|
if (callgraph_buf != NULL) {
|
|
@@ -1329,6 +1340,7 @@ int perf_event_attr__fprintf(FILE *fp, struct perf_event_attr *attr,
|
|
PRINT_ATTRf(clockid, p_signed);
|
|
PRINT_ATTRf(clockid, p_signed);
|
|
PRINT_ATTRf(sample_regs_intr, p_hex);
|
|
PRINT_ATTRf(sample_regs_intr, p_hex);
|
|
PRINT_ATTRf(aux_watermark, p_unsigned);
|
|
PRINT_ATTRf(aux_watermark, p_unsigned);
|
|
|
|
+ PRINT_ATTRf(sample_max_stack, p_unsigned);
|
|
|
|
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|