diff options
author | Namhyung Kim <namhyung@kernel.org> | 2022-09-08 15:54:48 -0700 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2022-10-04 08:55:21 -0300 |
commit | 165da80296ea6bc996eea4551026e39a0109f71e (patch) | |
tree | b4575599440c1a7ca114de23dacfcd12289455cf /tools/perf/builtin-sched.c | |
parent | c7202d20fb4584435ce2af5ef3a7a770f79ab59e (diff) | |
download | lwn-165da80296ea6bc996eea4551026e39a0109f71e.tar.gz lwn-165da80296ea6bc996eea4551026e39a0109f71e.zip |
perf sched: Factor out destroy_tasks()
Add destroy_tasks() as a counterpart of create_tasks() and put the
thread safety notations there. After join, it destroys semaphores too.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20220908225448.4105056-1-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/builtin-sched.c')
-rw-r--r-- | tools/perf/builtin-sched.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index a92610eac4bf..f93737eef07b 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -690,6 +690,27 @@ static void create_tasks(struct perf_sched *sched) } } +static void destroy_tasks(struct perf_sched *sched) + UNLOCK_FUNCTION(sched->start_work_mutex) + UNLOCK_FUNCTION(sched->work_done_wait_mutex) +{ + struct task_desc *task; + unsigned long i; + int err; + + mutex_unlock(&sched->start_work_mutex); + mutex_unlock(&sched->work_done_wait_mutex); + /* Get rid of threads so they won't be upset by mutex destrunction */ + for (i = 0; i < sched->nr_tasks; i++) { + task = sched->tasks[i]; + err = pthread_join(task->thread, NULL); + BUG_ON(err); + sem_destroy(&task->sleep_sem); + sem_destroy(&task->ready_for_work); + sem_destroy(&task->work_done_sem); + } +} + static void wait_for_tasks(struct perf_sched *sched) EXCLUSIVE_LOCKS_REQUIRED(sched->work_done_wait_mutex) EXCLUSIVE_LOCKS_REQUIRED(sched->start_work_mutex) @@ -3324,8 +3345,7 @@ static int perf_sched__replay(struct perf_sched *sched) run_one_test(sched); sched->thread_funcs_exit = true; - mutex_unlock(&sched->start_work_mutex); - mutex_unlock(&sched->work_done_wait_mutex); + destroy_tasks(sched); return 0; } |