[PATCH v5 05/14] gtrace: Add functions to start/stop tracing on a component path
Mayuresh Chitale <[email protected]>
| Newsgroups | org.infradead.lists.linux-riscv,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
The perf driver framework needs to be able to start / stop all components in a trace component path during its operation. Add gtrace_path_start() and gtrace_path_stop() functions for this purpose. Co-developed-by: Anup Patel <[email protected]> Signed-off-by: Anup Patel <[email protected]> Signed-off-by: Mayuresh Chitale <[email protected]> --- drivers/hwtracing/gtrace/gtrace-core.c | 44 ++++++++++++++++++++++++++ include/linux/gtrace.h | 6 ++++ 2 files changed, 50 insertions(+) diff --git a/drivers/hwtracing/gtrace/gtrace-core.c b/drivers/hwtracing/gtrace/gtrace-core.c index a89d195ab5b8..6ff1b3087947 100644 --- a/drivers/hwtracing/gtrace/gtrace-core.c +++ b/drivers/hwtracing/gtrace/gtrace-core.c @@ -582,6 +582,50 @@ static void gtrace_release_path_nodes(struct gtrace_path *path) } } +int gtrace_path_start(struct gtrace_path *path) +{ + const struct gtrace_driver *gtdrv; + struct gtrace_component *comp; + struct gtrace_path_node *node; + int ret; + + list_for_each_entry_reverse(node, &path->comp_list, head) { + comp = node->comp; + gtdrv = to_gtrace_driver(comp->dev.driver); + if (!gtdrv->start) + continue; + + ret = gtdrv->start(comp); + if (ret) + return ret; + } + + return 0; +} +EXPORT_SYMBOL_GPL(gtrace_path_start); + +int gtrace_path_stop(struct gtrace_path *path) +{ + const struct gtrace_driver *gtdrv; + struct gtrace_component *comp; + struct gtrace_path_node *node; + int ret; + + list_for_each_entry(node, &path->comp_list, head) { + comp = node->comp; + gtdrv = to_gtrace_driver(comp->dev.driver); + if (!gtdrv->stop) + continue; + + ret = gtdrv->stop(comp); + if (ret) + return ret; + } + + return 0; +} +EXPORT_SYMBOL_GPL(gtrace_path_stop); + struct gtrace_path *gtrace_create_path(struct gtrace_component *source, struct gtrace_component *sink, enum gtrace_component_mode mode) diff --git a/include/linux/gtrace.h b/include/linux/gtrace.h index b74d4b83b141..78e2ead3db8e 100644 --- a/include/linux/gtrace.h +++ b/include/linux/gtrace.h @@ -254,10 +254,14 @@ struct gtrace_path *gtrace_create_path(struct gtrace_component *source, struct gtrace_component *sink, enum gtrace_component_mode mode); void gtrace_destroy_path(struct gtrace_path *path); +int gtrace_path_start(struct gtrace_path *path); +int gtrace_path_stop(struct gtrace_path *path); /** * struct gtrace_driver - Representation of a trace driver. * @id_table: Table to match components handled by the driver. + * @start: Callback to start tracing. + * @stop: Callback to stop tracing. * @probe: Driver probe() function. * @remove: Driver remove() function. * @get_trace_id: Get/allocate a trace ID. @@ -266,6 +270,8 @@ void gtrace_destroy_path(struct gtrace_path *path); */ struct gtrace_driver { const struct gtrace_component_id *id_table; + int (*start)(struct gtrace_component *comp); + int (*stop)(struct gtrace_component *comp); int (*probe)(struct gtrace_component *comp); void (*remove)(struct gtrace_component *comp); int (*get_trace_id)(struct gtrace_component *comp, -- 2.43.0 _______________________________________________ linux-riscv mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-riscv