perf parse-events: Separate ENOMEM memory handling
Add PE_ABORT that will YYNOMEM or YYABORT accordingly. Signed-off-by: Ian Rogers <irogers@google.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: bpf@vger.kernel.org Link: https://lore.kernel.org/r/20230627181030.95608-10-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
77cdd787fc
commit
b52cb995f1
@ -28,6 +28,13 @@ do { \
|
||||
YYABORT; \
|
||||
} while (0)
|
||||
|
||||
#define PE_ABORT(val) \
|
||||
do { \
|
||||
if (val == -ENOMEM) \
|
||||
YYNOMEM; \
|
||||
YYABORT; \
|
||||
} while (0)
|
||||
|
||||
static struct list_head* alloc_list(void)
|
||||
{
|
||||
struct list_head *list;
|
||||
@ -371,7 +378,7 @@ PE_NAME sep_dc
|
||||
err = parse_events_multi_pmu_add(_parse_state, $1, NULL, &list);
|
||||
free($1);
|
||||
if (err < 0)
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
$$ = list;
|
||||
}
|
||||
|
||||
@ -396,7 +403,7 @@ value_sym '/' event_config '/'
|
||||
parse_events_terms__delete($3);
|
||||
if (err) {
|
||||
free_list_evsel(list);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
$$ = list;
|
||||
}
|
||||
@ -407,23 +414,28 @@ value_sym sep_slash_slash_dc
|
||||
int type = $1 >> 16;
|
||||
int config = $1 & 255;
|
||||
bool wildcard = (type == PERF_TYPE_HARDWARE || type == PERF_TYPE_HW_CACHE);
|
||||
int err;
|
||||
|
||||
list = alloc_list();
|
||||
if (!list)
|
||||
YYNOMEM;
|
||||
ABORT_ON(parse_events_add_numeric(_parse_state, list, type, config,
|
||||
/*head_config=*/NULL, wildcard));
|
||||
err = parse_events_add_numeric(_parse_state, list, type, config, /*head_config=*/NULL, wildcard);
|
||||
if (err)
|
||||
PE_ABORT(err);
|
||||
$$ = list;
|
||||
}
|
||||
|
|
||||
PE_VALUE_SYM_TOOL sep_slash_slash_dc
|
||||
{
|
||||
struct list_head *list;
|
||||
int err;
|
||||
|
||||
list = alloc_list();
|
||||
if (!list)
|
||||
YYNOMEM;
|
||||
ABORT_ON(parse_events_add_tool(_parse_state, list, $1));
|
||||
err = parse_events_add_tool(_parse_state, list, $1);
|
||||
if (err)
|
||||
YYNOMEM;
|
||||
$$ = list;
|
||||
}
|
||||
|
||||
@ -444,7 +456,7 @@ PE_LEGACY_CACHE opt_event_config
|
||||
free($1);
|
||||
if (err) {
|
||||
free_list_evsel(list);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
$$ = list;
|
||||
}
|
||||
@ -465,7 +477,7 @@ PE_PREFIX_MEM PE_VALUE PE_BP_SLASH PE_VALUE PE_BP_COLON PE_MODIFIER_BP opt_event
|
||||
free($6);
|
||||
if (err) {
|
||||
free(list);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
$$ = list;
|
||||
}
|
||||
@ -484,7 +496,7 @@ PE_PREFIX_MEM PE_VALUE PE_BP_SLASH PE_VALUE opt_event_config
|
||||
parse_events_terms__delete($5);
|
||||
if (err) {
|
||||
free(list);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
$$ = list;
|
||||
}
|
||||
@ -504,7 +516,7 @@ PE_PREFIX_MEM PE_VALUE PE_BP_COLON PE_MODIFIER_BP opt_event_config
|
||||
free($4);
|
||||
if (err) {
|
||||
free(list);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
$$ = list;
|
||||
}
|
||||
@ -522,7 +534,7 @@ PE_PREFIX_MEM PE_VALUE opt_event_config
|
||||
parse_events_terms__delete($3);
|
||||
if (err) {
|
||||
free(list);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
$$ = list;
|
||||
}
|
||||
@ -549,7 +561,7 @@ tracepoint_name opt_event_config
|
||||
free($1.event);
|
||||
if (err) {
|
||||
free(list);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
$$ = list;
|
||||
}
|
||||
@ -576,7 +588,7 @@ PE_VALUE ':' PE_VALUE opt_event_config
|
||||
parse_events_terms__delete($4);
|
||||
if (err) {
|
||||
free(list);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
$$ = list;
|
||||
}
|
||||
@ -600,7 +612,7 @@ PE_RAW opt_event_config
|
||||
parse_events_terms__delete($2);
|
||||
if (err) {
|
||||
free(list);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
$$ = list;
|
||||
}
|
||||
@ -620,7 +632,7 @@ PE_BPF_OBJECT opt_event_config
|
||||
free($1);
|
||||
if (err) {
|
||||
free(list);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
$$ = list;
|
||||
}
|
||||
@ -637,7 +649,7 @@ PE_BPF_SOURCE opt_event_config
|
||||
parse_events_terms__delete($2);
|
||||
if (err) {
|
||||
free(list);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
$$ = list;
|
||||
}
|
||||
@ -712,11 +724,12 @@ event_term:
|
||||
PE_RAW
|
||||
{
|
||||
struct parse_events_term *term;
|
||||
int err = parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_RAW,
|
||||
strdup("raw"), $1, &@1, &@1);
|
||||
|
||||
if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_RAW,
|
||||
strdup("raw"), $1, &@1, &@1)) {
|
||||
if (err) {
|
||||
free($1);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
$$ = term;
|
||||
}
|
||||
@ -724,12 +737,12 @@ PE_RAW
|
||||
name_or_raw '=' name_or_legacy
|
||||
{
|
||||
struct parse_events_term *term;
|
||||
int err = parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER, $1, $3, &@1, &@3);
|
||||
|
||||
if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
||||
$1, $3, &@1, &@3)) {
|
||||
if (err) {
|
||||
free($1);
|
||||
free($3);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
$$ = term;
|
||||
}
|
||||
@ -737,11 +750,12 @@ name_or_raw '=' name_or_legacy
|
||||
name_or_raw '=' PE_VALUE
|
||||
{
|
||||
struct parse_events_term *term;
|
||||
int err = parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
||||
$1, $3, false, &@1, &@3);
|
||||
|
||||
if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
||||
$1, $3, false, &@1, &@3)) {
|
||||
if (err) {
|
||||
free($1);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
$$ = term;
|
||||
}
|
||||
@ -749,12 +763,13 @@ name_or_raw '=' PE_VALUE
|
||||
name_or_raw '=' PE_TERM_HW
|
||||
{
|
||||
struct parse_events_term *term;
|
||||
int err = parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
||||
$1, $3.str, &@1, &@3);
|
||||
|
||||
if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
||||
$1, $3.str, &@1, &@3)) {
|
||||
if (err) {
|
||||
free($1);
|
||||
free($3.str);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
$$ = term;
|
||||
}
|
||||
@ -762,11 +777,12 @@ name_or_raw '=' PE_TERM_HW
|
||||
PE_LEGACY_CACHE
|
||||
{
|
||||
struct parse_events_term *term;
|
||||
int err = parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE,
|
||||
$1, 1, true, &@1, NULL);
|
||||
|
||||
if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE,
|
||||
$1, 1, true, &@1, NULL)) {
|
||||
if (err) {
|
||||
free($1);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
$$ = term;
|
||||
}
|
||||
@ -774,11 +790,12 @@ PE_LEGACY_CACHE
|
||||
PE_NAME
|
||||
{
|
||||
struct parse_events_term *term;
|
||||
int err = parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
||||
$1, 1, true, &@1, NULL);
|
||||
|
||||
if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
||||
$1, 1, true, &@1, NULL)) {
|
||||
if (err) {
|
||||
free($1);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
$$ = term;
|
||||
}
|
||||
@ -786,11 +803,12 @@ PE_NAME
|
||||
PE_TERM_HW
|
||||
{
|
||||
struct parse_events_term *term;
|
||||
int err = parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_HARDWARE,
|
||||
$1.str, $1.num & 255, false, &@1, NULL);
|
||||
|
||||
if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_HARDWARE,
|
||||
$1.str, $1.num & 255, false, &@1, NULL)) {
|
||||
if (err) {
|
||||
free($1.str);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
$$ = term;
|
||||
}
|
||||
@ -798,10 +816,11 @@ PE_TERM_HW
|
||||
PE_TERM '=' name_or_legacy
|
||||
{
|
||||
struct parse_events_term *term;
|
||||
int err = parse_events_term__str(&term, (int)$1, NULL, $3, &@1, &@3);
|
||||
|
||||
if (parse_events_term__str(&term, (int)$1, NULL, $3, &@1, &@3)) {
|
||||
if (err) {
|
||||
free($3);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
$$ = term;
|
||||
}
|
||||
@ -809,10 +828,11 @@ PE_TERM '=' name_or_legacy
|
||||
PE_TERM '=' PE_TERM_HW
|
||||
{
|
||||
struct parse_events_term *term;
|
||||
int err = parse_events_term__str(&term, (int)$1, NULL, $3.str, &@1, &@3);
|
||||
|
||||
if (parse_events_term__str(&term, (int)$1, NULL, $3.str, &@1, &@3)) {
|
||||
if (err) {
|
||||
free($3.str);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
$$ = term;
|
||||
}
|
||||
@ -820,37 +840,46 @@ PE_TERM '=' PE_TERM_HW
|
||||
PE_TERM '=' PE_TERM
|
||||
{
|
||||
struct parse_events_term *term;
|
||||
int err = parse_events_term__term(&term, (int)$1, (int)$3, &@1, &@3);
|
||||
|
||||
if (err)
|
||||
PE_ABORT(err);
|
||||
|
||||
ABORT_ON(parse_events_term__term(&term, (int)$1, (int)$3, &@1, &@3));
|
||||
$$ = term;
|
||||
}
|
||||
|
|
||||
PE_TERM '=' PE_VALUE
|
||||
{
|
||||
struct parse_events_term *term;
|
||||
int err = parse_events_term__num(&term, (int)$1, NULL, $3, false, &@1, &@3);
|
||||
|
||||
if (err)
|
||||
PE_ABORT(err);
|
||||
|
||||
ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, $3, false, &@1, &@3));
|
||||
$$ = term;
|
||||
}
|
||||
|
|
||||
PE_TERM
|
||||
{
|
||||
struct parse_events_term *term;
|
||||
int err = parse_events_term__num(&term, (int)$1, NULL, 1, true, &@1, NULL);
|
||||
|
||||
if (err)
|
||||
PE_ABORT(err);
|
||||
|
||||
ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, 1, true, &@1, NULL));
|
||||
$$ = term;
|
||||
}
|
||||
|
|
||||
name_or_raw array '=' name_or_legacy
|
||||
{
|
||||
struct parse_events_term *term;
|
||||
int err = parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER, $1, $4, &@1, &@4);
|
||||
|
||||
if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
||||
$1, $4, &@1, &@4)) {
|
||||
if (err) {
|
||||
free($1);
|
||||
free($4);
|
||||
free($2.ranges);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
term->array = $2;
|
||||
$$ = term;
|
||||
@ -859,12 +888,12 @@ name_or_raw array '=' name_or_legacy
|
||||
name_or_raw array '=' PE_VALUE
|
||||
{
|
||||
struct parse_events_term *term;
|
||||
int err = parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, $1, $4, false, &@1, &@4);
|
||||
|
||||
if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
|
||||
$1, $4, false, &@1, &@4)) {
|
||||
if (err) {
|
||||
free($1);
|
||||
free($2.ranges);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
term->array = $2;
|
||||
$$ = term;
|
||||
@ -874,14 +903,15 @@ PE_DRV_CFG_TERM
|
||||
{
|
||||
struct parse_events_term *term;
|
||||
char *config = strdup($1);
|
||||
int err;
|
||||
|
||||
if (!config)
|
||||
YYNOMEM;
|
||||
if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_DRV_CFG,
|
||||
config, $1, &@1, NULL)) {
|
||||
err = parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_DRV_CFG, config, $1, &@1, NULL);
|
||||
if (err) {
|
||||
free($1);
|
||||
free(config);
|
||||
YYABORT;
|
||||
PE_ABORT(err);
|
||||
}
|
||||
$$ = term;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user