4.9-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Breno Leitao <lei...@debian.org>

[ 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: Breno Leitao <lei...@debian.org>
Signed-off-by: Michael Ellerman <m...@ellerman.id.au>
Signed-off-by: Sasha Levin <sas...@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>
---
 tools/testing/selftests/powerpc/tm/tm-tmspr.c |   27 ++++++++++++++++----------
 1 file changed, 17 insertions(+), 10 deletions(-)

--- a/tools/testing/selftests/powerpc/tm/tm-tmspr.c
+++ b/tools/testing/selftests/powerpc/tm/tm-tmspr.c
@@ -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))
+       for (i = 0; i < thread_num; i += 2) {
+               if (pthread_create(&thread[i], NULL, (void *)tfiar_tfhar,
+                                  (void *)i))
                        return EXIT_FAILURE;
        }
-       if (pthread_join(thread, NULL) != 0)
-               return EXIT_FAILURE;
-
        /* Test TEXASR */
-       for (i = 0 ; i < thread_num ; i++){
-               if (pthread_create(&thread, NULL, (void*)texasr, (void *)i))
+       for (i = 1; i < thread_num; i += 2) {
+               if (pthread_create(&thread[i], NULL, (void *)texasr, (void *)i))
                        return EXIT_FAILURE;
        }
-       if (pthread_join(thread, NULL) != 0)
-               return EXIT_FAILURE;
+
+       for (i = 0; i < thread_num; i++) {
+               if (pthread_join(thread[i], NULL) != 0)
+                       return EXIT_FAILURE;
+       }
+
+       free(thread);
 
        if (passed)
                return 0;


Reply via email to