From: Bjorn Andersson <bjorn.andersson@linaro.org>
To: Leonard Crestez <leonard.crestez@nxp.com>
Cc: Georgi Djakov <georgi.djakov@linaro.org>,
Chanwoo Choi <cw00.choi@samsung.com>,
Artur ??wigo?? <a.swigon@partner.samsung.com>,
Evan Green <evgreen@chromium.org>,
David Dai <daidavid1@codeaurora.org>,
Jordan Crouse <jcrouse@codeaurora.org>,
Viresh Kumar <viresh.kumar@linaro.org>,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
linux-arm-msm@vger.kernel.org, linux-pm@vger.kernel.org
Subject: Re: [PATCH RFC] interconnect: Add interconnect_graph file to debugfs
Date: Wed, 13 Nov 2019 19:49:58 -0800 [thread overview]
Message-ID: <20191114034958.GB21530@yoga> (raw)
In-Reply-To: <70f672b39780ba7387d15fd6485f94b75d47b1ec.1573692109.git.leonard.crestez@nxp.com>
On Wed 13 Nov 16:50 PST 2019, Leonard Crestez wrote:
> The interconnect graphs can be difficult to understand and the current
> "interconnect_summary" file doesn't even display links in any way.
>
> Add a new "interconnect_graph" file to debugfs in the graphviz "dot"
> format which describes interconnect providers, nodes and links.
>
> The file is human-readable and can be visualized by piping through
> graphviz. Example:
>
> ssh $TARGET cat /sys/kernel/debug/interconnect/interconnect_graph \
> | dot -Tsvg > interconnect_graph.svg
>
> Signed-off-by: Leonard Crestez <leonard.crestez@nxp.com>
Nice, I like it!
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Regards,
Bjorn
> ---
> drivers/interconnect/core.c | 66 +++++++++++++++++++++++++++++++++++++
> 1 file changed, 66 insertions(+)
>
> Example output as a github gist:
> https://gist.github.com/cdleonard/2f74a7efe74587e3d4b57cf7983b46a8
>
> The qcs404 driver was hacked to probe on imx, the links to "0" seem to
> from incorrect trailing 0s on DEFINE_QNODE. Possibly fallout from
> switching to ARRAY_SIZE(__VA_ARGS__)?
>
> I'm not sure that "graphviz" is allowed as an output format even in
> debugfs.
>
> diff --git a/drivers/interconnect/core.c b/drivers/interconnect/core.c
> index c498796adc07..07e91288c7f4 100644
> --- a/drivers/interconnect/core.c
> +++ b/drivers/interconnect/core.c
> @@ -92,10 +92,74 @@ static int icc_summary_show(struct seq_file *s, void *data)
>
> return 0;
> }
> DEFINE_SHOW_ATTRIBUTE(icc_summary);
>
> +static void icc_graph_show_link(struct seq_file *s, int level,
> + struct icc_node *n, struct icc_node *m)
> +{
> + seq_printf(s, "%s\"%d:%s\" -> \"%d:%s\"\n",
> + level == 2 ? "\t\t" : "\t",
> + n->id, n->name, m->id, m->name);
> +}
> +
> +static void icc_graph_show_node(struct seq_file *s, struct icc_node *n)
> +{
> + seq_printf(s, "\t\t\"%d:%s\" [label=\"%d:%s",
> + n->id, n->name, n->id, n->name);
> + seq_printf(s, "\n\t\t\t|avg_bw=%ukBps", n->avg_bw);
> + seq_printf(s, "\n\t\t\t|peak_bw=%ukBps", n->peak_bw);
> + seq_puts(s, "\"]\n");
> +}
> +
> +static int icc_graph_show(struct seq_file *s, void *data)
> +{
> + struct icc_provider *provider;
> + struct icc_node *n;
> + int cluster_index = 0;
> + int i;
> +
> + seq_puts(s, "digraph {\n\trankdir = LR\n\tnode [shape = record]\n");
> + mutex_lock(&icc_lock);
> +
> + /* draw providers as cluster subgraphs */
> + cluster_index = 0;
> + list_for_each_entry(provider, &icc_providers, provider_list) {
> + seq_printf(s, "\tsubgraph cluster_%d {\n", ++cluster_index);
> + if (provider->dev)
> + seq_printf(s, "\t\tlabel = \"%s\"\n",
> + dev_name(provider->dev));
> +
> + /* draw nodes */
> + list_for_each_entry(n, &provider->nodes, node_list)
> + icc_graph_show_node(s, n);
> +
> + /* draw internal links */
> + list_for_each_entry(n, &provider->nodes, node_list)
> + for (i = 0; i < n->num_links; ++i)
> + if (n->provider == n->links[i]->provider)
> + icc_graph_show_link(s, 2, n,
> + n->links[i]);
> +
> + seq_puts(s, "\t}\n");
> + }
> +
> + /* draw external links */
> + list_for_each_entry(provider, &icc_providers, provider_list)
> + list_for_each_entry(n, &provider->nodes, node_list)
> + for (i = 0; i < n->num_links; ++i)
> + if (n->provider != n->links[i]->provider)
> + icc_graph_show_link(s, 1, n,
> + n->links[i]);
> +
> + mutex_unlock(&icc_lock);
> + seq_puts(s, "}");
> +
> + return 0;
> +}
> +DEFINE_SHOW_ATTRIBUTE(icc_graph);
> +
> static struct icc_node *node_find(const int id)
> {
> return idr_find(&icc_idr, id);
> }
>
> @@ -800,10 +864,12 @@ EXPORT_SYMBOL_GPL(icc_provider_del);
> static int __init icc_init(void)
> {
> icc_debugfs_dir = debugfs_create_dir("interconnect", NULL);
> debugfs_create_file("interconnect_summary", 0444,
> icc_debugfs_dir, NULL, &icc_summary_fops);
> + debugfs_create_file("interconnect_graph", 0444,
> + icc_debugfs_dir, NULL, &icc_graph_fops);
> return 0;
> }
>
> static void __exit icc_exit(void)
> {
> --
> 2.17.1
>
prev parent reply other threads:[~2019-11-14 3:50 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-14 0:50 [PATCH RFC] interconnect: Add interconnect_graph file to debugfs Leonard Crestez
2019-11-14 2:41 ` Greg Kroah-Hartman
2019-11-14 17:20 ` Leonard Crestez
2019-11-14 3:49 ` Bjorn Andersson [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191114034958.GB21530@yoga \
--to=bjorn.andersson@linaro.org \
--cc=a.swigon@partner.samsung.com \
--cc=cw00.choi@samsung.com \
--cc=daidavid1@codeaurora.org \
--cc=evgreen@chromium.org \
--cc=georgi.djakov@linaro.org \
--cc=gregkh@linuxfoundation.org \
--cc=jcrouse@codeaurora.org \
--cc=leonard.crestez@nxp.com \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=rjw@rjwysocki.net \
--cc=viresh.kumar@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox