Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 38672b57 authored by Breno Leitao's avatar Breno Leitao Committed by Greg Kroah-Hartman
Browse files

powerpc/selftests: Wait all threads to join



[ Upstream commit 693b31b2fc1636f0aa7af53136d3b49f6ad9ff39 ]

Test tm-tmspr might exit before all threads stop executing, because it just
waits for the very last thread to join before proceeding/exiting.

This patch makes sure that all threads that were created will join before
proceeding/exiting.

This patch also guarantees that the amount of threads being created is equal
to thread_num.

Signed-off-by: default avatarBreno Leitao <leitao@debian.org>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 733b1b42
Loading
Loading
Loading
Loading
+17 −10
Original line number Diff line number Diff line
@@ -98,7 +98,7 @@ void texasr(void *in)

int test_tmspr()
{
	pthread_t 	thread;
	pthread_t	*thread;
	int	   	thread_num;
	unsigned long	i;

@@ -107,21 +107,28 @@ int test_tmspr()
	/* To cause some context switching */
	thread_num = 10 * sysconf(_SC_NPROCESSORS_ONLN);

	thread = malloc(thread_num * sizeof(pthread_t));
	if (thread == NULL)
		return EXIT_FAILURE;

	/* Test TFIAR and TFHAR */
	for (i = 0; i < thread_num; i += 2) {
		if (pthread_create(&thread, NULL, (void*)tfiar_tfhar, (void *)i))
		if (pthread_create(&thread[i], NULL, (void *)tfiar_tfhar,
				   (void *)i))
			return EXIT_FAILURE;
	}
	if (pthread_join(thread, NULL) != 0)
	/* Test TEXASR */
	for (i = 1; i < thread_num; i += 2) {
		if (pthread_create(&thread[i], NULL, (void *)texasr, (void *)i))
			return EXIT_FAILURE;
	}

	/* Test TEXASR */
	for (i = 0; i < thread_num; i++) {
		if (pthread_create(&thread, NULL, (void*)texasr, (void *)i))
		if (pthread_join(thread[i], NULL) != 0)
			return EXIT_FAILURE;
	}
	if (pthread_join(thread, NULL) != 0)
		return EXIT_FAILURE;

	free(thread);

	if (passed)
		return 0;