Moving the code of getting safely event's owner into perf_event_get_owner function, so it could be used in following change.
Cc: Alexander Yarygin <[email protected]> Cc: Arnaldo Carvalho de Melo <[email protected]> Cc: Corey Ashford <[email protected]> Cc: Frederic Weisbecker <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: Paul Mackerras <[email protected]> Cc: Peter Zijlstra <[email protected]> Signed-off-by: Jiri Olsa <[email protected]> --- include/linux/perf_event.h | 1 + kernel/events/core.c | 23 +++++++++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 707617a..ec6ef94 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -784,6 +784,7 @@ extern void perf_event_enable(struct perf_event *event); extern void perf_event_disable(struct perf_event *event); extern int __perf_event_disable(void *info); extern void perf_event_task_tick(void); +extern struct task_struct *perf_event_get_owner(struct perf_event *event); #else /* !CONFIG_PERF_EVENTS: */ static inline void perf_event_task_sched_in(struct task_struct *prev, diff --git a/kernel/events/core.c b/kernel/events/core.c index a36ebfe..faba9e0 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -3311,17 +3311,10 @@ static void free_event(struct perf_event *event) _free_event(event); } -/* - * Called when the last reference to the file is gone. - */ -static void put_event(struct perf_event *event) +struct task_struct *perf_event_get_owner(struct perf_event *event) { - struct perf_event_context *ctx = event->ctx; struct task_struct *owner; - if (!atomic_long_dec_and_test(&event->refcount)) - return; - rcu_read_lock(); owner = ACCESS_ONCE(event->owner); /* @@ -3340,7 +3333,21 @@ static void put_event(struct perf_event *event) get_task_struct(owner); } rcu_read_unlock(); + return owner; +} + +/* + * Called when the last reference to the file is gone. + */ +static void put_event(struct perf_event *event) +{ + struct perf_event_context *ctx = event->ctx; + struct task_struct *owner; + + if (!atomic_long_dec_and_test(&event->refcount)) + return; + owner = perf_event_get_owner(event); if (owner) { mutex_lock(&owner->perf_event_mutex); /* -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

