From: Thomas Gleixner <tglx@linutronix.de>
To: Oleg Nesterov <oleg@redhat.com>
Cc: John Stultz <jstultz@google.com>, Marco Elver <elver@google.com>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@kernel.org>,
"Eric W. Biederman" <ebiederm@xmission.com>,
linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org,
Dmitry Vyukov <dvyukov@google.com>,
kasan-dev@googlegroups.com, Edward Liaw <edliaw@google.com>,
Carlos Llamas <cmllamas@google.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Subject: Re: [PATCH v6 1/2] posix-timers: Prefer delivery of signals to the current thread
Date: Wed, 03 Apr 2024 18:32:02 +0200 [thread overview]
Message-ID: <87r0fmbe65.ffs@tglx> (raw)
In-Reply-To: <87sf02bgez.ffs@tglx>
On Wed, Apr 03 2024 at 17:43, Thomas Gleixner wrote:
> On Wed, Apr 03 2024 at 17:03, Oleg Nesterov wrote:
>>
>> Why distribution_thread() can't simply exit if got_signal != 0 ?
>>
>> See https://lore.kernel.org/all/20230128195641.GA14906@redhat.com/
>
> Indeed. It's too obvious :)
Revised simpler version below.
Thanks,
tglx
---
Subject: selftests/timers/posix_timers: Make signal distribution test less fragile
From: Thomas Gleixner <tglx@linutronix.de>
The signal distribution test has a tendency to hang for a long time as the
signal delivery is not really evenly distributed. In fact it might never be
distributed across all threads ever in the way it is written.
Address this by:
1) Adding a timeout which aborts the test
2) Letting the test threads exit once they got a signal instead of
running continuously. That ensures that the other threads will
have a chance to expire the timer and get the signal.
3) Adding a detection whether all signals arrvied at the main thread,
which allows to run the test on older kernels and emit 'SKIP'.
While at it get rid of the pointless atomic operation on a the thread local
variable in the signal handler.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
tools/testing/selftests/timers/posix_timers.c | 41 ++++++++++++++++----------
1 file changed, 26 insertions(+), 15 deletions(-)
--- a/tools/testing/selftests/timers/posix_timers.c
+++ b/tools/testing/selftests/timers/posix_timers.c
@@ -184,18 +184,19 @@ static int check_timer_create(int which)
return 0;
}
-int remain;
-__thread int got_signal;
+static int remain;
+static __thread int got_signal;
static void *distribution_thread(void *arg)
{
- while (__atomic_load_n(&remain, __ATOMIC_RELAXED));
+ while (!done && !got_signal);
+
return NULL;
}
static void distribution_handler(int nr)
{
- if (!__atomic_exchange_n(&got_signal, 1, __ATOMIC_RELAXED))
+ if (++got_signal == 1)
__atomic_fetch_sub(&remain, 1, __ATOMIC_RELAXED);
}
@@ -205,8 +206,6 @@ static void distribution_handler(int nr)
*/
static int check_timer_distribution(void)
{
- int err, i;
- timer_t id;
const int nthreads = 10;
pthread_t threads[nthreads];
struct itimerspec val = {
@@ -215,7 +214,11 @@ static int check_timer_distribution(void
.it_interval.tv_sec = 0,
.it_interval.tv_nsec = 1000 * 1000,
};
+ time_t start, now;
+ timer_t id;
+ int err, i;
+ done = 0;
remain = nthreads + 1; /* worker threads + this thread */
signal(SIGALRM, distribution_handler);
err = timer_create(CLOCK_PROCESS_CPUTIME_ID, NULL, &id);
@@ -230,8 +233,7 @@ static int check_timer_distribution(void
}
for (i = 0; i < nthreads; i++) {
- err = pthread_create(&threads[i], NULL, distribution_thread,
- NULL);
+ err = pthread_create(&threads[i], NULL, distribution_thread, NULL);
if (err) {
ksft_print_msg("Can't create thread: %s (%d)\n",
strerror(errno), errno);
@@ -240,7 +242,18 @@ static int check_timer_distribution(void
}
/* Wait for all threads to receive the signal. */
- while (__atomic_load_n(&remain, __ATOMIC_RELAXED));
+ now = start = time(NULL);
+ while (__atomic_load_n(&remain, __ATOMIC_RELAXED)) {
+ now = time(NULL);
+ if (now - start > 2)
+ break;
+ }
+ done = 1;
+
+ if (timer_delete(id)) {
+ ksft_perror("Can't delete timer\n");
+ return -1;
+ }
for (i = 0; i < nthreads; i++) {
err = pthread_join(threads[i], NULL);
@@ -251,12 +264,10 @@ static int check_timer_distribution(void
}
}
- if (timer_delete(id)) {
- ksft_perror("Can't delete timer");
- return -1;
- }
-
- ksft_test_result_pass("check_timer_distribution\n");
+ if (__atomic_load_n(&remain, __ATOMIC_RELAXED) == nthreads)
+ ksft_test_result_skip("No signal distribution. Assuming old kernel\n");
+ else
+ ksft_test_result(now - start <= 2, "check signal distribution\n");
return 0;
}
next prev parent reply other threads:[~2024-04-03 16:32 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-16 12:30 [PATCH v6 1/2] posix-timers: Prefer delivery of signals to the current thread Marco Elver
2023-03-16 12:30 ` [PATCH v6 2/2] selftests/timers/posix_timers: Test delivery of signals across threads Marco Elver
2023-04-16 7:04 ` [tip: timers/core] " tip-bot2 for Dmitry Vyukov
2024-04-06 20:53 ` [PATCH v6 2/2] " Muhammad Usama Anjum
2024-04-06 21:13 ` Oleg Nesterov
2024-04-06 21:32 ` Muhammad Usama Anjum
2023-03-30 10:19 ` [PATCH v6 1/2] posix-timers: Prefer delivery of signals to the current thread Marco Elver
2023-04-06 14:12 ` Marco Elver
2023-04-06 15:13 ` Frederic Weisbecker
2023-04-06 20:22 ` Peter Zijlstra
2023-04-16 7:04 ` [tip: timers/core] " tip-bot2 for Dmitry Vyukov
2024-04-01 20:17 ` [PATCH v6 1/2] " John Stultz
2024-04-02 9:07 ` Dmitry Vyukov
2024-04-02 14:57 ` Thomas Gleixner
2024-04-02 17:23 ` John Stultz
2024-04-03 12:41 ` Thomas Gleixner
2024-04-03 15:03 ` Oleg Nesterov
2024-04-03 15:43 ` Thomas Gleixner
2024-04-03 16:32 ` Thomas Gleixner [this message]
2024-04-03 18:16 ` John Stultz
2024-04-03 19:09 ` Thomas Gleixner
2024-04-03 19:35 ` John Stultz
2024-04-03 22:24 ` Thomas Gleixner
2024-04-04 14:54 ` Oleg Nesterov
2024-04-04 18:08 ` Thomas Gleixner
2024-04-06 15:09 ` [PATCH] selftests/timers/posix_timers: reimplement check_timer_distribution() Oleg Nesterov
2024-04-06 15:10 ` Oleg Nesterov
2024-04-06 22:00 ` Thomas Gleixner
2024-04-08 8:30 ` Dmitry Vyukov
2024-04-08 10:01 ` Thomas Gleixner
2024-04-08 10:26 ` Oleg Nesterov
2024-04-08 18:49 ` Oleg Nesterov
2024-04-08 22:17 ` Thomas Gleixner
2024-04-09 11:10 ` Oleg Nesterov
2024-04-09 11:45 ` Dmitry Vyukov
2024-04-09 12:02 ` Thomas Gleixner
2024-04-09 13:38 ` [PATCH v2] " Oleg Nesterov
2024-04-09 15:57 ` [tip: timers/urgent] selftests/timers/posix_timers: Reimplement check_timer_distribution() tip-bot2 for Oleg Nesterov
2024-04-10 22:21 ` [PATCH v2] selftests/timers/posix_timers: reimplement check_timer_distribution() John Stultz
2024-04-10 22:31 ` Thomas Gleixner
2024-04-10 22:33 ` John Stultz
2024-04-11 12:41 ` [PATCH] " Mark Brown
2024-04-11 15:33 ` John Stultz
2024-04-11 12:44 ` Mark Brown
2024-04-11 14:17 ` Thomas Gleixner
2024-04-11 15:50 ` Oleg Nesterov
2024-04-11 16:03 ` Mark Brown
2024-04-12 12:35 ` [PATCH] selftests: fix build failure with NOLIBC Oleg Nesterov
2024-04-12 14:58 ` [tip: timers/urgent] selftests: kselftest: Fix " tip-bot2 for Oleg Nesterov
2024-04-14 7:42 ` [PATCH] selftests: fix " Mark Brown
2024-04-04 8:55 ` [PATCH v6 1/2] posix-timers: Prefer delivery of signals to the current thread Dmitry Vyukov
2024-04-04 13:43 ` Oleg Nesterov
2024-04-04 15:10 ` Thomas Gleixner
2024-04-04 15:23 ` Oleg Nesterov
2024-04-05 4:28 ` Dmitry Vyukov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87r0fmbe65.ffs@tglx \
--to=tglx@linutronix.de \
--cc=cmllamas@google.com \
--cc=dvyukov@google.com \
--cc=ebiederm@xmission.com \
--cc=edliaw@google.com \
--cc=elver@google.com \
--cc=gregkh@linuxfoundation.org \
--cc=jstultz@google.com \
--cc=kasan-dev@googlegroups.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=oleg@redhat.com \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox