From nobody Sun Feb 8 03:57:08 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3752416DEA5; Wed, 31 Jul 2024 23:55:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722470107; cv=none; b=NoT4yxU1/A9Kj7VA7CyOLUEaE4mi5zNpdw5csKAuZHDF8EJtfADes6PPw6QWAPpkTeOzfPNa8/ZZTq66j6Yl1DNIAT3Kb8Tu8U60n5DqPQ0qT19wvUQO3hdZgnA9sFHWv0AYZa/kqIPMHJTiyevLtE6NJ/qiTTpDrv9Vr31OH9U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722470107; c=relaxed/simple; bh=Sin1KNDLL+kUSrzMmoBpl5p9aHQKG1CFltG2rFn+nsc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QbNuBzJNYS+XEastqrc6NIMswGZVeTPwvORtE99KxQaCWNLbwKE+DdJi9PIZcTNyjhuiEnbPpEsTa9T5iLSisHW//0oJDVe+25KFHuOvCkIEMpc6CLmhyIQOvVgw2tEB9JV76CMSg6KxahuHs/d1e1G2lltdmlIXZOZG4WeSo2k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=SrzxBHU+; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="SrzxBHU+" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7B93AC4AF0C; Wed, 31 Jul 2024 23:55:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722470106; bh=Sin1KNDLL+kUSrzMmoBpl5p9aHQKG1CFltG2rFn+nsc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SrzxBHU+Jv3WTtqExp1XI+gLhkwWerP4/QF2t6PTsaCDJHXXooLxRJ2QyoaTqUe+j 5YF54Rbw8OyumNX6A97mTyIoOXy8FlNrmFF7WYh11TRLf6uT31gzDiCYUOxOPjJuDM qrhMqUrZfQfc6PCsAbd7hrFdxeB2YyaEXlEUz/5b8x1CkMK8BVUJkaWy8kJxkRNdBI Xcg5MNg0Dd+izSM8GkxFR65vj3FNqHFoDtVMYTiCs1qFG38Rw/ezu3ZlSf/XjELUqO +dRq2amV+TagcJsis1LctHBtHVjKqz6w5ZOFUXdnaaqWh4IVi5HKmo+czEG5FY3mCV aepsvKv27S09A== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org, Stephane Eranian , Athira Rajeev Subject: [PATCH 1/6] perf hist: Correct hist_entry->mem_info refcounts Date: Wed, 31 Jul 2024 16:55:00 -0700 Message-ID: <20240731235505.710436-2-namhyung@kernel.org> X-Mailer: git-send-email 2.46.0.rc1.232.g9752f9e123-goog In-Reply-To: <20240731235505.710436-1-namhyung@kernel.org> References: <20240731235505.710436-1-namhyung@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The mem_info is created by iter_prepare_mem_entry() at the beginning and destroyed by iter_finish_mem_entry() at the end. So if it's used in a new hist_entry, it should be cloned. Simplify (hopefully) the logic by adding some helper functions and not holding the refcount in the temporary entry. Signed-off-by: Namhyung Kim --- tools/perf/util/hist.c | 14 +++++++------- tools/perf/util/map_symbol.c | 18 ++++++++++++++++++ tools/perf/util/map_symbol.h | 3 +++ tools/perf/util/mem-info.c | 13 +++++++++++++ tools/perf/util/mem-info.h | 1 + 5 files changed, 42 insertions(+), 7 deletions(-) diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c index f028f113c4fd..f8ee1cd6929d 100644 --- a/tools/perf/util/hist.c +++ b/tools/perf/util/hist.c @@ -476,6 +476,12 @@ static int hist_entry__init(struct hist_entry *he, he->branch_info->to.ms.map =3D map__get(he->branch_info->to.ms.map); } =20 + if (he->mem_info) { + he->mem_info =3D mem_info__clone(template->mem_info); + if (he->mem_info =3D=3D NULL) + goto err_infos; + } + if (hist_entry__has_callchains(he) && symbol_conf.use_callchain) callchain_init(he->callchain); =20 @@ -620,12 +626,6 @@ static struct hist_entry *hists__findnew_entry(struct = hists *hists, if (symbol_conf.cumulate_callchain) he_stat__add_period(he->stat_acc, period); =20 - /* - * This mem info was allocated from sample__resolve_mem - * and will not be used anymore. - */ - mem_info__zput(entry->mem_info); - block_info__delete(entry->block_info); =20 kvm_info__zput(entry->kvm_info); @@ -739,7 +739,7 @@ __hists__add_entry(struct hists *hists, .filtered =3D symbol__parent_filter(sym_parent) | al->filtered, .hists =3D hists, .branch_info =3D bi, - .mem_info =3D mem_info__get(mi), + .mem_info =3D mi, .kvm_info =3D ki, .block_info =3D block_info, .transaction =3D sample->transaction, diff --git a/tools/perf/util/map_symbol.c b/tools/perf/util/map_symbol.c index bef5079f2403..6ad2960bc289 100644 --- a/tools/perf/util/map_symbol.c +++ b/tools/perf/util/map_symbol.c @@ -13,3 +13,21 @@ void addr_map_symbol__exit(struct addr_map_symbol *ams) { map_symbol__exit(&ams->ms); } + +void map_symbol__copy(struct map_symbol *dst, struct map_symbol *src) +{ + dst->maps =3D maps__get(src->maps); + dst->map =3D map__get(src->map); + dst->sym =3D src->sym; +} + +void addr_map_symbol__copy(struct addr_map_symbol *dst, struct addr_map_sy= mbol *src) +{ + map_symbol__copy(&dst->ms, &src->ms); + + dst->addr =3D src->addr; + dst->al_addr =3D src->al_addr; + dst->al_level =3D src->al_level; + dst->phys_addr =3D src->phys_addr; + dst->data_page_size =3D src->data_page_size; +} diff --git a/tools/perf/util/map_symbol.h b/tools/perf/util/map_symbol.h index 72d5ed938ed6..e370bb32ed47 100644 --- a/tools/perf/util/map_symbol.h +++ b/tools/perf/util/map_symbol.h @@ -26,4 +26,7 @@ struct addr_map_symbol { void map_symbol__exit(struct map_symbol *ms); void addr_map_symbol__exit(struct addr_map_symbol *ams); =20 +void map_symbol__copy(struct map_symbol *dst, struct map_symbol *src); +void addr_map_symbol__copy(struct addr_map_symbol *dst, struct addr_map_sy= mbol *src); + #endif // __PERF_MAP_SYMBOL diff --git a/tools/perf/util/mem-info.c b/tools/perf/util/mem-info.c index 27d67721a695..d3efa9c139f2 100644 --- a/tools/perf/util/mem-info.c +++ b/tools/perf/util/mem-info.c @@ -33,3 +33,16 @@ struct mem_info *mem_info__new(void) =20 return result; } + +struct mem_info *mem_info__clone(struct mem_info *mi) +{ + struct mem_info *result =3D mem_info__new(); + + if (result) { + addr_map_symbol__copy(mem_info__iaddr(result), mem_info__iaddr(mi)); + addr_map_symbol__copy(mem_info__daddr(result), mem_info__daddr(mi)); + mem_info__data_src(result)->val =3D mem_info__data_src(mi)->val; + } + + return result; +} diff --git a/tools/perf/util/mem-info.h b/tools/perf/util/mem-info.h index 0f68e29f311b..df75e94ed3d0 100644 --- a/tools/perf/util/mem-info.h +++ b/tools/perf/util/mem-info.h @@ -15,6 +15,7 @@ DECLARE_RC_STRUCT(mem_info) { }; =20 struct mem_info *mem_info__new(void); +struct mem_info *mem_info__clone(struct mem_info *mi); struct mem_info *mem_info__get(struct mem_info *mi); void mem_info__put(struct mem_info *mi); =20 --=20 2.46.0.rc1.232.g9752f9e123-goog From nobody Sun Feb 8 03:57:08 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E760516E877; Wed, 31 Jul 2024 23:55:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722470108; cv=none; b=Ih/4Jn4BsseKuBaTKkNtFY/rgKZTESufngqUNnQ4D2v0dQEVha71l2/wPa73Ve76UQ1g9rt5AV/lha3JOu/J09Y/BozTonXvB0++tHVEoLE8oXp3X9v9w2L7HHVJ/fZahLpLy2bPjrYjhE/gw8YbFi6hC04hRig++lSbKZh6Mms= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722470108; c=relaxed/simple; bh=Lnh83Kp3wIX0XLYy0d/LYvd2p6g4X2YXSQqo+aqe9pE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CfNrHZ9gcsxkfSbyFEObyAUob5kxFICbxKg+FWPnZzRg2uuuybR16lyPoOJC+LUYQJNCooQ1MU9P0aDE1rYtlf8kxmrT3y/1KyqKN6dwsj0EtM7Pehska+7oVtmxQvwxe0KVOgeUR9ZSUNUf33tOoLj+h8OzLIFj8CUBlw8Yul8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Ut5PPvTd; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Ut5PPvTd" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 039F2C4AF13; Wed, 31 Jul 2024 23:55:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722470107; bh=Lnh83Kp3wIX0XLYy0d/LYvd2p6g4X2YXSQqo+aqe9pE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Ut5PPvTdX1+bkHfb2qiGc4NxK/9+kbJBM7Kpmdw84qq0zqsVFx+am180C6ft3wPQN 9No+VSqZynwiaOEAYBhwe9JaRpoLeFz7Ex668t7+dXFv3RyLu3CirAHTKN2LY3OCOj rAYNcjhovZ3jYhNTn1WwX5kAHY58kY6qM7H6LHOZ5Gsnb5fkSTAkBIzs0S2EWA/IXf owTkA/m/gyiU1j+JKXnltybmNrIMw/1HZ3p1JfxtjLqrUmrl7CJJcFflalkWzT22jB o2y/QHvUJwgul5gbyDDWnRDo/ZIoCknzzaKPeEYcJAi1tr+uLFf0zqXQoFTyGMCm2r z1NpyIaEXh2Sw== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org, Stephane Eranian , Athira Rajeev Subject: [PATCH 2/6] perf mem: Free the allocated sort string Date: Wed, 31 Jul 2024 16:55:01 -0700 Message-ID: <20240731235505.710436-3-namhyung@kernel.org> X-Mailer: git-send-email 2.46.0.rc1.232.g9752f9e123-goog In-Reply-To: <20240731235505.710436-1-namhyung@kernel.org> References: <20240731235505.710436-1-namhyung@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The get_sort_order() returns either a new string (from strdup) or NULL but it never gets freed. Signed-off-by: Namhyung Kim --- tools/perf/builtin-mem.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c index 863fcd735dae..93413cfcd585 100644 --- a/tools/perf/builtin-mem.c +++ b/tools/perf/builtin-mem.c @@ -372,6 +372,7 @@ static int report_events(int argc, const char **argv, s= truct perf_mem *mem) rep_argv[i] =3D argv[j]; =20 ret =3D cmd_report(i, rep_argv); + free(new_sort_order); free(rep_argv); return ret; } --=20 2.46.0.rc1.232.g9752f9e123-goog From nobody Sun Feb 8 03:57:08 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 56BD016E88D; Wed, 31 Jul 2024 23:55:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722470108; cv=none; b=fokDKkCbWgVuflRFtVgTV0/fvbH44JH8mo1w8/97a1oWqMQzV7ILkrtg09SWRcmJkG2/HbURZkxz4vggQao28XmsEjDfAhMybyCAHdFvlAirZpiMAArSLdS1E+ObW2o8FZia+/snc6N8VNqgbULGea+acs53RrSnpqap4wvVpHc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722470108; c=relaxed/simple; bh=oRdg+rZVqR1NxDWvlBlQywV1YWczIkIRxIVOwxk5/fw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nsAj16I0RjI5Oo7y1YPy6/3I8M2/KDH8ZXrCQnUNOo2uisZ3OyeQo7xbJQ7bddUCLZ+NCW9ERrhcW80eDJt9jvvTn8Al/SRMjGN4YfE2KkofdoxeHPH18r8UNy3EGLXFEavmRe7ZcTsKKxs3olbLWV/djKbo71BuH5ciaCl02es= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=rsmibHKx; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="rsmibHKx" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 892C5C4AF19; Wed, 31 Jul 2024 23:55:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722470108; bh=oRdg+rZVqR1NxDWvlBlQywV1YWczIkIRxIVOwxk5/fw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rsmibHKxZ/y6eq6kWnKFu+pvRjD9cYuwPa7GsiA+GG108fXEpum840Kx97bc+0f9P NexSZvS32a1oMUD+7kA5wjHk8GzlWDzGdxAele1GhGYvp/uY13cQ3nk8JWsg3OQqBA uBKQKpFycxIZnTy5nrnnEbumlSt4Qf05v4dk0VvIVIISU6V4CxazAoPfBm0ZYzZMck fRZK92Zx+TpCH9ARdY120JvYUvqybfJ94gOumNFQgU8WWMi8VdJ87CPPETp/uNXR/1 tg4xtsOM96Iwf/qYSjHtBPulpHTiBdm5EAr1N1J3VCgS7BZFBQMRfaXZpVKUBaBK/I /1AWFXv7hIYWg== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org, Stephane Eranian , Athira Rajeev , Aditya Gupta Subject: [PATCH 3/6] perf mem: Rework command option handling Date: Wed, 31 Jul 2024 16:55:02 -0700 Message-ID: <20240731235505.710436-4-namhyung@kernel.org> X-Mailer: git-send-email 2.46.0.rc1.232.g9752f9e123-goog In-Reply-To: <20240731235505.710436-1-namhyung@kernel.org> References: <20240731235505.710436-1-namhyung@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Split the common option and ones for record or report. Otherwise -U in the record option cannot be used because it clashes with in the common (or report) option. Also rename report_events() to __cmd_report() to follow the convention and to be sync with the record part. Also set the flag PARSE_OPT_STOP_AT_NON_OPTION for the common option so that it can show the help message in the subcommand like below: $ perf mem record -h Usage: perf mem record [] [] or: perf mem record [] -- [] -C, --cpu list of cpus to profile -e, --event event selector. use 'perf mem record -e list' t= o list available events -f, --force don't complain, do it -K, --all-kernel collect only kernel level data -p, --phys-data Record/Report sample physical addresses -t, --type memory operations(load,store) Default load,store -U, --all-user collect only user level data -v, --verbose be more verbose (show counter open errors, etc) --data-page-size Record/Report sample data address page size --ldlat mem-loads latency Cc: Aditya Gupta Signed-off-by: Namhyung Kim --- tools/perf/builtin-mem.c | 79 +++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 34 deletions(-) diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c index 93413cfcd585..819edaf6b1df 100644 --- a/tools/perf/builtin-mem.c +++ b/tools/perf/builtin-mem.c @@ -34,6 +34,8 @@ struct perf_mem { bool force; bool phys_addr; bool data_page_size; + bool all_kernel; + bool all_user; int operation; const char *cpu_list; DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS); @@ -62,33 +64,19 @@ static int parse_record_events(const struct option *opt, return 0; } =20 -static const char * const __usage[] =3D { - "perf mem record [] []", - "perf mem record [] -- []", - NULL -}; - -static const char * const *record_mem_usage =3D __usage; - -static int __cmd_record(int argc, const char **argv, struct perf_mem *mem) +static int __cmd_record(int argc, const char **argv, struct perf_mem *mem, + const struct option *options) { int rec_argc, i =3D 0, j; int start, end; const char **rec_argv; int ret; - bool all_user =3D false, all_kernel =3D false; struct perf_mem_event *e; struct perf_pmu *pmu; - struct option options[] =3D { - OPT_CALLBACK('e', "event", &mem, "event", - "event selector. use 'perf mem record -e list' to list available ev= ents", - parse_record_events), - OPT_UINTEGER(0, "ldlat", &perf_mem_events__loads_ldlat, "mem-loads latenc= y"), - OPT_INCR('v', "verbose", &verbose, - "be more verbose (show counter open errors, etc)"), - OPT_BOOLEAN('U', "all-user", &all_user, "collect only user level data"), - OPT_BOOLEAN('K', "all-kernel", &all_kernel, "collect only kernel level da= ta"), - OPT_END() + const char * const record_usage[] =3D { + "perf mem record [] []", + "perf mem record [] -- []", + NULL }; =20 pmu =3D perf_mem_events_find_pmu(); @@ -102,7 +90,7 @@ static int __cmd_record(int argc, const char **argv, str= uct perf_mem *mem) return -1; } =20 - argc =3D parse_options(argc, argv, options, record_mem_usage, + argc =3D parse_options(argc, argv, options, record_usage, PARSE_OPT_KEEP_UNKNOWN); =20 /* Max number of arguments multiplied by number of PMUs that can support = them. */ @@ -158,10 +146,10 @@ static int __cmd_record(int argc, const char **argv, = struct perf_mem *mem) goto out; end =3D i; =20 - if (all_user) + if (mem->all_user) rec_argv[i++] =3D "--all-user"; =20 - if (all_kernel) + if (mem->all_kernel) rec_argv[i++] =3D "--all-kernel"; =20 if (mem->cpu_list) { @@ -319,6 +307,7 @@ static int report_raw_events(struct perf_mem *mem) perf_session__delete(session); return ret; } + static char *get_sort_order(struct perf_mem *mem) { bool has_extra_options =3D (mem->phys_addr | mem->data_page_size) ? true = : false; @@ -346,11 +335,19 @@ static char *get_sort_order(struct perf_mem *mem) return strdup(sort); } =20 -static int report_events(int argc, const char **argv, struct perf_mem *mem) +static int __cmd_report(int argc, const char **argv, struct perf_mem *mem, + const struct option *options) { const char **rep_argv; int ret, i =3D 0, j, rep_argc; char *new_sort_order; + const char * const report_usage[] =3D { + "perf mem report []", + NULL + }; + + argc =3D parse_options(argc, argv, options, report_usage, + PARSE_OPT_KEEP_UNKNOWN); =20 if (mem->dump_raw) return report_raw_events(mem); @@ -368,7 +365,7 @@ static int report_events(int argc, const char **argv, s= truct perf_mem *mem) if (new_sort_order) rep_argv[i++] =3D new_sort_order; =20 - for (j =3D 1; j < argc; j++, i++) + for (j =3D 0; j < argc; j++, i++) rep_argv[i] =3D argv[j]; =20 ret =3D cmd_report(i, rep_argv); @@ -475,22 +472,36 @@ int cmd_mem(int argc, const char **argv) OPT_CALLBACK('t', "type", &mem.operation, "type", "memory operations(load,store) Default load,store", parse_mem_ops), + OPT_STRING('C', "cpu", &mem.cpu_list, "cpu", + "list of cpus to profile"), + OPT_BOOLEAN('f', "force", &mem.force, "don't complain, do it"), + OPT_INCR('v', "verbose", &verbose, + "be more verbose (show counter open errors, etc)"), + OPT_BOOLEAN('p', "phys-data", &mem.phys_addr, "Record/Report sample physi= cal addresses"), + OPT_BOOLEAN(0, "data-page-size", &mem.data_page_size, "Record/Report samp= le data address page size"), + OPT_END() + }; + const struct option record_options[] =3D { + OPT_CALLBACK('e', "event", &mem, "event", + "event selector. use 'perf mem record -e list' to list available ev= ents", + parse_record_events), + OPT_UINTEGER(0, "ldlat", &perf_mem_events__loads_ldlat, "mem-loads latenc= y"), + OPT_BOOLEAN('U', "all-user", &mem.all_user, "collect only user level data= "), + OPT_BOOLEAN('K', "all-kernel", &mem.all_kernel, "collect only kernel leve= l data"), + OPT_PARENT(mem_options) + }; + const struct option report_options[] =3D { OPT_BOOLEAN('D', "dump-raw-samples", &mem.dump_raw, "dump raw samples in ASCII"), OPT_BOOLEAN('U', "hide-unresolved", &mem.hide_unresolved, "Only display entries resolved to a symbol"), OPT_STRING('i', "input", &input_name, "file", "input file name"), - OPT_STRING('C', "cpu", &mem.cpu_list, "cpu", - "list of cpus to profile"), OPT_STRING_NOEMPTY('x', "field-separator", &symbol_conf.field_sep, "separator", "separator for columns, no spaces will be added" " between columns '.' is reserved."), - OPT_BOOLEAN('f', "force", &mem.force, "don't complain, do it"), - OPT_BOOLEAN('p', "phys-data", &mem.phys_addr, "Record/Report sample physi= cal addresses"), - OPT_BOOLEAN(0, "data-page-size", &mem.data_page_size, "Record/Report samp= le data address page size"), - OPT_END() + OPT_PARENT(mem_options) }; const char *const mem_subcommands[] =3D { "record", "report", NULL }; const char *mem_usage[] =3D { @@ -499,7 +510,7 @@ int cmd_mem(int argc, const char **argv) }; =20 argc =3D parse_options_subcommand(argc, argv, mem_options, mem_subcommand= s, - mem_usage, PARSE_OPT_KEEP_UNKNOWN); + mem_usage, PARSE_OPT_STOP_AT_NON_OPTION); =20 if (!argc || !(strncmp(argv[0], "rec", 3) || mem.operation)) usage_with_options(mem_usage, mem_options); @@ -512,9 +523,9 @@ int cmd_mem(int argc, const char **argv) } =20 if (strlen(argv[0]) > 2 && strstarts("record", argv[0])) - return __cmd_record(argc, argv, &mem); + return __cmd_record(argc, argv, &mem, record_options); else if (strlen(argv[0]) > 2 && strstarts("report", argv[0])) - return report_events(argc, argv, &mem); + return __cmd_report(argc, argv, &mem, report_options); else usage_with_options(mem_usage, mem_options); =20 --=20 2.46.0.rc1.232.g9752f9e123-goog From nobody Sun Feb 8 03:57:08 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DA48B16EB57; Wed, 31 Jul 2024 23:55:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722470108; cv=none; b=d0h+V7xYkHI27lUHeYfVFeixwAZ+rhkYt260oD7Z2sDqUHLidYLhU/vwFxGrGYvVBg6N7VFtL7EI2GmR3ogc8d5r/sk01G39JX7zWSf244Bl9U9q8OE5z4oOzmng9egcw6oOO5g97pzWMXG1C+xiVWVgbi6jL8nSKsuKrvp2GQM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722470108; c=relaxed/simple; bh=Dfzv4j/8Hd+vCw26hzqNqBmXI1ENVx0lDrBXK1X327E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DEiUDZoELzvg+jMiMks3pdRorbkd0lRwDXhJosni0tBTA5zc34b6RYCJwVRcO//yNU2GWI1dWUx7QfRckDZEEjL6EHx9ZG/7nNiFvkykqbn0G5r/v3+B7o7vEZfJH0Ps/AwWZ1dKWdASPQISTAsA8zGA+rWTjgD5qEZrp/H63Y8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cDhUJfW8; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="cDhUJfW8" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1D269C4AF12; Wed, 31 Jul 2024 23:55:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722470108; bh=Dfzv4j/8Hd+vCw26hzqNqBmXI1ENVx0lDrBXK1X327E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cDhUJfW8ETB60uj1pqk3jjWceMzyTk2i9EOhXztQcQMUfk9Vy9qP+emEadM07zAP8 HH7RLcfB7eW6v1C7TalZ87mNkRhZwzIgNg/ORBN0/WRDuTo3HzjOdIW3/rhhpuZkG4 +DudxBuCBKIeIXs8g/oR+aQBiPU/Am9IuJRH1qwaSBiJiqwgVeSBtlcQUIzz/EkvYg wnuC3fkexDiwVpFeecepMsvh2XJiakr54LDsSa+OvkCnxfkxB8fPWR+2V8UbrByl1/ dT8IjOKBogaRZauH+a0pwsWT5J0QsTbug0SNp7ZZBFec+8HoDfU2NRks6IMdR/qkFL 4pWB9Yj0769Qw== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org, Stephane Eranian , Athira Rajeev Subject: [PATCH 4/6] perf tools: Add mode argument to sort_help() Date: Wed, 31 Jul 2024 16:55:03 -0700 Message-ID: <20240731235505.710436-5-namhyung@kernel.org> X-Mailer: git-send-email 2.46.0.rc1.232.g9752f9e123-goog In-Reply-To: <20240731235505.710436-1-namhyung@kernel.org> References: <20240731235505.710436-1-namhyung@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Some sort keys are meaningful only in a specific mode - like branch stack and memory (data-src). Add the mode to skip unnecessary ones. This will be used for 'perf mem report' later. While at it, change the prefix for the -F/--fields option to remove the duplicate part. Before: $ perf report -F Error: switch `F' requires a value Usage: perf report [] -F, --fields output field(s): overhead period sample overhead overhead_sys overhead_us overhead_guest_sys overhead_guest_us overhead_children sample period weight1 weight2 weight3 ins_lat retire_lat ... After: $ perf report -F Error: switch `F' requires a value Usage: perf report [] -F, --fields output field(s): overhead overhead_sys overhead_us overhead_guest_sys overhead_guest_us overhead_children sample period weight1 weight2 weight3 ins_lat retire_lat ... Signed-off-by: Namhyung Kim --- tools/perf/builtin-report.c | 4 ++-- tools/perf/util/sort.c | 12 +++++++----- tools/perf/util/sort.h | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 6edc0d4ce6fb..930052961c1a 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -1301,8 +1301,8 @@ int cmd_report(int argc, const char **argv) .socket_filter =3D -1, .skip_empty =3D true, }; - char *sort_order_help =3D sort_help("sort by key(s):"); - char *field_order_help =3D sort_help("output field(s): overhead period sa= mple "); + char *sort_order_help =3D sort_help("sort by key(s):", SORT_MODE__NORMAL); + char *field_order_help =3D sort_help("output field(s):", SORT_MODE__NORMA= L); const char *disassembler_style =3D NULL, *objdump_path =3D NULL, *addr2li= ne_path =3D NULL; const struct option options[] =3D { OPT_STRING('i', "input", &input_name, "file", diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index ab7c7ff35f9b..c4046d5d1749 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c @@ -3960,7 +3960,7 @@ static void add_hpp_sort_string(struct strbuf *sb, st= ruct hpp_dimension *s, int add_key(sb, s[i].name, llen); } =20 -char *sort_help(const char *prefix) +char *sort_help(const char *prefix, enum sort_mode mode) { struct strbuf sb; char *s; @@ -3972,10 +3972,12 @@ char *sort_help(const char *prefix) ARRAY_SIZE(hpp_sort_dimensions), &len); add_sort_string(&sb, common_sort_dimensions, ARRAY_SIZE(common_sort_dimensions), &len); - add_sort_string(&sb, bstack_sort_dimensions, - ARRAY_SIZE(bstack_sort_dimensions), &len); - add_sort_string(&sb, memory_sort_dimensions, - ARRAY_SIZE(memory_sort_dimensions), &len); + if (mode =3D=3D SORT_MODE__NORMAL || mode =3D=3D SORT_MODE__BRANCH) + add_sort_string(&sb, bstack_sort_dimensions, + ARRAY_SIZE(bstack_sort_dimensions), &len); + if (mode =3D=3D SORT_MODE__NORMAL || mode =3D=3D SORT_MODE__MEMORY) + add_sort_string(&sb, memory_sort_dimensions, + ARRAY_SIZE(memory_sort_dimensions), &len); s =3D strbuf_detach(&sb, NULL); strbuf_release(&sb); return s; diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h index 0bd0ee3ae76b..6357bc32c5ca 100644 --- a/tools/perf/util/sort.h +++ b/tools/perf/util/sort.h @@ -130,7 +130,7 @@ void reset_output_field(void); void sort__setup_elide(FILE *fp); void perf_hpp__set_elide(int idx, bool elide); =20 -char *sort_help(const char *prefix); +char *sort_help(const char *prefix, enum sort_mode mode); =20 int report_parse_ignore_callees_opt(const struct option *opt, const char *= arg, int unset); =20 --=20 2.46.0.rc1.232.g9752f9e123-goog From nobody Sun Feb 8 03:57:08 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1C47E16EB6F; Wed, 31 Jul 2024 23:55:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722470109; cv=none; b=qXHGN2LYbYnzLSLsbnqmXR0p1eJzDXu1DHwxpFxE19IxvVDU8bNTEmc6TXI6WzOSfvJGsL5XegOzCndcTNC2RkmgrwbbyC37YZscu6McDUafMp1ra5OoXH0sYQPiykHC/EhrQ+z2Gl/aWSD5pgJ2E7PAwhoJ6kWWvv4ON8aGfko= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722470109; c=relaxed/simple; bh=Nt8bzaBEKnKY7ibLeGPc+4KHENLftiNUZpsx2dBIThk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=a4oG7JxZlwFxninNW/anwDJHaC+eYX3Sz2PKCUMiO0Bw4Sth+X7pcZC+FeHejmh0eE5uRGo5wMZ4EM3tnnJPAcuK32Wx4mDyXz8Or5uYkDSVyS61Q4DV/mdJsscnUIVBxIGzkLgTv7kwUguagjqv2BA5/SwsQWpDs/Nxg7s4Q0w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=IcKLKHAe; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="IcKLKHAe" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9A85DC4AF0F; Wed, 31 Jul 2024 23:55:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722470109; bh=Nt8bzaBEKnKY7ibLeGPc+4KHENLftiNUZpsx2dBIThk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=IcKLKHAetY4RuxidTZEmhKt0NAD8Ax8THcRA7FEhCo7eoku5Ku5UOG9bUzvhYlF2B Vag236IHEKgu71lY7VAzk0p9ynfYzqGfoyOTauQgnxuZdN6UGe8/2GS2t4dVP1KZfi +ucCPH9eMC7g2VQWbsyh/3eLUIJgPtNrrPdpJPiqqeyXRh0aeRw5sxVC1cad+k2HE+ kLUhKvDDKS9JyVI1zHEfILwhiKxTIUX3nRXvulp8z6x4iXuiUR7kGdArvDroLvLwiy 4ua0aEKDzR7BHATIKFiwDRMOD795KfIjmEy9xVN8MqMjnDaD7vZRQ+plsasHkC0VdU CnxNcKQSwVgEQ== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org, Stephane Eranian , Athira Rajeev Subject: [PATCH 5/6] perf mem: Add -s/--sort option Date: Wed, 31 Jul 2024 16:55:04 -0700 Message-ID: <20240731235505.710436-6-namhyung@kernel.org> X-Mailer: git-send-email 2.46.0.rc1.232.g9752f9e123-goog In-Reply-To: <20240731235505.710436-1-namhyung@kernel.org> References: <20240731235505.710436-1-namhyung@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" So that users can set the sort key manually as they want. $ perf mem report -s Error: switch `s' requires a value Usage: perf mem report [] -s, --sort sort by key(s): overhead overhead_sys overhead_us= overhead_guest_sys overhead_guest_us overhead_children sample period weight1 weight2 weight3 ins_lat retire_lat p_stage_cyc pid comm dso symbol parent cpu socket srcline srcfile local_weight weight transaction trace symbol_size dso_size cgroup cgroup_id ipc_null time code_page_size local_ins_lat ins_lat local_p_stage_cyc p_stage_cyc addr local_retire_lat retire_lat simd type typeoff symoff symbol_daddr dso_daddr locked tlb mem snoop dcacheline symbol_iaddr phys_daddr data_page_size blocked Signed-off-by: Namhyung Kim --- tools/perf/builtin-mem.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c index 819edaf6b1df..24a4f0084f49 100644 --- a/tools/perf/builtin-mem.c +++ b/tools/perf/builtin-mem.c @@ -19,6 +19,7 @@ #include "util/symbol.h" #include "util/pmus.h" #include "util/sample.h" +#include "util/sort.h" #include "util/string2.h" #include "util/util.h" #include @@ -28,7 +29,8 @@ =20 struct perf_mem { struct perf_tool tool; - char const *input_name; + const char *input_name; + const char *sort_key; bool hide_unresolved; bool dump_raw; bool force; @@ -313,11 +315,13 @@ static char *get_sort_order(struct perf_mem *mem) bool has_extra_options =3D (mem->phys_addr | mem->data_page_size) ? true = : false; char sort[128]; =20 + if (mem->sort_key) + scnprintf(sort, sizeof(sort), "--sort=3D%s", mem->sort_key); /* * there is no weight (cost) associated with stores, so don't print * the column */ - if (!(mem->operation & MEM_OPERATION_LOAD)) { + else if (!(mem->operation & MEM_OPERATION_LOAD)) { strcpy(sort, "--sort=3Dmem,sym,dso,symbol_daddr," "dso_daddr,tlb,locked"); } else if (has_extra_options) { @@ -468,6 +472,7 @@ int cmd_mem(int argc, const char **argv) */ .operation =3D MEM_OPERATION_LOAD | MEM_OPERATION_STORE, }; + char *sort_order_help =3D sort_help("sort by key(s):", SORT_MODE__MEMORY); const struct option mem_options[] =3D { OPT_CALLBACK('t', "type", &mem.operation, "type", "memory operations(load,store) Default load,store", @@ -501,6 +506,8 @@ int cmd_mem(int argc, const char **argv) "separator", "separator for columns, no spaces will be added" " between columns '.' is reserved."), + OPT_STRING('s', "sort", &mem.sort_key, "key[,key2...]", + sort_order_help), OPT_PARENT(mem_options) }; const char *const mem_subcommands[] =3D { "record", "report", NULL }; --=20 2.46.0.rc1.232.g9752f9e123-goog From nobody Sun Feb 8 03:57:08 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A593016EC06; Wed, 31 Jul 2024 23:55:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722470109; cv=none; b=as7Tbft8dnawUVowcWN0+O1sSamurO9cWIo+D/0jnoVefW1IkZWBMURW1FYlvWEiQleB66Nm8xlNCbbMMh9QqUs0X6FsSaJcrDrIWliJbpIGxa3NqdUlZTjtv3cKWaS0lCb5vsnGoxoBmI4TG/HTCoahbYaP9r0q6/vP3KXYRGs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722470109; c=relaxed/simple; bh=hLDVUUQ8aoLWqfdvlHVB0OV5dix+CmkyyetPRs7HfM0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rzBDImni1BNoD1HRnVB16Ala4hUUUe8CTKek3z+JZ0OTCfzQCIc6UowdvAZLRbfHAIS5dipDuTOOEzKGaqb4HprVpXyN74NinAP2k2jWMnukALQzzglYCq9cbilKjEBfxvjOzRnZ7KKXQ0VQ7oH3Mrx4l7L+7zyK3QyM88WUmMU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PGcOLNyh; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="PGcOLNyh" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 23C76C4AF11; Wed, 31 Jul 2024 23:55:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722470109; bh=hLDVUUQ8aoLWqfdvlHVB0OV5dix+CmkyyetPRs7HfM0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PGcOLNyhv6EQ3gMqDkSecsS//k5rPTs9AO1wjaDnJ5ken/WEjm8uXU0Q8EvKb3kGg WCDRr/xAxLfDUhYFlZpju5fTFNAfC6Vx1K4Y+rUhLax6X0mZmIgzL9u3TD279X+hfc N0tRDrKmccyBhqXRk4C8pLy+aXVI35nIiRfMpzCdAt8ONszKbKPVutdtEreSdDpq5H MWxEaDwcaxFZ5N1INciFr2DDBI1Qb4kO8/VSDY/j9RXMxfnBpjuTdWT4rf+wYb190k vkOJqcjaNty3wtaM/11y12av22xnAbDh/+/lrqnraWspOlhy1I0v+NUsSuLPm7b52O A9RrIVcdDn1ZA== From: Namhyung Kim To: Arnaldo Carvalho de Melo , Ian Rogers , Kan Liang Cc: Jiri Olsa , Adrian Hunter , Peter Zijlstra , Ingo Molnar , LKML , linux-perf-users@vger.kernel.org, Stephane Eranian , Athira Rajeev Subject: [PATCH 6/6] perf mem: Add -T/--data-type option to report subcommand Date: Wed, 31 Jul 2024 16:55:05 -0700 Message-ID: <20240731235505.710436-7-namhyung@kernel.org> X-Mailer: git-send-email 2.46.0.rc1.232.g9752f9e123-goog In-Reply-To: <20240731235505.710436-1-namhyung@kernel.org> References: <20240731235505.710436-1-namhyung@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This is just a shortcut to have 'type' in the sort key and use more compact output format like below. $ perf mem report -T ... # # Overhead Samples Memory access Snoop = TLB access Data Type # ........ ............ ....................................... ......= ...... ...................... ......... # 14.84% 22 L1 hit None = L1 or L2 hit (unknown) 7.68% 8 LFB/MAB hit None = L1 or L2 hit (unknown) 7.17% 3 RAM hit Hit = L2 miss (unknown) 6.29% 12 L1 hit None = L1 or L2 hit (stack operation) 4.85% 5 RAM hit Hit = L1 or L2 hit (unknown) 3.97% 5 LFB/MAB hit None = L1 or L2 hit struct psi_group_cpu 3.18% 3 LFB/MAB hit None = L1 or L2 hit (stack operation) 2.58% 3 L1 hit None = L1 or L2 hit unsigned int 2.36% 2 L1 hit None = L1 or L2 hit struct 2.31% 2 L1 hit None = L1 or L2 hit struct psi_group_cpu ... Users also can use their own sort keys and -T option makes sure it has the 'type' sort key at the end. $ perf mem report -T -s mem Signed-off-by: Namhyung Kim --- tools/perf/builtin-mem.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tools/perf/builtin-mem.c b/tools/perf/builtin-mem.c index 24a4f0084f49..efa700d14c98 100644 --- a/tools/perf/builtin-mem.c +++ b/tools/perf/builtin-mem.c @@ -38,6 +38,7 @@ struct perf_mem { bool data_page_size; bool all_kernel; bool all_user; + bool data_type; int operation; const char *cpu_list; DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS); @@ -317,6 +318,8 @@ static char *get_sort_order(struct perf_mem *mem) =20 if (mem->sort_key) scnprintf(sort, sizeof(sort), "--sort=3D%s", mem->sort_key); + else if (mem->data_type) + strcpy(sort, "--sort=3Dmem,snoop,tlb,type"); /* * there is no weight (cost) associated with stores, so don't print * the column @@ -336,6 +339,10 @@ static char *get_sort_order(struct perf_mem *mem) if (mem->data_page_size) strcat(sort, ",data_page_size"); =20 + /* make sure it has 'type' sort key even -s option is used */ + if (mem->data_type && !strstr(sort, "type")) + strcat(sort, ",type"); + return strdup(sort); } =20 @@ -508,6 +515,8 @@ int cmd_mem(int argc, const char **argv) " between columns '.' is reserved."), OPT_STRING('s', "sort", &mem.sort_key, "key[,key2...]", sort_order_help), + OPT_BOOLEAN('T', "type-profile", &mem.data_type, + "Show data-type profile result"), OPT_PARENT(mem_options) }; const char *const mem_subcommands[] =3D { "record", "report", NULL }; --=20 2.46.0.rc1.232.g9752f9e123-goog