linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [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