Replace 'pid_t owner' with 'struct perf_event *event' in struct gtrace_path. This allows component drivers to directly access the perf_event for PMU configuration.
Signed-off-by: Zane Leung liangzhen@linux.spacemit.com --- drivers/hwtracing/gtrace/gtrace-core.c | 12 ++++++++++-- drivers/hwtracing/gtrace/gtrace-perf.c | 2 +- include/linux/gtrace.h | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/drivers/hwtracing/gtrace/gtrace-core.c b/drivers/hwtracing/gtrace/gtrace-core.c index cae0a7fa820f..3f55d8b7302d 100644 --- a/drivers/hwtracing/gtrace/gtrace-core.c +++ b/drivers/hwtracing/gtrace/gtrace-core.c @@ -13,6 +13,7 @@ #include <linux/spinlock.h> #include <linux/xarray.h> #include <linux/gtrace.h> +#include <linux/perf_event.h>
#define GTRACE_POLL_TIMEOUT_US_DEFAULT 10
@@ -665,10 +666,16 @@ static int __gtrace_comp_start(struct gtrace_component *comp,
raw_spin_lock_irqsave(&cpriv->lock, flags); if (cpriv->start_count) { - if (cpriv->owner != path->owner || cpriv->mode != path->mode) { + if (cpriv->mode != path->mode) { ret = -EBUSY; goto out; } + if (cpriv->mode == GTRACE_COMPONENT_MODE_PERF) { + if (cpriv->owner != task_pid_nr(path->event->owner)) { + ret = -EBUSY; + goto out; + } + } } else { if (gtdrv->start) { comp->path = path; @@ -678,8 +685,9 @@ static int __gtrace_comp_start(struct gtrace_component *comp, goto out; } } - cpriv->owner = path->owner; cpriv->mode = path->mode; + if (cpriv->mode == GTRACE_COMPONENT_MODE_PERF) + cpriv->owner = task_pid_nr(path->event->owner); }
cpriv->start_count++; diff --git a/drivers/hwtracing/gtrace/gtrace-perf.c b/drivers/hwtracing/gtrace/gtrace-perf.c index 703c12b95665..2fcfbae9acf6 100644 --- a/drivers/hwtracing/gtrace/gtrace-perf.c +++ b/drivers/hwtracing/gtrace/gtrace-perf.c @@ -137,7 +137,7 @@ static void *gtrace_setup_aux(struct perf_event *event, void **pages, continue; }
- path->owner = task_pid_nr(event->owner); + path->event = event; *gtrace_event_cpu_path_ptr(event_data, cpu) = path; }
diff --git a/include/linux/gtrace.h b/include/linux/gtrace.h index 76b1aa9cfe79..3d769b405030 100644 --- a/include/linux/gtrace.h +++ b/include/linux/gtrace.h @@ -325,7 +325,7 @@ struct gtrace_path { enum gtrace_component_mode mode; u32 trace_id; #define GTRACE_INVALID_TRACE_ID 0 - pid_t owner; + struct perf_event *event; };
struct gtrace_component *gtrace_path_source(struct gtrace_path *path);