perf bench futex: Avoid memory leaks from pthread_attr
Remove code sharing the pthread_attr_t and initialize/destroy pthread_attr_t when needed. This avoids the same attribute being set that leak sanitizer reports as a memory leak. Signed-off-by: Ian Rogers <irogers@google.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: André Almeida <andrealmeid@igalia.com> Cc: Darren Hart <dvhart@infradead.org> Cc: Davidlohr Bueso <dave@stgolabs.net> Cc: Ingo Molnar <mingo@redhat.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/r/20230611233610.953456-4-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Родитель
e6deda2e5a
Коммит
8351498d52
|
@ -118,8 +118,7 @@ static void *workerfn(void *arg)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static void create_threads(struct worker *w, pthread_attr_t thread_attr,
|
||||
struct perf_cpu_map *cpu)
|
||||
static void create_threads(struct worker *w, struct perf_cpu_map *cpu)
|
||||
{
|
||||
cpu_set_t *cpuset;
|
||||
unsigned int i;
|
||||
|
@ -133,6 +132,9 @@ static void create_threads(struct worker *w, pthread_attr_t thread_attr,
|
|||
size = CPU_ALLOC_SIZE(nrcpus);
|
||||
|
||||
for (i = 0; i < params.nthreads; i++) {
|
||||
pthread_attr_t thread_attr;
|
||||
|
||||
pthread_attr_init(&thread_attr);
|
||||
worker[i].tid = i;
|
||||
|
||||
if (params.multi) {
|
||||
|
@ -154,6 +156,7 @@ static void create_threads(struct worker *w, pthread_attr_t thread_attr,
|
|||
CPU_FREE(cpuset);
|
||||
err(EXIT_FAILURE, "pthread_create");
|
||||
}
|
||||
pthread_attr_destroy(&thread_attr);
|
||||
}
|
||||
CPU_FREE(cpuset);
|
||||
}
|
||||
|
@ -163,7 +166,6 @@ int bench_futex_lock_pi(int argc, const char **argv)
|
|||
int ret = 0;
|
||||
unsigned int i;
|
||||
struct sigaction act;
|
||||
pthread_attr_t thread_attr;
|
||||
struct perf_cpu_map *cpu;
|
||||
|
||||
argc = parse_options(argc, argv, options, bench_futex_lock_pi_usage, 0);
|
||||
|
@ -203,11 +205,9 @@ int bench_futex_lock_pi(int argc, const char **argv)
|
|||
cond_init(&thread_worker);
|
||||
|
||||
threads_starting = params.nthreads;
|
||||
pthread_attr_init(&thread_attr);
|
||||
gettimeofday(&bench__start, NULL);
|
||||
|
||||
create_threads(worker, thread_attr, cpu);
|
||||
pthread_attr_destroy(&thread_attr);
|
||||
create_threads(worker, cpu);
|
||||
|
||||
mutex_lock(&thread_lock);
|
||||
while (threads_starting)
|
||||
|
|
|
@ -121,8 +121,7 @@ static void *workerfn(void *arg __maybe_unused)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static void block_threads(pthread_t *w,
|
||||
pthread_attr_t thread_attr, struct perf_cpu_map *cpu)
|
||||
static void block_threads(pthread_t *w, struct perf_cpu_map *cpu)
|
||||
{
|
||||
cpu_set_t *cpuset;
|
||||
unsigned int i;
|
||||
|
@ -137,6 +136,9 @@ static void block_threads(pthread_t *w,
|
|||
|
||||
/* create and block all threads */
|
||||
for (i = 0; i < params.nthreads; i++) {
|
||||
pthread_attr_t thread_attr;
|
||||
|
||||
pthread_attr_init(&thread_attr);
|
||||
CPU_ZERO_S(size, cpuset);
|
||||
CPU_SET_S(perf_cpu_map__cpu(cpu, i % perf_cpu_map__nr(cpu)).cpu, size, cpuset);
|
||||
|
||||
|
@ -149,6 +151,7 @@ static void block_threads(pthread_t *w,
|
|||
CPU_FREE(cpuset);
|
||||
err(EXIT_FAILURE, "pthread_create");
|
||||
}
|
||||
pthread_attr_destroy(&thread_attr);
|
||||
}
|
||||
CPU_FREE(cpuset);
|
||||
}
|
||||
|
@ -165,7 +168,6 @@ int bench_futex_requeue(int argc, const char **argv)
|
|||
int ret = 0;
|
||||
unsigned int i, j;
|
||||
struct sigaction act;
|
||||
pthread_attr_t thread_attr;
|
||||
struct perf_cpu_map *cpu;
|
||||
|
||||
argc = parse_options(argc, argv, options, bench_futex_requeue_usage, 0);
|
||||
|
@ -209,7 +211,6 @@ int bench_futex_requeue(int argc, const char **argv)
|
|||
|
||||
init_stats(&requeued_stats);
|
||||
init_stats(&requeuetime_stats);
|
||||
pthread_attr_init(&thread_attr);
|
||||
mutex_init(&thread_lock);
|
||||
cond_init(&thread_parent);
|
||||
cond_init(&thread_worker);
|
||||
|
@ -219,7 +220,7 @@ int bench_futex_requeue(int argc, const char **argv)
|
|||
struct timeval start, end, runtime;
|
||||
|
||||
/* create, launch & block all threads */
|
||||
block_threads(worker, thread_attr, cpu);
|
||||
block_threads(worker, cpu);
|
||||
|
||||
/* make sure all threads are already blocked */
|
||||
mutex_lock(&thread_lock);
|
||||
|
@ -301,7 +302,6 @@ int bench_futex_requeue(int argc, const char **argv)
|
|||
cond_destroy(&thread_parent);
|
||||
cond_destroy(&thread_worker);
|
||||
mutex_destroy(&thread_lock);
|
||||
pthread_attr_destroy(&thread_attr);
|
||||
|
||||
print_summary();
|
||||
|
||||
|
|
|
@ -95,10 +95,12 @@ static void *waking_workerfn(void *arg)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static void wakeup_threads(struct thread_data *td, pthread_attr_t thread_attr)
|
||||
static void wakeup_threads(struct thread_data *td)
|
||||
{
|
||||
unsigned int i;
|
||||
pthread_attr_t thread_attr;
|
||||
|
||||
pthread_attr_init(&thread_attr);
|
||||
pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_JOINABLE);
|
||||
|
||||
pthread_barrier_init(&barrier, NULL, params.nwakes + 1);
|
||||
|
@ -122,6 +124,7 @@ static void wakeup_threads(struct thread_data *td, pthread_attr_t thread_attr)
|
|||
err(EXIT_FAILURE, "pthread_join");
|
||||
|
||||
pthread_barrier_destroy(&barrier);
|
||||
pthread_attr_destroy(&thread_attr);
|
||||
}
|
||||
|
||||
static void *blocked_workerfn(void *arg __maybe_unused)
|
||||
|
@ -142,8 +145,7 @@ static void *blocked_workerfn(void *arg __maybe_unused)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static void block_threads(pthread_t *w, pthread_attr_t thread_attr,
|
||||
struct perf_cpu_map *cpu)
|
||||
static void block_threads(pthread_t *w, struct perf_cpu_map *cpu)
|
||||
{
|
||||
cpu_set_t *cpuset;
|
||||
unsigned int i;
|
||||
|
@ -158,6 +160,9 @@ static void block_threads(pthread_t *w, pthread_attr_t thread_attr,
|
|||
|
||||
/* create and block all threads */
|
||||
for (i = 0; i < params.nthreads; i++) {
|
||||
pthread_attr_t thread_attr;
|
||||
|
||||
pthread_attr_init(&thread_attr);
|
||||
CPU_ZERO_S(size, cpuset);
|
||||
CPU_SET_S(perf_cpu_map__cpu(cpu, i % perf_cpu_map__nr(cpu)).cpu, size, cpuset);
|
||||
|
||||
|
@ -170,6 +175,7 @@ static void block_threads(pthread_t *w, pthread_attr_t thread_attr,
|
|||
CPU_FREE(cpuset);
|
||||
err(EXIT_FAILURE, "pthread_create");
|
||||
}
|
||||
pthread_attr_destroy(&thread_attr);
|
||||
}
|
||||
CPU_FREE(cpuset);
|
||||
}
|
||||
|
@ -238,7 +244,6 @@ int bench_futex_wake_parallel(int argc, const char **argv)
|
|||
int ret = 0;
|
||||
unsigned int i, j;
|
||||
struct sigaction act;
|
||||
pthread_attr_t thread_attr;
|
||||
struct thread_data *waking_worker;
|
||||
struct perf_cpu_map *cpu;
|
||||
|
||||
|
@ -294,7 +299,6 @@ int bench_futex_wake_parallel(int argc, const char **argv)
|
|||
init_stats(&wakeup_stats);
|
||||
init_stats(&waketime_stats);
|
||||
|
||||
pthread_attr_init(&thread_attr);
|
||||
mutex_init(&thread_lock);
|
||||
cond_init(&thread_parent);
|
||||
cond_init(&thread_worker);
|
||||
|
@ -305,7 +309,7 @@ int bench_futex_wake_parallel(int argc, const char **argv)
|
|||
err(EXIT_FAILURE, "calloc");
|
||||
|
||||
/* create, launch & block all threads */
|
||||
block_threads(blocked_worker, thread_attr, cpu);
|
||||
block_threads(blocked_worker, cpu);
|
||||
|
||||
/* make sure all threads are already blocked */
|
||||
mutex_lock(&thread_lock);
|
||||
|
@ -317,7 +321,7 @@ int bench_futex_wake_parallel(int argc, const char **argv)
|
|||
usleep(100000);
|
||||
|
||||
/* Ok, all threads are patiently blocked, start waking folks up */
|
||||
wakeup_threads(waking_worker, thread_attr);
|
||||
wakeup_threads(waking_worker);
|
||||
|
||||
for (i = 0; i < params.nthreads; i++) {
|
||||
ret = pthread_join(blocked_worker[i], NULL);
|
||||
|
@ -336,7 +340,6 @@ int bench_futex_wake_parallel(int argc, const char **argv)
|
|||
cond_destroy(&thread_parent);
|
||||
cond_destroy(&thread_worker);
|
||||
mutex_destroy(&thread_lock);
|
||||
pthread_attr_destroy(&thread_attr);
|
||||
|
||||
print_summary();
|
||||
|
||||
|
|
|
@ -95,8 +95,7 @@ static void print_summary(void)
|
|||
rel_stddev_stats(waketime_stddev, waketime_avg));
|
||||
}
|
||||
|
||||
static void block_threads(pthread_t *w,
|
||||
pthread_attr_t thread_attr, struct perf_cpu_map *cpu)
|
||||
static void block_threads(pthread_t *w, struct perf_cpu_map *cpu)
|
||||
{
|
||||
cpu_set_t *cpuset;
|
||||
unsigned int i;
|
||||
|
@ -110,6 +109,9 @@ static void block_threads(pthread_t *w,
|
|||
|
||||
/* create and block all threads */
|
||||
for (i = 0; i < params.nthreads; i++) {
|
||||
pthread_attr_t thread_attr;
|
||||
|
||||
pthread_attr_init(&thread_attr);
|
||||
CPU_ZERO_S(size, cpuset);
|
||||
CPU_SET_S(perf_cpu_map__cpu(cpu, i % perf_cpu_map__nr(cpu)).cpu, size, cpuset);
|
||||
|
||||
|
@ -122,6 +124,7 @@ static void block_threads(pthread_t *w,
|
|||
CPU_FREE(cpuset);
|
||||
err(EXIT_FAILURE, "pthread_create");
|
||||
}
|
||||
pthread_attr_destroy(&thread_attr);
|
||||
}
|
||||
CPU_FREE(cpuset);
|
||||
}
|
||||
|
@ -138,7 +141,6 @@ int bench_futex_wake(int argc, const char **argv)
|
|||
int ret = 0;
|
||||
unsigned int i, j;
|
||||
struct sigaction act;
|
||||
pthread_attr_t thread_attr;
|
||||
struct perf_cpu_map *cpu;
|
||||
|
||||
argc = parse_options(argc, argv, options, bench_futex_wake_usage, 0);
|
||||
|
@ -178,7 +180,6 @@ int bench_futex_wake(int argc, const char **argv)
|
|||
|
||||
init_stats(&wakeup_stats);
|
||||
init_stats(&waketime_stats);
|
||||
pthread_attr_init(&thread_attr);
|
||||
mutex_init(&thread_lock);
|
||||
cond_init(&thread_parent);
|
||||
cond_init(&thread_worker);
|
||||
|
@ -188,7 +189,7 @@ int bench_futex_wake(int argc, const char **argv)
|
|||
struct timeval start, end, runtime;
|
||||
|
||||
/* create, launch & block all threads */
|
||||
block_threads(worker, thread_attr, cpu);
|
||||
block_threads(worker, cpu);
|
||||
|
||||
/* make sure all threads are already blocked */
|
||||
mutex_lock(&thread_lock);
|
||||
|
@ -228,7 +229,6 @@ int bench_futex_wake(int argc, const char **argv)
|
|||
cond_destroy(&thread_parent);
|
||||
cond_destroy(&thread_worker);
|
||||
mutex_destroy(&thread_lock);
|
||||
pthread_attr_destroy(&thread_attr);
|
||||
|
||||
print_summary();
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче