From patchwork Thu Oct 24 19:01:59 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ian Rogers X-Patchwork-Id: 1183500 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: incoming-bpf@patchwork.ozlabs.org Delivered-To: patchwork-incoming-bpf@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=bpf-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="CgSp5bXh"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46zc7S2CtXz9sQp for ; Fri, 25 Oct 2019 06:02:28 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2504313AbfJXTC0 (ORCPT ); Thu, 24 Oct 2019 15:02:26 -0400 Received: from mail-pl1-f201.google.com ([209.85.214.201]:41482 "EHLO mail-pl1-f201.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2504307AbfJXTC0 (ORCPT ); Thu, 24 Oct 2019 15:02:26 -0400 Received: by mail-pl1-f201.google.com with SMTP id c10so477917plr.8 for ; Thu, 24 Oct 2019 12:02:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=5ErD/uUW7vtCV74qLmYJVVPg+bMOBGzP+X5HkC35T58=; b=CgSp5bXhlUTobiRM02zmWJl/O1es6j5hx616jElbXLxD1B/jx2Kr8Rtetuhpq0IELJ d6CyfMksRrCJHO9l8rwsrCQVTs5T/o5z0pSly17+SuoOFAKaR34TpAtw4uSAaTYm/NfE uE4UUFgHPw3V9+cSTUJJ6pn6Wh2WkdbnfNHVit9yo2tyY6FZELkiS+1f13s0E3cXnkk3 bYE0Pce24L/CUrFWL5M4tJtuuVEO7/DuF8T0K/0y0JUO5/fq5fVO26BK1gkBi1UqwlFm 7S3FyUeoj/LGDVT46VMlxoaYsT//fiNtfwVq7w6e/CtbzmIF04pCGq+U3yXoFtpXktab yEWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=5ErD/uUW7vtCV74qLmYJVVPg+bMOBGzP+X5HkC35T58=; b=b4d/49qqtFRyMu9HShu2Gc2LNE3d5EFzW/jqQ/yJWy+/W9/0yJzDk8KG3IjA3wSt1S EIz3WAs0cqp14L7eanOKpC0EO0Z5SzHHcB1UNsqD8k8Ls+Rixe4J/ythINjYQBpsyefd U7oRx8dahFHHYJ9b7ObHj5Fn0/pyRUkR5mkZFUkkTGLAWJjd+eF7Wfj+DbJKXXzGUMeE J7m0GOd6t9nR422PSglG4w9I2VCoalKGE1VHAIwM3CLCYcqmJUwB8E5/G7p+LHTzpwb+ 03/QfXfNwflpW7vr+2xPhApCi9JsXtw7GuLCPqVVZ/3kOyjUCCJNV5tjud0xP0lI0ovz YyBA== X-Gm-Message-State: APjAAAU4utZF+ywhn45kLAZQgP0mNON31YrWLYU1HhTvdmRI0DfQ+ntF jwuKAw0qdnAYmxbsFiXOnNbToF/DPpFY X-Google-Smtp-Source: APXvYqyXwpQ3TOn2fiGdk7NbgwLDCWGp6oVYQFmvn282WUx13NemB5ayXRRZtlfNgRR6m60/vRmJgLC56SrG X-Received: by 2002:a63:8f41:: with SMTP id r1mr13088716pgn.83.1571943743102; Thu, 24 Oct 2019 12:02:23 -0700 (PDT) Date: Thu, 24 Oct 2019 12:01:59 -0700 In-Reply-To: <20191024190202.109403-1-irogers@google.com> Message-Id: <20191024190202.109403-7-irogers@google.com> Mime-Version: 1.0 References: <20191023005337.196160-1-irogers@google.com> <20191024190202.109403-1-irogers@google.com> X-Mailer: git-send-email 2.23.0.866.gb869b98d4c-goog Subject: [PATCH v3 6/9] perf tools: add destructors for parse event terms From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , Andi Kleen , Jin Yao , Adrian Hunter , Kan Liang , John Garry , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org, clang-built-linux@googlegroups.com Cc: Stephane Eranian , Ian Rogers Sender: bpf-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org If parsing fails then destructors are ran to clean the up the stack. Rename the head union member to make the term and evlist use cases more distinct, this simplifies matching the correct destructor. Signed-off-by: Ian Rogers --- tools/perf/util/parse-events.y | 69 +++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 21 deletions(-) diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y index 545ab7cefc20..4725b14b9db4 100644 --- a/tools/perf/util/parse-events.y +++ b/tools/perf/util/parse-events.y @@ -12,6 +12,7 @@ #include #include #include +#include #include "pmu.h" #include "evsel.h" #include "parse-events.h" @@ -37,6 +38,25 @@ static struct list_head* alloc_list() return list; } +static void free_list_evsel(struct list_head* list_evsel) +{ + struct perf_evsel *pos, *tmp; + + list_for_each_entry_safe(pos, tmp, list_evsel, node) { + list_del_init(&pos->node); + perf_evsel__delete(pos); + } + free(list_evsel); +} + +static void free_term(struct parse_events_term *term) +{ + if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) + free(term->val.str); + zfree(&term->array.ranges); + free(term); +} + static void inc_group_count(struct list_head *list, struct parse_events_state *parse_state) { @@ -66,6 +86,7 @@ static void inc_group_count(struct list_head *list, %type PE_VALUE_SYM_TOOL %type PE_RAW %type PE_TERM +%type value_sym %type PE_NAME %type PE_BPF_OBJECT %type PE_BPF_SOURCE @@ -76,37 +97,43 @@ static void inc_group_count(struct list_head *list, %type PE_EVENT_NAME %type PE_PMU_EVENT_PRE PE_PMU_EVENT_SUF PE_KERNEL_PMU_EVENT %type PE_DRV_CFG_TERM -%type value_sym -%type event_config -%type opt_event_config -%type opt_pmu_config +%destructor { free ($$); } %type event_term -%type event_pmu -%type event_legacy_symbol -%type event_legacy_cache -%type event_legacy_mem -%type event_legacy_tracepoint +%destructor { free_term ($$); } +%type event_config +%type opt_event_config +%type opt_pmu_config +%destructor { parse_events_terms__delete ($$); } +%type event_pmu +%type event_legacy_symbol +%type event_legacy_cache +%type event_legacy_mem +%type event_legacy_tracepoint +%type event_legacy_numeric +%type event_legacy_raw +%type event_bpf_file +%type event_def +%type event_mod +%type event_name +%type event +%type events +%type group_def +%type group +%type groups +%destructor { free_list_evsel ($$); } %type tracepoint_name -%type event_legacy_numeric -%type event_legacy_raw -%type event_bpf_file -%type event_def -%type event_mod -%type event_name -%type event -%type events -%type group_def -%type group -%type groups +%destructor { free ($$.sys); free ($$.event); } %type array %type array_term %type array_terms +%destructor { free ($$.ranges); } %union { char *str; u64 num; - struct list_head *head; + struct list_head *list_evsel; + struct list_head *list_terms; struct parse_events_term *term; struct tracepoint_name { char *sys;