From patchwork Wed Oct 28 06:38:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo Yan X-Patchwork-Id: 11862511 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.8 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5061FC4363A for ; Wed, 28 Oct 2020 06:39:27 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id C0C7322241 for ; Wed, 28 Oct 2020 06:39:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="ygtbxIjC"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="IITH0aW/" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C0C7322241 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:MIME-Version:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:References:In-Reply-To:Message-Id:Date:Subject:To: From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=SkGephcMSmXkAxWcbBFaf/xhFZozesy+dhrs7DmpGik=; b=ygtbxIjCBnTv1yKcCs9VShhnVh ssXiFB/39mAgdFw68vlipOdhYJ2Y0tK0rweW2V4j/3JAX44nT0P5cpqg0MRj37OOIc2bRQYuAfqM8 /lJc7k6HaZJavY9YBSjvekn1lt39XT2/zS/8olU9grmoZMx/DW5JD4Qa5w4e1nre50+zl3Kwa5ITI NL3zrn8CuG8cbzSzdXvCzMKnMmIqmsI4xDzHCX4l9Myb7jAIuY+/MZM+QCeIxzEJjYTum8miecOxw Pm3lPCOWAaOEQqvmJz0b123Y+FnhNFrnyKGvJYPqyUn/TQ1eh9V/ctP3/SqP1zedfCml6CDHqb8RM rMNGecjQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kXf6l-0006Yp-Km; Wed, 28 Oct 2020 06:38:55 +0000 Received: from mail-pj1-x1044.google.com ([2607:f8b0:4864:20::1044]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kXf6X-0006UL-F9 for linux-arm-kernel@lists.infradead.org; Wed, 28 Oct 2020 06:38:43 +0000 Received: by mail-pj1-x1044.google.com with SMTP id az3so2047425pjb.4 for ; Tue, 27 Oct 2020 23:38:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=MZws/yHeMeZIdN0QaM5yV/E7HIfLgH25EcF8ntilLJg=; b=IITH0aW/Iy98o1mD08/jT0jklhoPMhvcjuumLNH5H+oY2uixh0bgviuxGGyQ+6WV2T 3K9/nkMaWQ3U5jpKTvf6oqPpNwFbh1/bC+Zry0/l10Rm3jBDOUByoFCP/9Es0O92PJJv +fdWca+aoBFZTklnT4D9oZbeM5lReXKB7LwytieIYwDHe2gwx58MRG32jW2G+GXfZKIr pwvlJtJZAC7N2Bwj+gUhlBiDkOv5olDkVm4VQUa2q8VRfDPualLwmFWpITpydKobtNni ZZ6IyjkmmBerXQrPlYpdvZSLBiQqV6PnCnmMqR09njuOvw4VQrd4OLjAxEKeqt3wZNJk EcXA== 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:in-reply-to :references; bh=MZws/yHeMeZIdN0QaM5yV/E7HIfLgH25EcF8ntilLJg=; b=nw5IdrB2JqYvZYa/9ZMHfhL3te7mgNcq8VOSZjmqIGZbgCdLnMANMiZh5IA4ss3Fc6 YnQQ7rfhHgzVYO5MNrjF3e/MTxzOwDt/AUpOyGSLfO7yiwG89QO+6rzHwGawt3zOJ//c cA6ssibnJ47liuU43SM61Zhnwaq9nLQzrZYFVCiVG/tkCVWHxNcm3/VbmCl6YfS+TCE1 ictN28NBtV9xL3qoGZF7hBj362mbDPih7PrrFB0ztBB7qi/ykS/2eiYYdnpYVb+BQWF+ gyr4cHwYgjYMyQ9e1ko33FctOyb4ZI/n4iGiZsB3EpEwveMPXqMHWsbBwSAqFNOUIyq8 oJ0g== X-Gm-Message-State: AOAM530/BWRDxpr4Eh9HtVsCR5FDDUx7AwQpebJxQOHRw7DfrpxcmEaT 3fqEpkZQUzxrG75bmSdjYnbt7A== X-Google-Smtp-Source: ABdhPJwJv62nvQGcNGugNXS8WGpowmteHMkD1GzLgt6WSpm84TMzNTgVPuaLGT9yaliTSeyhj0kLvw== X-Received: by 2002:a17:902:a3c2:b029:d6:3951:5bdc with SMTP id q2-20020a170902a3c2b02900d639515bdcmr6107502plb.71.1603867119624; Tue, 27 Oct 2020 23:38:39 -0700 (PDT) Received: from localhost ([2600:3c01::f03c:91ff:fe8a:bb03]) by smtp.gmail.com with ESMTPSA id j11sm4374936pfe.80.2020.10.27.23.38.38 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Tue, 27 Oct 2020 23:38:39 -0700 (PDT) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , John Garry , Will Deacon , Mathieu Poirier , Kemeng Shi , "Naveen N. Rao" , Ian Rogers , Al Grant , James Clark , Wei Li , =?utf-8?q?Andr=C3=A9_Przywara?= , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH v3 3/9] perf mem: Support new memory event PERF_MEM_EVENTS__LOAD_STORE Date: Wed, 28 Oct 2020 14:38:07 +0800 Message-Id: <20201028063813.8562-4-leo.yan@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201028063813.8562-1-leo.yan@linaro.org> References: <20201028063813.8562-1-leo.yan@linaro.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201028_023841_609007_C4371517 X-CRM114-Status: GOOD ( 21.94 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Leo Yan MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On the architectures with perf memory profiling, two types of hardware events have been supported: load and store; if want to profile memory for both load and store operations, the tool will use these two events at the same time, the usage is: # perf mem record -t load,store -- uname But this cannot be applied for AUX tracing event, the same PMU event can be used to only trace memory load, or only memory store, or trace for both memory load and store. This patch introduces a new event PERF_MEM_EVENTS__LOAD_STORE, which is used to support the event which can record both memory load and store operations, thus a new type option "ldst" is added: # perf mem record -t ldst -- uname Signed-off-by: Leo Yan --- tools/perf/builtin-mem.c | 13 ++++++++++--- tools/perf/util/mem-events.c | 13 ++++++++++++- tools/perf/util/mem-events.h | 1 + 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c index 9a7df8d01296..31144f586e77 100644 --- a/tools/perf/builtin-mem.c +++ b/tools/perf/builtin-mem.c @@ -19,8 +19,9 @@ #include "util/symbol.h" #include -#define MEM_OPERATION_LOAD 0x1 -#define MEM_OPERATION_STORE 0x2 +#define MEM_OPERATION_LOAD 0x1 +#define MEM_OPERATION_STORE 0x2 +#define MEM_OPERATION_LOAD_STORE 0x4 struct perf_mem { struct perf_tool tool; @@ -97,6 +98,11 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem) e->record = true; } + if (mem->operation & MEM_OPERATION_LOAD_STORE) { + e = perf_mem_events__ptr(PERF_MEM_EVENTS__LOAD_STORE); + e->record = true; + } + e = perf_mem_events__ptr(PERF_MEM_EVENTS__LOAD); if (e->record) rec_argv[i++] = "-W"; @@ -326,6 +332,7 @@ struct mem_mode { static const struct mem_mode mem_modes[]={ MEM_OPT("load", MEM_OPERATION_LOAD), MEM_OPT("store", MEM_OPERATION_STORE), + MEM_OPT("ldst", MEM_OPERATION_LOAD_STORE), MEM_END }; @@ -405,7 +412,7 @@ int cmd_mem(int argc, const char **argv) }; const struct option mem_options[] = { OPT_CALLBACK('t', "type", &mem.operation, - "type", "memory operations(load,store) Default load,store", + "type", "memory operations(load,store,ldst) Default load,store", parse_mem_ops), OPT_BOOLEAN('D', "dump-raw-samples", &mem.dump_raw, "dump raw samples in ASCII"), diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c index 7a5a0d699e27..2e82b4e78f29 100644 --- a/tools/perf/util/mem-events.c +++ b/tools/perf/util/mem-events.c @@ -20,6 +20,7 @@ unsigned int perf_mem_events__loads_ldlat = 30; static struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = { E("ldlat-loads", "cpu/mem-loads,ldlat=%u/P", "cpu/events/mem-loads"), E("ldlat-stores", "cpu/mem-stores/P", "cpu/events/mem-stores"), + E(NULL, NULL, NULL), }; #undef E @@ -75,6 +76,9 @@ int perf_mem_events__parse(const char *str) for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) { struct perf_mem_event *e = perf_mem_events__ptr(j); + if (!e->tag) + continue; + if (strstr(e->tag, tok)) e->record = found = true; } @@ -105,6 +109,13 @@ int perf_mem_events__init(void) struct perf_mem_event *e = perf_mem_events__ptr(j); struct stat st; + /* + * If the event entry isn't valid, skip initialization + * and "e->supported" will keep false. + */ + if (!e->tag) + continue; + scnprintf(path, PATH_MAX, "%s/devices/%s", mnt, e->sysfs_name); @@ -123,7 +134,7 @@ void perf_mem_events__list(void) struct perf_mem_event *e = perf_mem_events__ptr(j); fprintf(stderr, "%-13s%-*s%s\n", - e->tag, + e->tag ? e->tag : "", verbose > 0 ? 25 : 0, verbose > 0 ? perf_mem_events__name(j) : "", e->supported ? ": available" : ""); diff --git a/tools/perf/util/mem-events.h b/tools/perf/util/mem-events.h index 726a9c8103e4..5ef178278909 100644 --- a/tools/perf/util/mem-events.h +++ b/tools/perf/util/mem-events.h @@ -28,6 +28,7 @@ struct mem_info { enum { PERF_MEM_EVENTS__LOAD, PERF_MEM_EVENTS__STORE, + PERF_MEM_EVENTS__LOAD_STORE, PERF_MEM_EVENTS__MAX, };