Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp21624432ybl; Mon, 6 Jan 2020 08:10:01 -0800 (PST) X-Google-Smtp-Source: APXvYqwGx5pkXEpH7RskVXsS+7VCNHvZUHbcMh5rw0qJZjxpPcuk3Vor3lMg/UhJ4IeUd46KIbxX X-Received: by 2002:a05:6830:4d9:: with SMTP id s25mr116552266otd.171.1578327001296; Mon, 06 Jan 2020 08:10:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1578327001; cv=none; d=google.com; s=arc-20160816; b=HS3FgS/VpRcvWCRin5TFHWQgTKbJoCqTKZ6nBQPMOmTfsnU3ZrmODQy5CPRYT6suuH Rk0lNG7bvYAqmGMoAYQKMraq7FzSP2DJPe0pG5mPTgiJs99sF1sDke5+YxE3n9Vxg3IS WP5HNCK19GaoUmBPqW2JlY5qP4x0IN6+ms2FVnntyWQJ5C+Br2XbsW9fskFcVw8Xsvky fIMhl/MlKW18+3E7NwXLkiunP+/lCfB78wgj1VFwUomBOcy1s5IqVaBeL0QCd8wroCnT FgSoK0Dbw6D+BpC+cFlFmIXt4wVAzgTYQUzgwvaz7dQTGke13mjsKnrV7zYHlCXZc5oo x6zw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=6XjRe5t85ZMxoOR4Jb++ELLMapwN2UyvqwXFG+N3bPo=; b=F8KAtZ806O9PIjKEj725gddUjksgGIQGQb34lJ2TnEXtzCVH+a+DS7Y4ed4OC10wmX HRUFiKVpNTxtmm+jEZaKTSPKrJYve4Olo7gNcU77L3515mIUA4bOX6kr3kd+Qtn0T0+g pMaPuCOjvvhEwirE9RraN5sidAr+nhuZlHfR9aJ5lVhdlDhmerivE0BdAoFVXyvgDrTc 6pjpeOvUjh6Y5+K5TQEF02V3YqIOAaWKJWSuoCJO2MlsThspjQP1d+EtH1q7+Pc/tSWy LtWAcpz5mSNEhw22Hz9iO3w0p6YxlFtmRqbIixhQO1A10ApGeWsruIPJ1q1HSAyLlta6 54GQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=FUVFXVj4; 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=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c10si7925394otj.260.2020.01.06.08.09.48; Mon, 06 Jan 2020 08:10:01 -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=@kernel.org header.s=default header.b=FUVFXVj4; 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=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727196AbgAFQID (ORCPT + 99 others); Mon, 6 Jan 2020 11:08:03 -0500 Received: from mail.kernel.org ([198.145.29.99]:46178 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727165AbgAFQH7 (ORCPT ); Mon, 6 Jan 2020 11:07:59 -0500 Received: from quaco.ghostprotocols.net (unknown [179.97.35.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 2D9F12081E; Mon, 6 Jan 2020 16:07:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1578326879; bh=hgaHiT4Crc/EJVHqxNiiiW60LLA6D9fq4ygzo1r7s/s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FUVFXVj4uAn56hVvm8EpFEEQYRr0xGgC6Z4xCKD+C67Wk/C8288Y+OIdKWDuaU4Nu oGI9XROpqFbBj9kDimVSqv6BxFqxtTx+jXrrOF+3Ubx4krnXFdFi12+m7c6e+L658A aD497BuJGaVLXsdyUUm6vXxi2QOl9XoDqtnHEduo= From: Arnaldo Carvalho de Melo To: Ingo Molnar , Thomas Gleixner Cc: Jiri Olsa , Namhyung Kim , Clark Williams , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Arnaldo Carvalho de Melo , Adrian Hunter , Andi Kleen , Jin Yao , Kan Liang , Linus Torvalds Subject: [PATCH 12/20] perf report/top: Improve toggle callchain menu option Date: Mon, 6 Jan 2020 13:06:57 -0300 Message-Id: <20200106160705.10899-13-acme@kernel.org> X-Mailer: git-send-email 2.21.1 In-Reply-To: <20200106160705.10899-1-acme@kernel.org> References: <20200106160705.10899-1-acme@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Arnaldo Carvalho de Melo Taking into account the current status of the callchain, i.e. if folded, show "Expand", otherwise "Collapse", also show the name of the entry that will be affected and mention the hotkeys for expanding/collapsing all callchains below the main entry, the one that appears with/without callchains. Reviewed-by: Jiri Olsa Cc: Adrian Hunter Cc: Andi Kleen Cc: Jin Yao Cc: Kan Liang Cc: Linus Torvalds Cc: Namhyung Kim Link: https://lkml.kernel.org/n/tip-03arm6poo8463k5tfcfp7gkk@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/ui/browsers/hists.c | 54 ++++++++++++++++++++++++++++++++-- tools/perf/util/sort.c | 3 +- tools/perf/util/sort.h | 2 ++ 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index 1b5a5990dddb..a4413d983216 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c @@ -391,6 +391,52 @@ static void hist_entry__init_have_children(struct hist_entry *he) he->init_have_children = true; } +static bool hist_browser__selection_has_children(struct hist_browser *browser) +{ + struct hist_entry *he = browser->he_selection; + struct map_symbol *ms = browser->selection; + + if (!he || !ms) + return false; + + if (ms == &he->ms) + return he->has_children; + + return container_of(ms, struct callchain_list, ms)->has_children; +} + +static bool hist_browser__selection_unfolded(struct hist_browser *browser) +{ + struct hist_entry *he = browser->he_selection; + struct map_symbol *ms = browser->selection; + + if (!he || !ms) + return false; + + if (ms == &he->ms) + return he->unfolded; + + return container_of(ms, struct callchain_list, ms)->unfolded; +} + +static char *hist_browser__selection_sym_name(struct hist_browser *browser, char *bf, size_t size) +{ + struct hist_entry *he = browser->he_selection; + struct map_symbol *ms = browser->selection; + struct callchain_list *callchain_entry; + + if (!he || !ms) + return NULL; + + if (ms == &he->ms) { + hist_entry__sym_snprintf(he, bf, size, 0); + return bf + 4; // skip the level, e.g. '[k] ' + } + + callchain_entry = container_of(ms, struct callchain_list, ms); + return callchain_list__sym_name(callchain_entry, bf, size, browser->show_dso); +} + static bool hist_browser__toggle_fold(struct hist_browser *browser) { struct hist_entry *he = browser->he_selection; @@ -2535,12 +2581,14 @@ static int do_toggle_callchain(struct hist_browser *browser, struct popup_action static int add_callchain_toggle_opt(struct hist_browser *browser, struct popup_action *act, char **optstr) { - struct hist_entry *he = browser->he_selection; + char sym_name[512]; - if (!he->has_children) + if (!hist_browser__selection_has_children(browser)) return 0; - if (asprintf(optstr, "Expand/Collapse callchain") < 0) + if (asprintf(optstr, "%s [%s] callchain (one level, same as '+' hotkey, use 'e'/'c' for the whole main level entry)", + hist_browser__selection_unfolded(browser) ? "Collapse" : "Expand", + hist_browser__selection_sym_name(browser, sym_name, sizeof(sym_name))) < 0) return 0; act->fn = do_toggle_callchain; diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index 9fcba2872130..ab0cfd790ad0 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c @@ -324,8 +324,7 @@ static int _hist_entry__sym_snprintf(struct map_symbol *ms, return ret; } -static int hist_entry__sym_snprintf(struct hist_entry *he, char *bf, - size_t size, unsigned int width) +int hist_entry__sym_snprintf(struct hist_entry *he, char *bf, size_t size, unsigned int width) { return _hist_entry__sym_snprintf(&he->ms, he->ip, he->level, bf, size, width); diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h index 5aff9542d9b7..6c862d62d052 100644 --- a/tools/perf/util/sort.h +++ b/tools/perf/util/sort.h @@ -164,6 +164,8 @@ static __pure inline bool hist_entry__has_callchains(struct hist_entry *he) return he->callchain_size != 0; } +int hist_entry__sym_snprintf(struct hist_entry *he, char *bf, size_t size, unsigned int width); + static inline bool hist_entry__has_pairs(struct hist_entry *he) { return !list_empty(&he->pairs.node); -- 2.21.1