* [PATCH v2] perf test workload: Add thread count argument to thloop
@ 2025-10-28 15:38 Ian Rogers
2025-10-28 19:13 ` Arnaldo Carvalho de Melo
2025-10-30 3:46 ` Namhyung Kim
0 siblings, 2 replies; 5+ messages in thread
From: Ian Rogers @ 2025-10-28 15:38 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Alexander Shishkin, Jiri Olsa, Ian Rogers,
Adrian Hunter, linux-perf-users, linux-kernel
Allow the number of threads for the thloop workload to be increased
beyond the normal 2. Add error checking to the parsed time and thread
count values.
Signed-off-by: Ian Rogers <irogers@google.com>
---
v2: Perform the pthread_join unconditionally and ensure started
threads terminate.
---
tools/perf/tests/workloads/thloop.c | 45 ++++++++++++++++++++++++-----
1 file changed, 38 insertions(+), 7 deletions(-)
diff --git a/tools/perf/tests/workloads/thloop.c b/tools/perf/tests/workloads/thloop.c
index 457b29f91c3e..bd8168f883fb 100644
--- a/tools/perf/tests/workloads/thloop.c
+++ b/tools/perf/tests/workloads/thloop.c
@@ -31,21 +31,52 @@ static void *thfunc(void *arg)
static int thloop(int argc, const char **argv)
{
- int sec = 1;
- pthread_t th;
+ int nt = 2, sec = 1, err = 1;
+ pthread_t *thread_list = NULL;
if (argc > 0)
sec = atoi(argv[0]);
+ if (sec <= 0) {
+ fprintf(stderr, "Error: seconds (%d) must be >= 1\n", sec);
+ return 1;
+ }
+
+ if (argc > 1)
+ nt = atoi(argv[1]);
+
+ if (nt <= 0) {
+ fprintf(stderr, "Error: thread count (%d) must be >= 1\n", nt);
+ return 1;
+ }
+
signal(SIGINT, sighandler);
signal(SIGALRM, sighandler);
- alarm(sec);
- pthread_create(&th, NULL, thfunc, test_loop);
- test_loop();
- pthread_join(th, NULL);
+ thread_list = calloc(nt, sizeof(pthread_t));
+ if (thread_list == NULL) {
+ fprintf(stderr, "Error: malloc failed for %d threads\n", nt);
+ goto out;
+ }
+ for (int i = 1; i < nt; i++) {
+ int ret = pthread_create(&thread_list[i], NULL, thfunc, test_loop);
- return 0;
+ if (ret) {
+ fprintf(stderr, "Error: failed to create thread %d\n", i);
+ done = 1; // Ensure started threads terminate.
+ goto out;
+ }
+ }
+ alarm(sec);
+ test_loop();
+ err = 0;
+out:
+ for (int i = 1; i < nt; i++) {
+ if (thread_list && thread_list[i])
+ pthread_join(thread_list[i], /*retval=*/NULL);
+ }
+ free(thread_list);
+ return err;
}
DEFINE_WORKLOAD(thloop);
--
2.51.1.851.g4ebd6896fd-goog
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH v2] perf test workload: Add thread count argument to thloop 2025-10-28 15:38 [PATCH v2] perf test workload: Add thread count argument to thloop Ian Rogers @ 2025-10-28 19:13 ` Arnaldo Carvalho de Melo 2025-10-28 19:55 ` Ian Rogers 2025-10-30 3:46 ` Namhyung Kim 1 sibling, 1 reply; 5+ messages in thread From: Arnaldo Carvalho de Melo @ 2025-10-28 19:13 UTC (permalink / raw) To: Ian Rogers Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Alexander Shishkin, Jiri Olsa, Adrian Hunter, linux-perf-users, linux-kernel On Tue, Oct 28, 2025 at 08:38:20AM -0700, Ian Rogers wrote: > Allow the number of threads for the thloop workload to be increased > beyond the normal 2. Add error checking to the parsed time and thread > count values. > > Signed-off-by: Ian Rogers <irogers@google.com> > --- > v2: Perform the pthread_join unconditionally and ensure started > threads terminate. > --- > tools/perf/tests/workloads/thloop.c | 45 ++++++++++++++++++++++++----- > 1 file changed, 38 insertions(+), 7 deletions(-) > > diff --git a/tools/perf/tests/workloads/thloop.c b/tools/perf/tests/workloads/thloop.c > index 457b29f91c3e..bd8168f883fb 100644 > --- a/tools/perf/tests/workloads/thloop.c > +++ b/tools/perf/tests/workloads/thloop.c > @@ -31,21 +31,52 @@ static void *thfunc(void *arg) > > static int thloop(int argc, const char **argv) > { > - int sec = 1; > - pthread_t th; > + int nt = 2, sec = 1, err = 1; > + pthread_t *thread_list = NULL; > > if (argc > 0) > sec = atoi(argv[0]); > > + if (sec <= 0) { > + fprintf(stderr, "Error: seconds (%d) must be >= 1\n", sec); > + return 1; > + } > + > + if (argc > 1) > + nt = atoi(argv[1]); > + > + if (nt <= 0) { > + fprintf(stderr, "Error: thread count (%d) must be >= 1\n", nt); > + return 1; > + } > + > signal(SIGINT, sighandler); > signal(SIGALRM, sighandler); > - alarm(sec); > > - pthread_create(&th, NULL, thfunc, test_loop); > - test_loop(); > - pthread_join(th, NULL); > + thread_list = calloc(nt, sizeof(pthread_t)); > + if (thread_list == NULL) { > + fprintf(stderr, "Error: malloc failed for %d threads\n", nt); > + goto out; > + } > + for (int i = 1; i < nt; i++) { Why do you start at 1? What goes in thread[0]? calloc() leaves it at NULL, then if you have two threads you'll allocate thread[1], i gets incremented, 2 < 2 fails, you get just one thread created, when two were asked? Oh, I see, you use the main thread to run, that test_loop() just before the err = 0, its just that you allocate thread[0] for nothing, that confused me. - Arnaldo > + int ret = pthread_create(&thread_list[i], NULL, thfunc, test_loop); > > - return 0; > + if (ret) { > + fprintf(stderr, "Error: failed to create thread %d\n", i); > + done = 1; // Ensure started threads terminate. > + goto out; > + } > + } > + alarm(sec); > + test_loop(); > + err = 0; > +out: > + for (int i = 1; i < nt; i++) { > + if (thread_list && thread_list[i]) > + pthread_join(thread_list[i], /*retval=*/NULL); > + } > + free(thread_list); > + return err; > } > > DEFINE_WORKLOAD(thloop); > -- > 2.51.1.851.g4ebd6896fd-goog ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] perf test workload: Add thread count argument to thloop 2025-10-28 19:13 ` Arnaldo Carvalho de Melo @ 2025-10-28 19:55 ` Ian Rogers 2025-10-28 20:37 ` Arnaldo Carvalho de Melo 0 siblings, 1 reply; 5+ messages in thread From: Ian Rogers @ 2025-10-28 19:55 UTC (permalink / raw) To: Arnaldo Carvalho de Melo Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Alexander Shishkin, Jiri Olsa, Adrian Hunter, linux-perf-users, linux-kernel On Tue, Oct 28, 2025 at 12:13 PM Arnaldo Carvalho de Melo <acme@kernel.org> wrote: > > On Tue, Oct 28, 2025 at 08:38:20AM -0700, Ian Rogers wrote: > > Allow the number of threads for the thloop workload to be increased > > beyond the normal 2. Add error checking to the parsed time and thread > > count values. > > > > Signed-off-by: Ian Rogers <irogers@google.com> > > --- > > v2: Perform the pthread_join unconditionally and ensure started > > threads terminate. > > --- > > tools/perf/tests/workloads/thloop.c | 45 ++++++++++++++++++++++++----- > > 1 file changed, 38 insertions(+), 7 deletions(-) > > > > diff --git a/tools/perf/tests/workloads/thloop.c b/tools/perf/tests/workloads/thloop.c > > index 457b29f91c3e..bd8168f883fb 100644 > > --- a/tools/perf/tests/workloads/thloop.c > > +++ b/tools/perf/tests/workloads/thloop.c > > @@ -31,21 +31,52 @@ static void *thfunc(void *arg) > > > > static int thloop(int argc, const char **argv) > > { > > - int sec = 1; > > - pthread_t th; > > + int nt = 2, sec = 1, err = 1; > > + pthread_t *thread_list = NULL; > > > > if (argc > 0) > > sec = atoi(argv[0]); > > > > + if (sec <= 0) { > > + fprintf(stderr, "Error: seconds (%d) must be >= 1\n", sec); > > + return 1; > > + } > > + > > + if (argc > 1) > > + nt = atoi(argv[1]); > > + > > + if (nt <= 0) { > > + fprintf(stderr, "Error: thread count (%d) must be >= 1\n", nt); > > + return 1; > > + } > > + > > signal(SIGINT, sighandler); > > signal(SIGALRM, sighandler); > > - alarm(sec); > > > > - pthread_create(&th, NULL, thfunc, test_loop); > > - test_loop(); > > - pthread_join(th, NULL); > > + thread_list = calloc(nt, sizeof(pthread_t)); > > + if (thread_list == NULL) { > > + fprintf(stderr, "Error: malloc failed for %d threads\n", nt); > > + goto out; > > + } > > + for (int i = 1; i < nt; i++) { > > Why do you start at 1? What goes in thread[0]? calloc() leaves it at > NULL, then if you have two threads you'll allocate thread[1], i gets > incremented, 2 < 2 fails, you get just one thread created, when two were > asked? > > Oh, I see, you use the main thread to run, that test_loop() just before > the err = 0, its just that you allocate thread[0] for nothing, that > confused me. Agreed. It was so I could avoid doing "nt-1" as I mentioned before. Fwiw, pthread_self will sometimes return 0 for the main thread and so it isn't entirely inconsistent to do things this way. Not that the main thread should try to do a pthread_join with itself. Thanks, Ian > - Arnaldo > > > + int ret = pthread_create(&thread_list[i], NULL, thfunc, test_loop); > > > > - return 0; > > + if (ret) { > > + fprintf(stderr, "Error: failed to create thread %d\n", i); > > + done = 1; // Ensure started threads terminate. > > + goto out; > > + } > > + } > > + alarm(sec); > > + test_loop(); > > + err = 0; > > +out: > > + for (int i = 1; i < nt; i++) { > > + if (thread_list && thread_list[i]) > > + pthread_join(thread_list[i], /*retval=*/NULL); > > + } > > + free(thread_list); > > + return err; > > } > > > > DEFINE_WORKLOAD(thloop); > > -- > > 2.51.1.851.g4ebd6896fd-goog ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] perf test workload: Add thread count argument to thloop 2025-10-28 19:55 ` Ian Rogers @ 2025-10-28 20:37 ` Arnaldo Carvalho de Melo 0 siblings, 0 replies; 5+ messages in thread From: Arnaldo Carvalho de Melo @ 2025-10-28 20:37 UTC (permalink / raw) To: Ian Rogers Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Alexander Shishkin, Jiri Olsa, Adrian Hunter, linux-perf-users, linux-kernel On Tue, Oct 28, 2025 at 12:55:56PM -0700, Ian Rogers wrote: > On Tue, Oct 28, 2025 at 12:13 PM Arnaldo Carvalho de Melo > <acme@kernel.org> wrote: > > > > On Tue, Oct 28, 2025 at 08:38:20AM -0700, Ian Rogers wrote: > > > Allow the number of threads for the thloop workload to be increased > > > beyond the normal 2. Add error checking to the parsed time and thread > > > count values. > > > > > > Signed-off-by: Ian Rogers <irogers@google.com> > > > --- > > > v2: Perform the pthread_join unconditionally and ensure started > > > threads terminate. > > > --- > > > tools/perf/tests/workloads/thloop.c | 45 ++++++++++++++++++++++++----- > > > 1 file changed, 38 insertions(+), 7 deletions(-) > > > > > > diff --git a/tools/perf/tests/workloads/thloop.c b/tools/perf/tests/workloads/thloop.c > > > index 457b29f91c3e..bd8168f883fb 100644 > > > --- a/tools/perf/tests/workloads/thloop.c > > > +++ b/tools/perf/tests/workloads/thloop.c > > > @@ -31,21 +31,52 @@ static void *thfunc(void *arg) > > > > > > static int thloop(int argc, const char **argv) > > > { > > > - int sec = 1; > > > - pthread_t th; > > > + int nt = 2, sec = 1, err = 1; > > > + pthread_t *thread_list = NULL; > > > > > > if (argc > 0) > > > sec = atoi(argv[0]); > > > > > > + if (sec <= 0) { > > > + fprintf(stderr, "Error: seconds (%d) must be >= 1\n", sec); > > > + return 1; > > > + } > > > + > > > + if (argc > 1) > > > + nt = atoi(argv[1]); > > > + > > > + if (nt <= 0) { > > > + fprintf(stderr, "Error: thread count (%d) must be >= 1\n", nt); > > > + return 1; > > > + } > > > + > > > signal(SIGINT, sighandler); > > > signal(SIGALRM, sighandler); > > > - alarm(sec); > > > > > > - pthread_create(&th, NULL, thfunc, test_loop); > > > - test_loop(); > > > - pthread_join(th, NULL); > > > + thread_list = calloc(nt, sizeof(pthread_t)); > > > + if (thread_list == NULL) { > > > + fprintf(stderr, "Error: malloc failed for %d threads\n", nt); > > > + goto out; > > > + } > > > + for (int i = 1; i < nt; i++) { > > > > Why do you start at 1? What goes in thread[0]? calloc() leaves it at > > NULL, then if you have two threads you'll allocate thread[1], i gets > > incremented, 2 < 2 fails, you get just one thread created, when two were > > asked? > > > > Oh, I see, you use the main thread to run, that test_loop() just before > > the err = 0, its just that you allocate thread[0] for nothing, that > > confused me. > > Agreed. It was so I could avoid doing "nt-1" as I mentioned before. > Fwiw, pthread_self will sometimes return 0 for the main thread and so > it isn't entirely inconsistent to do things this way. Not that the > main thread should try to do a pthread_join with itself. :-) Its just a test, Acked-by: Arnaldo Carvalho de Melo <acme@redhat.com> > Thanks, > Ian > > > - Arnaldo > > > > > + int ret = pthread_create(&thread_list[i], NULL, thfunc, test_loop); > > > > > > - return 0; > > > + if (ret) { > > > + fprintf(stderr, "Error: failed to create thread %d\n", i); > > > + done = 1; // Ensure started threads terminate. > > > + goto out; > > > + } > > > + } > > > + alarm(sec); > > > + test_loop(); > > > + err = 0; > > > +out: > > > + for (int i = 1; i < nt; i++) { > > > + if (thread_list && thread_list[i]) > > > + pthread_join(thread_list[i], /*retval=*/NULL); > > > + } > > > + free(thread_list); > > > + return err; > > > } > > > > > > DEFINE_WORKLOAD(thloop); > > > -- > > > 2.51.1.851.g4ebd6896fd-goog ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] perf test workload: Add thread count argument to thloop 2025-10-28 15:38 [PATCH v2] perf test workload: Add thread count argument to thloop Ian Rogers 2025-10-28 19:13 ` Arnaldo Carvalho de Melo @ 2025-10-30 3:46 ` Namhyung Kim 1 sibling, 0 replies; 5+ messages in thread From: Namhyung Kim @ 2025-10-30 3:46 UTC (permalink / raw) To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo, Alexander Shishkin, Jiri Olsa, Adrian Hunter, linux-perf-users, linux-kernel, Ian Rogers On Tue, 28 Oct 2025 08:38:20 -0700, Ian Rogers wrote: > Allow the number of threads for the thloop workload to be increased > beyond the normal 2. Add error checking to the parsed time and thread > count values. > > Applied to perf-tools-next, thanks! Best regards, Namhyung ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-10-30 3:46 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-10-28 15:38 [PATCH v2] perf test workload: Add thread count argument to thloop Ian Rogers 2025-10-28 19:13 ` Arnaldo Carvalho de Melo 2025-10-28 19:55 ` Ian Rogers 2025-10-28 20:37 ` Arnaldo Carvalho de Melo 2025-10-30 3:46 ` Namhyung Kim
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).