perf sched: Fixes for thread safety analysis
Add annotations to describe lock behavior. Add unlocks so that mutexes aren't conditionally held on exit from perf_sched__replay. Add an exit variable so that thread_func can terminate, rather than leaving the threads blocked on mutexes. Signed-off-by: Ian Rogers <irogers@google.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Alexandre Truong <alexandre.truong@arm.com> Cc: Alexey Bayduraev <alexey.v.bayduraev@linux.intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Andres Freund <andres@anarazel.de> Cc: Andrii Nakryiko <andrii@kernel.org> Cc: André Almeida <andrealmeid@igalia.com> Cc: Athira Jajeev <atrajeev@linux.vnet.ibm.com> Cc: Christophe JAILLET <christophe.jaillet@wanadoo.fr> Cc: Colin Ian King <colin.king@intel.com> Cc: Dario Petrillo <dario.pk1@gmail.com> Cc: Darren Hart <dvhart@infradead.org> Cc: Dave Marchevsky <davemarchevsky@fb.com> Cc: Davidlohr Bueso <dave@stgolabs.net> Cc: Fangrui Song <maskray@google.com> Cc: Hewenliang <hewenliang4@huawei.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: James Clark <james.clark@arm.com> Cc: Jason Wang <wangborong@cdjrlc.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Kajol Jain <kjain@linux.ibm.com> Cc: Kim Phillips <kim.phillips@amd.com> Cc: Leo Yan <leo.yan@linaro.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Martin Liška <mliska@suse.cz> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Nathan Chancellor <nathan@kernel.org> Cc: Nick Desaulniers <ndesaulniers@google.com> Cc: Pavithra Gurushankar <gpavithrasha@gmail.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Quentin Monnet <quentin@isovalent.com> Cc: Ravi Bangoria <ravi.bangoria@amd.com> Cc: Remi Bernon <rbernon@codeweavers.com> Cc: Riccardo Mancini <rickyman7@gmail.com> Cc: Song Liu <songliubraving@fb.com> Cc: Stephane Eranian <eranian@google.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Thomas Richter <tmricht@linux.ibm.com> Cc: Tom Rix <trix@redhat.com> Cc: Weiguo Li <liwg06@foxmail.com> Cc: Wenyu Liu <liuwenyu7@huawei.com> Cc: William Cohen <wcohen@redhat.com> Cc: Zechuan Chen <chenzechuan1@huawei.com> Cc: bpf@vger.kernel.org Cc: llvm@lists.linux.dev Cc: yaowenbin <yaowenbin1@huawei.com> Link: https://lore.kernel.org/r/20220826164242.43412-17-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
bfa339ceda
commit
59c2666049
@ -246,6 +246,7 @@ struct perf_sched {
|
||||
const char *time_str;
|
||||
struct perf_time_interval ptime;
|
||||
struct perf_time_interval hist_time;
|
||||
volatile bool thread_funcs_exit;
|
||||
};
|
||||
|
||||
/* per thread run time data */
|
||||
@ -633,31 +634,34 @@ static void *thread_func(void *ctx)
|
||||
prctl(PR_SET_NAME, comm2);
|
||||
if (fd < 0)
|
||||
return NULL;
|
||||
again:
|
||||
ret = sem_post(&this_task->ready_for_work);
|
||||
BUG_ON(ret);
|
||||
mutex_lock(&sched->start_work_mutex);
|
||||
mutex_unlock(&sched->start_work_mutex);
|
||||
|
||||
cpu_usage_0 = get_cpu_usage_nsec_self(fd);
|
||||
while (!sched->thread_funcs_exit) {
|
||||
ret = sem_post(&this_task->ready_for_work);
|
||||
BUG_ON(ret);
|
||||
mutex_lock(&sched->start_work_mutex);
|
||||
mutex_unlock(&sched->start_work_mutex);
|
||||
|
||||
for (i = 0; i < this_task->nr_events; i++) {
|
||||
this_task->curr_event = i;
|
||||
perf_sched__process_event(sched, this_task->atoms[i]);
|
||||
cpu_usage_0 = get_cpu_usage_nsec_self(fd);
|
||||
|
||||
for (i = 0; i < this_task->nr_events; i++) {
|
||||
this_task->curr_event = i;
|
||||
perf_sched__process_event(sched, this_task->atoms[i]);
|
||||
}
|
||||
|
||||
cpu_usage_1 = get_cpu_usage_nsec_self(fd);
|
||||
this_task->cpu_usage = cpu_usage_1 - cpu_usage_0;
|
||||
ret = sem_post(&this_task->work_done_sem);
|
||||
BUG_ON(ret);
|
||||
|
||||
mutex_lock(&sched->work_done_wait_mutex);
|
||||
mutex_unlock(&sched->work_done_wait_mutex);
|
||||
}
|
||||
|
||||
cpu_usage_1 = get_cpu_usage_nsec_self(fd);
|
||||
this_task->cpu_usage = cpu_usage_1 - cpu_usage_0;
|
||||
ret = sem_post(&this_task->work_done_sem);
|
||||
BUG_ON(ret);
|
||||
|
||||
mutex_lock(&sched->work_done_wait_mutex);
|
||||
mutex_unlock(&sched->work_done_wait_mutex);
|
||||
|
||||
goto again;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void create_tasks(struct perf_sched *sched)
|
||||
EXCLUSIVE_LOCK_FUNCTION(sched->start_work_mutex)
|
||||
EXCLUSIVE_LOCK_FUNCTION(sched->work_done_wait_mutex)
|
||||
{
|
||||
struct task_desc *task;
|
||||
pthread_attr_t attr;
|
||||
@ -687,6 +691,8 @@ static void create_tasks(struct perf_sched *sched)
|
||||
}
|
||||
|
||||
static void wait_for_tasks(struct perf_sched *sched)
|
||||
EXCLUSIVE_LOCKS_REQUIRED(sched->work_done_wait_mutex)
|
||||
EXCLUSIVE_LOCKS_REQUIRED(sched->start_work_mutex)
|
||||
{
|
||||
u64 cpu_usage_0, cpu_usage_1;
|
||||
struct task_desc *task;
|
||||
@ -738,6 +744,8 @@ static void wait_for_tasks(struct perf_sched *sched)
|
||||
}
|
||||
|
||||
static void run_one_test(struct perf_sched *sched)
|
||||
EXCLUSIVE_LOCKS_REQUIRED(sched->work_done_wait_mutex)
|
||||
EXCLUSIVE_LOCKS_REQUIRED(sched->start_work_mutex)
|
||||
{
|
||||
u64 T0, T1, delta, avg_delta, fluct;
|
||||
|
||||
@ -3309,11 +3317,15 @@ static int perf_sched__replay(struct perf_sched *sched)
|
||||
print_task_traces(sched);
|
||||
add_cross_task_wakeups(sched);
|
||||
|
||||
sched->thread_funcs_exit = false;
|
||||
create_tasks(sched);
|
||||
printf("------------------------------------------------------------\n");
|
||||
for (i = 0; i < sched->replay_repeat; i++)
|
||||
run_one_test(sched);
|
||||
|
||||
sched->thread_funcs_exit = true;
|
||||
mutex_unlock(&sched->start_work_mutex);
|
||||
mutex_unlock(&sched->work_done_wait_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user