Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp22142950ybl; Mon, 6 Jan 2020 19:19:37 -0800 (PST) X-Google-Smtp-Source: APXvYqyDjoIabB5OA8rO5zp7QCGqzB83JvqU92v0GRKCVwkXPXNmQJWR0w028pIEvQuqdReUtq1t X-Received: by 2002:a9d:6d10:: with SMTP id o16mr122227085otp.28.1578367177350; Mon, 06 Jan 2020 19:19:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1578367177; cv=none; d=google.com; s=arc-20160816; b=CIRFa9YDpMOXPFbgtWkIerlxOfhv7uD6x1r3D9VbpjBSf0ROMwhkKD6iCSW3DXtaxP JGIUXd/96VW8coCoum+e7fc3z0pKUEoHy52gBL1avsKwB2jbRU67E8jhi6yxNdaQxQe2 +MOBjKXtlILXu1HHEnP/NzaNW0OpzrLcjudDj75SEFELM4GWyOBb/NPB9P1Lac3d/grL 4wqj6sKu5RUz1h9gJTWo0M1BswtrH/EDSQhGFwDYsfUWb8QwiYviWCz8FCxIPXjPb+1b tLN5bnAf+OhTkh6W4EDmYLqiF73VnBNGwZ5CpONFXCkhqC6g8uGYmHydVT1RPqLaEcl9 bgnw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature; bh=FPVgAA67m3TAdDYScRWZhAuLGh650kB2AJurIEodDz0=; b=te+1GA2gpeWdwb1x9oejkryWOZbq2EYMvYyEFBiOLtuh7glPbQdXYUFfx9DGxDmhcA ItSpTXzCQJ4x3MlOaIZ2hSHU2KCzwJbAmWbTaTDw6l+ykC3boX2trHJo8kaJ7G6lSOH/ btWbRfO0ZmCdSrbU8dTkeVdESsdNe7Xk1Q/ZqeMy45RGnXoL1b4/QadyCGuBQE+sazIb 5sheaB0Z5VF1iK7LvEEEwK/nfzJ2nNZUI9OudjEHhdkPFrgVbL2SlwAZtv3+fGv2UCj4 XekLD2YI+TNctDtAm3H25WYed6/dLGLfAwGQKZjYXPgi6XNG9TAg7i24jPlzehlDYeYg 9pTg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="knmIP/0T"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u16si32788013oia.233.2020.01.06.19.19.24; Mon, 06 Jan 2020 19:19:37 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="knmIP/0T"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727409AbgAGDSm (ORCPT + 99 others); Mon, 6 Jan 2020 22:18:42 -0500 Received: from mail-pf1-f194.google.com ([209.85.210.194]:42906 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727295AbgAGDSm (ORCPT ); Mon, 6 Jan 2020 22:18:42 -0500 Received: by mail-pf1-f194.google.com with SMTP id 4so27869087pfz.9 for ; Mon, 06 Jan 2020 19:18:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=FPVgAA67m3TAdDYScRWZhAuLGh650kB2AJurIEodDz0=; b=knmIP/0Ts3HRnwu5A4EgqxBj1dPlxUQ47wOqTbFr8RIEgTDEQfnS1nmyyPJVAA1xG5 rWvjeVSg4G3n6TI6C06WOUS3yQkuWFE7XWODNZb5t6+42r91AaWfQT6pf94iEsEszu18 EGvdZ8pgnpI7kYMP7YkjM2Hucv6wjfre+FunQI4kknoGcILNU710IRUX+Vn6AhiP6E5I Ar/auhps/hjfObcVOMAsqbaPQyS/PfUNPIbFTLJrvL4eRBoNZjp7+n1NBhct2OpfZI4O 4uk78VabCyg9hvhL4aI4LVN/IOfnClF9z9LJgCCN2epuEuXxwYQm6AevZ8sjJGXOjwKN W7QQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=FPVgAA67m3TAdDYScRWZhAuLGh650kB2AJurIEodDz0=; b=jCpFQNxEeG84vMd78iYFSFeI9NuogJmerZ/+r1Zmew1gFLo4LmygQIJgirhpkYNYjs +oPEXK7vlTJ84mecwUjWp4yS0Z/tbSf9GbNjeZGsFjeb63NIRDTI+AAiVvCtmh3JD2mp mvo4OQ832Xvcb2c4gVuA7quRnSNzoMsCuHQMpZLUODcjE52H6WiFLlhFSG24oAUYui3g 2nggC01B/IkRpm5s+A2Owr+/IQF7QTo87zUfIGf+SZgdngCPUPG6iJLQNlvnJTHAypIB qVgurEtFP/4/+uEzmyR1sLtQbHUPBVsppo7lOx8Hj8Nye1PT62/DDlSVsg+j4wjRReTv AKTg== X-Gm-Message-State: APjAAAUq4c4w5b2osoQnTev6skt+3LBjQY9DPGeY1Ki9IPZ0K1mj+GGE y30lsNOgaecRKnWhYL/zdPuMUA== X-Received: by 2002:a63:7705:: with SMTP id s5mr112078724pgc.379.1578367121393; Mon, 06 Jan 2020 19:18:41 -0800 (PST) Received: from localhost.localdomain (li1058-79.members.linode.com. [45.33.121.79]) by smtp.gmail.com with ESMTPSA id r62sm81699361pfc.89.2020.01.06.19.18.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Jan 2020 19:18:40 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Jiri Olsa , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Namhyung Kim , Ian Rogers , Adrian Hunter , Andi Kleen , linux-kernel@vger.kernel.org, Mathieu Poirier , Mike Leach , Suzuki K Poulose Cc: Leo Yan Subject: [PATCH v2] perf parse: Copy string to perf_evsel_config_term Date: Tue, 7 Jan 2020 11:18:28 +0800 Message-Id: <20200107031828.23103-1-leo.yan@linaro.org> X-Mailer: git-send-email 2.17.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org perf with CoreSight fails to record trace data with command: perf record -e cs_etm/@tmc_etr0/u --per-thread ls failed to set sink "" on event cs_etm/@tmc_etr0/u with 21 (Is a directory)/perf/ This failure is root caused with the commit 1dc925568f01 ("perf parse: Add a deep delete for parse event terms"). The log shows, cs_etm fails to parse the sink attribution; cs_etm event relies on the event configuration to pass sink name, but the event specific configuration data cannot be passed properly with flow: get_config_terms() ADD_CONFIG_TERM(DRV_CFG, drv_cfg, term->val.str); __t->val.drv_cfg = term->val.str; `> __t->val.drv_cfg is assigned to term->val.str; parse_events_terms__purge() parse_events_term__delete() zfree(&term->val.str); `> term->val.str is freed and assigned to NULL pointer; cs_etm_set_sink_attr() sink = __t->val.drv_cfg; `> sink string has been freed. To fix this issue, in the function get_config_terms(), this patch changes from directly assignment pointer value for the strings to use strdup() for allocation a new duplicate string for the cases: perf_evsel_config_term::val.callgraph perf_evsel_config_term::val.branch perf_evsel_config_term::val.drv_cfg. Fixes: 1dc925568f01 ("perf parse: Add a deep delete for parse event terms") Signed-off-by: Leo Yan --- tools/perf/util/parse-events.c | 55 +++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index ed7c008b9c8b..49b26504bee3 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -1220,7 +1220,6 @@ static int get_config_terms(struct list_head *head_config, struct list_head *head_terms __maybe_unused) { #define ADD_CONFIG_TERM(__type, __name, __val) \ -do { \ struct perf_evsel_config_term *__t; \ \ __t = zalloc(sizeof(*__t)); \ @@ -1229,9 +1228,23 @@ do { \ \ INIT_LIST_HEAD(&__t->list); \ __t->type = PERF_EVSEL__CONFIG_TERM_ ## __type; \ - __t->val.__name = __val; \ __t->weak = term->weak; \ - list_add_tail(&__t->list, head_terms); \ + list_add_tail(&__t->list, head_terms) + +#define ADD_CONFIG_TERM_VAL(__type, __name, __val) \ +do { \ + ADD_CONFIG_TERM(__type, __name, __val); \ + __t->val.__name = __val; \ +} while (0) + +#define ADD_CONFIG_TERM_STR(__type, __name, __val) \ +do { \ + ADD_CONFIG_TERM(__type, __name, __val); \ + __t->val.__name = strdup(__val); \ + if (!__t->val.__name) { \ + zfree(&__t); \ + return -ENOMEM; \ + } \ } while (0) struct parse_events_term *term; @@ -1239,53 +1252,53 @@ do { \ list_for_each_entry(term, head_config, list) { switch (term->type_term) { case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD: - ADD_CONFIG_TERM(PERIOD, period, term->val.num); + ADD_CONFIG_TERM_VAL(PERIOD, period, term->val.num); break; case PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ: - ADD_CONFIG_TERM(FREQ, freq, term->val.num); + ADD_CONFIG_TERM_VAL(FREQ, freq, term->val.num); break; case PARSE_EVENTS__TERM_TYPE_TIME: - ADD_CONFIG_TERM(TIME, time, term->val.num); + ADD_CONFIG_TERM_VAL(TIME, time, term->val.num); break; case PARSE_EVENTS__TERM_TYPE_CALLGRAPH: - ADD_CONFIG_TERM(CALLGRAPH, callgraph, term->val.str); + ADD_CONFIG_TERM_STR(CALLGRAPH, callgraph, term->val.str); break; case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE: - ADD_CONFIG_TERM(BRANCH, branch, term->val.str); + ADD_CONFIG_TERM_STR(BRANCH, branch, term->val.str); break; case PARSE_EVENTS__TERM_TYPE_STACKSIZE: - ADD_CONFIG_TERM(STACK_USER, stack_user, term->val.num); + ADD_CONFIG_TERM_VAL(STACK_USER, stack_user, term->val.num); break; case PARSE_EVENTS__TERM_TYPE_INHERIT: - ADD_CONFIG_TERM(INHERIT, inherit, term->val.num ? 1 : 0); + ADD_CONFIG_TERM_VAL(INHERIT, inherit, term->val.num ? 1 : 0); break; case PARSE_EVENTS__TERM_TYPE_NOINHERIT: - ADD_CONFIG_TERM(INHERIT, inherit, term->val.num ? 0 : 1); + ADD_CONFIG_TERM_VAL(INHERIT, inherit, term->val.num ? 0 : 1); break; case PARSE_EVENTS__TERM_TYPE_MAX_STACK: - ADD_CONFIG_TERM(MAX_STACK, max_stack, term->val.num); + ADD_CONFIG_TERM_VAL(MAX_STACK, max_stack, term->val.num); break; case PARSE_EVENTS__TERM_TYPE_MAX_EVENTS: - ADD_CONFIG_TERM(MAX_EVENTS, max_events, term->val.num); + ADD_CONFIG_TERM_VAL(MAX_EVENTS, max_events, term->val.num); break; case PARSE_EVENTS__TERM_TYPE_OVERWRITE: - ADD_CONFIG_TERM(OVERWRITE, overwrite, term->val.num ? 1 : 0); + ADD_CONFIG_TERM_VAL(OVERWRITE, overwrite, term->val.num ? 1 : 0); break; case PARSE_EVENTS__TERM_TYPE_NOOVERWRITE: - ADD_CONFIG_TERM(OVERWRITE, overwrite, term->val.num ? 0 : 1); + ADD_CONFIG_TERM_VAL(OVERWRITE, overwrite, term->val.num ? 0 : 1); break; case PARSE_EVENTS__TERM_TYPE_DRV_CFG: - ADD_CONFIG_TERM(DRV_CFG, drv_cfg, term->val.str); + ADD_CONFIG_TERM_STR(DRV_CFG, drv_cfg, term->val.str); break; case PARSE_EVENTS__TERM_TYPE_PERCORE: - ADD_CONFIG_TERM(PERCORE, percore, - term->val.num ? true : false); + ADD_CONFIG_TERM_VAL(PERCORE, percore, + term->val.num ? true : false); break; case PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT: - ADD_CONFIG_TERM(AUX_OUTPUT, aux_output, term->val.num ? 1 : 0); + ADD_CONFIG_TERM_VAL(AUX_OUTPUT, aux_output, term->val.num ? 1 : 0); break; case PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE: - ADD_CONFIG_TERM(AUX_SAMPLE_SIZE, aux_sample_size, term->val.num); + ADD_CONFIG_TERM_VAL(AUX_SAMPLE_SIZE, aux_sample_size, term->val.num); break; default: break; @@ -1322,7 +1335,7 @@ static int get_config_chgs(struct perf_pmu *pmu, struct list_head *head_config, } if (bits) - ADD_CONFIG_TERM(CFG_CHG, cfg_chg, bits); + ADD_CONFIG_TERM_VAL(CFG_CHG, cfg_chg, bits); #undef ADD_CONFIG_TERM return 0; -- 2.17.1