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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.