* [PATCH 0/3] selftests/mm: revert pthread_barrier change and
@ 2024-10-18 17:17 Edward Liaw
2024-10-18 17:17 ` [PATCH 1/3] Revert "selftests/mm: fix deadlock for fork after pthread_create on ARM" Edward Liaw
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Edward Liaw @ 2024-10-18 17:17 UTC (permalink / raw)
To: linux-kselftest, Andrew Morton, Shuah Khan, Edward Liaw, Peter Xu
Cc: linux-kernel, kernel-team, linux-mm
On Android arm, pthread_create followed by a fork caused a deadlock in
the case where the fork required work to be completed by the created
thread.
The previous patches incorrectly assumed that the parent would
always initialize the pthread_barrier for the child thread. This
reverts the change and replaces the fix for wp-fork-with-event with the
original use of atomic_bool.
Edward Liaw (3):
Revert "selftests/mm: fix deadlock for fork after pthread_create on
ARM"
Revert "selftests/mm: replace atomic_bool with pthread_barrier_t"
selftests/mm: fix deadlock for fork after pthread_create with
atomic_bool
tools/testing/selftests/mm/uffd-common.c | 5 ++--
tools/testing/selftests/mm/uffd-common.h | 3 ++-
tools/testing/selftests/mm/uffd-unit-tests.c | 24 ++++++++------------
3 files changed, 14 insertions(+), 18 deletions(-)
--
2.47.0.105.g07ac214952-goog
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/3] Revert "selftests/mm: fix deadlock for fork after pthread_create on ARM"
2024-10-18 17:17 [PATCH 0/3] selftests/mm: revert pthread_barrier change and Edward Liaw
@ 2024-10-18 17:17 ` Edward Liaw
2024-10-18 17:17 ` [PATCH 2/3] Revert "selftests/mm: replace atomic_bool with pthread_barrier_t" Edward Liaw
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Edward Liaw @ 2024-10-18 17:17 UTC (permalink / raw)
To: linux-kselftest, Andrew Morton, Shuah Khan, Edward Liaw, Peter Xu
Cc: linux-kernel, kernel-team, linux-mm, Ryan Roberts
This reverts commit e142cc87ac4ec618f2ccf5f68aedcd6e28a59d9d.
fork_event_consumer may be called by other tests that do not initialize
the pthread_barrier, so this approach is not correct. The subsequent
patch will revert to using atomic_bool instead.
Fixes: e142cc87ac4e ("fix deadlock for fork after pthread_create on ARM")
CC: Ryan Roberts <ryan.roberts@arm.com>
Signed-off-by: Edward Liaw <edliaw@google.com>
---
tools/testing/selftests/mm/uffd-unit-tests.c | 7 -------
1 file changed, 7 deletions(-)
diff --git a/tools/testing/selftests/mm/uffd-unit-tests.c b/tools/testing/selftests/mm/uffd-unit-tests.c
index c8a3b1c7edff..3db2296ac631 100644
--- a/tools/testing/selftests/mm/uffd-unit-tests.c
+++ b/tools/testing/selftests/mm/uffd-unit-tests.c
@@ -241,9 +241,6 @@ static void *fork_event_consumer(void *data)
fork_event_args *args = data;
struct uffd_msg msg = { 0 };
- /* Ready for parent thread to fork */
- pthread_barrier_wait(&ready_for_fork);
-
/* Read until a full msg received */
while (uffd_read_msg(args->parent_uffd, &msg));
@@ -311,12 +308,8 @@ static int pagemap_test_fork(int uffd, bool with_event, bool test_pin)
/* Prepare a thread to resolve EVENT_FORK */
if (with_event) {
- pthread_barrier_init(&ready_for_fork, NULL, 2);
if (pthread_create(&thread, NULL, fork_event_consumer, &args))
err("pthread_create()");
- /* Wait for child thread to start before forking */
- pthread_barrier_wait(&ready_for_fork);
- pthread_barrier_destroy(&ready_for_fork);
}
child = fork();
--
2.47.0.105.g07ac214952-goog
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 2/3] Revert "selftests/mm: replace atomic_bool with pthread_barrier_t"
2024-10-18 17:17 [PATCH 0/3] selftests/mm: revert pthread_barrier change and Edward Liaw
2024-10-18 17:17 ` [PATCH 1/3] Revert "selftests/mm: fix deadlock for fork after pthread_create on ARM" Edward Liaw
@ 2024-10-18 17:17 ` Edward Liaw
2024-10-18 17:17 ` [PATCH 3/3] selftests/mm: fix deadlock for fork after pthread_create with atomic_bool Edward Liaw
2024-10-18 21:13 ` [PATCH 0/3] selftests/mm: revert pthread_barrier change and Andrew Morton
3 siblings, 0 replies; 5+ messages in thread
From: Edward Liaw @ 2024-10-18 17:17 UTC (permalink / raw)
To: linux-kselftest, Andrew Morton, Shuah Khan, Edward Liaw, Peter Xu
Cc: linux-kernel, kernel-team, linux-mm, Ryan Roberts
This reverts commit e61ef21e27e8deed8c474e9f47f4aa7bc37e138c.
uffd_poll_thread may be called by other tests that do not initialize the
pthread_barrier, so this approach is not correct. This will revert to
using atomic_bool instead.
Fixes: e61ef21e27e8 ("selftests/mm: replace atomic_bool with pthread_barrier_t")
CC: Ryan Roberts <ryan.roberts@arm.com>
Signed-off-by: Edward Liaw <edliaw@google.com>
---
tools/testing/selftests/mm/uffd-common.c | 5 ++---
tools/testing/selftests/mm/uffd-common.h | 3 ++-
tools/testing/selftests/mm/uffd-unit-tests.c | 14 ++++++--------
3 files changed, 10 insertions(+), 12 deletions(-)
diff --git a/tools/testing/selftests/mm/uffd-common.c b/tools/testing/selftests/mm/uffd-common.c
index 852e7281026e..717539eddf98 100644
--- a/tools/testing/selftests/mm/uffd-common.c
+++ b/tools/testing/selftests/mm/uffd-common.c
@@ -18,7 +18,7 @@ bool test_uffdio_wp = true;
unsigned long long *count_verify;
uffd_test_ops_t *uffd_test_ops;
uffd_test_case_ops_t *uffd_test_case_ops;
-pthread_barrier_t ready_for_fork;
+atomic_bool ready_for_fork;
static int uffd_mem_fd_create(off_t mem_size, bool hugetlb)
{
@@ -519,8 +519,7 @@ void *uffd_poll_thread(void *arg)
pollfd[1].fd = pipefd[cpu*2];
pollfd[1].events = POLLIN;
- /* Ready for parent thread to fork */
- pthread_barrier_wait(&ready_for_fork);
+ ready_for_fork = true;
for (;;) {
ret = poll(pollfd, 2, -1);
diff --git a/tools/testing/selftests/mm/uffd-common.h b/tools/testing/selftests/mm/uffd-common.h
index 3e6228d8e0dc..a70ae10b5f62 100644
--- a/tools/testing/selftests/mm/uffd-common.h
+++ b/tools/testing/selftests/mm/uffd-common.h
@@ -33,6 +33,7 @@
#include <inttypes.h>
#include <stdint.h>
#include <sys/random.h>
+#include <stdatomic.h>
#include "../kselftest.h"
#include "vm_util.h"
@@ -104,7 +105,7 @@ extern bool map_shared;
extern bool test_uffdio_wp;
extern unsigned long long *count_verify;
extern volatile bool test_uffdio_copy_eexist;
-extern pthread_barrier_t ready_for_fork;
+extern atomic_bool ready_for_fork;
extern uffd_test_ops_t anon_uffd_test_ops;
extern uffd_test_ops_t shmem_uffd_test_ops;
diff --git a/tools/testing/selftests/mm/uffd-unit-tests.c b/tools/testing/selftests/mm/uffd-unit-tests.c
index 3db2296ac631..b3d21eed203d 100644
--- a/tools/testing/selftests/mm/uffd-unit-tests.c
+++ b/tools/testing/selftests/mm/uffd-unit-tests.c
@@ -774,7 +774,7 @@ static void uffd_sigbus_test_common(bool wp)
char c;
struct uffd_args args = { 0 };
- pthread_barrier_init(&ready_for_fork, NULL, 2);
+ ready_for_fork = false;
fcntl(uffd, F_SETFL, uffd_flags | O_NONBLOCK);
@@ -791,9 +791,8 @@ static void uffd_sigbus_test_common(bool wp)
if (pthread_create(&uffd_mon, NULL, uffd_poll_thread, &args))
err("uffd_poll_thread create");
- /* Wait for child thread to start before forking */
- pthread_barrier_wait(&ready_for_fork);
- pthread_barrier_destroy(&ready_for_fork);
+ while (!ready_for_fork)
+ ; /* Wait for the poll_thread to start executing before forking */
pid = fork();
if (pid < 0)
@@ -834,7 +833,7 @@ static void uffd_events_test_common(bool wp)
char c;
struct uffd_args args = { 0 };
- pthread_barrier_init(&ready_for_fork, NULL, 2);
+ ready_for_fork = false;
fcntl(uffd, F_SETFL, uffd_flags | O_NONBLOCK);
if (uffd_register(uffd, area_dst, nr_pages * page_size,
@@ -845,9 +844,8 @@ static void uffd_events_test_common(bool wp)
if (pthread_create(&uffd_mon, NULL, uffd_poll_thread, &args))
err("uffd_poll_thread create");
- /* Wait for child thread to start before forking */
- pthread_barrier_wait(&ready_for_fork);
- pthread_barrier_destroy(&ready_for_fork);
+ while (!ready_for_fork)
+ ; /* Wait for the poll_thread to start executing before forking */
pid = fork();
if (pid < 0)
--
2.47.0.105.g07ac214952-goog
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 3/3] selftests/mm: fix deadlock for fork after pthread_create with atomic_bool
2024-10-18 17:17 [PATCH 0/3] selftests/mm: revert pthread_barrier change and Edward Liaw
2024-10-18 17:17 ` [PATCH 1/3] Revert "selftests/mm: fix deadlock for fork after pthread_create on ARM" Edward Liaw
2024-10-18 17:17 ` [PATCH 2/3] Revert "selftests/mm: replace atomic_bool with pthread_barrier_t" Edward Liaw
@ 2024-10-18 17:17 ` Edward Liaw
2024-10-18 21:13 ` [PATCH 0/3] selftests/mm: revert pthread_barrier change and Andrew Morton
3 siblings, 0 replies; 5+ messages in thread
From: Edward Liaw @ 2024-10-18 17:17 UTC (permalink / raw)
To: linux-kselftest, Andrew Morton, Shuah Khan, Edward Liaw, Peter Xu
Cc: linux-kernel, kernel-team, linux-mm, Ryan Roberts
Some additional synchronization is needed on Android ARM64; we see a
deadlock with pthread_create when the parent thread races forward before
the child has a chance to start doing work.
Fixes: cff294582798 ("selftests/mm: extend and rename uffd pagemap test")
CC: Ryan Roberts <ryan.roberts@arm.com>
Signed-off-by: Edward Liaw <edliaw@google.com>
---
tools/testing/selftests/mm/uffd-unit-tests.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/tools/testing/selftests/mm/uffd-unit-tests.c b/tools/testing/selftests/mm/uffd-unit-tests.c
index b3d21eed203d..a2e71b1636e7 100644
--- a/tools/testing/selftests/mm/uffd-unit-tests.c
+++ b/tools/testing/selftests/mm/uffd-unit-tests.c
@@ -241,6 +241,8 @@ static void *fork_event_consumer(void *data)
fork_event_args *args = data;
struct uffd_msg msg = { 0 };
+ ready_for_fork = true;
+
/* Read until a full msg received */
while (uffd_read_msg(args->parent_uffd, &msg));
@@ -308,8 +310,11 @@ static int pagemap_test_fork(int uffd, bool with_event, bool test_pin)
/* Prepare a thread to resolve EVENT_FORK */
if (with_event) {
+ ready_for_fork = false;
if (pthread_create(&thread, NULL, fork_event_consumer, &args))
err("pthread_create()");
+ while (!ready_for_fork)
+ ; /* Wait for the poll_thread to start executing before forking */
}
child = fork();
--
2.47.0.105.g07ac214952-goog
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 0/3] selftests/mm: revert pthread_barrier change and
2024-10-18 17:17 [PATCH 0/3] selftests/mm: revert pthread_barrier change and Edward Liaw
` (2 preceding siblings ...)
2024-10-18 17:17 ` [PATCH 3/3] selftests/mm: fix deadlock for fork after pthread_create with atomic_bool Edward Liaw
@ 2024-10-18 21:13 ` Andrew Morton
3 siblings, 0 replies; 5+ messages in thread
From: Andrew Morton @ 2024-10-18 21:13 UTC (permalink / raw)
To: Edward Liaw
Cc: linux-kselftest, Shuah Khan, Peter Xu, linux-kernel, kernel-team,
linux-mm
On Fri, 18 Oct 2024 17:17:21 +0000 Edward Liaw <edliaw@google.com> wrote:
> Subject: [PATCH 0/3] selftests/mm: revert pthread_barrier change and
I simply removed the " and".
> Date: Fri, 18 Oct 2024 17:17:21 +0000
> X-Mailer: git-send-email 2.47.0.105.g07ac214952-goog
>
> On Android arm, pthread_create followed by a fork caused a deadlock in
> the case where the fork required work to be completed by the created
> thread.
>
> The previous patches incorrectly assumed that the parent would
> always initialize the pthread_barrier for the child thread. This
> reverts the change and replaces the fix for wp-fork-with-event with the
> original use of atomic_bool.
>
> Edward Liaw (3):
> Revert "selftests/mm: fix deadlock for fork after pthread_create on
> ARM"
> Revert "selftests/mm: replace atomic_bool with pthread_barrier_t"
> selftests/mm: fix deadlock for fork after pthread_create with
> atomic_bool
I added cc:stable to the first two patches as the thing-being-reverted
was cc:stable.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2024-10-18 21:13 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-10-18 17:17 [PATCH 0/3] selftests/mm: revert pthread_barrier change and Edward Liaw
2024-10-18 17:17 ` [PATCH 1/3] Revert "selftests/mm: fix deadlock for fork after pthread_create on ARM" Edward Liaw
2024-10-18 17:17 ` [PATCH 2/3] Revert "selftests/mm: replace atomic_bool with pthread_barrier_t" Edward Liaw
2024-10-18 17:17 ` [PATCH 3/3] selftests/mm: fix deadlock for fork after pthread_create with atomic_bool Edward Liaw
2024-10-18 21:13 ` [PATCH 0/3] selftests/mm: revert pthread_barrier change and Andrew Morton
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox