eal/windows: fix data race when creating threads
authorTyler Retzlaff <roretzla@linux.microsoft.com>
Thu, 10 Mar 2022 07:35:08 +0000 (23:35 -0800)
committerThomas Monjalon <thomas@monjalon.net>
Wed, 30 Mar 2022 17:01:52 +0000 (19:01 +0200)
eal_thread_loop() uses lcore_config[i].thread_id,
which is stored upon the return from CreateThread().
Per documentation, eal_thread_loop() can start
before CreateThread() returns and the ID is stored.

Create lcore worker threads suspended and then subsequently resume to
allow &lcore_config[i].thread_id be stored before eal_thread_loop
execution.

Fixes: 53ffd9f080fc ("eal/windows: add minimum viable code")
Cc: stable@dpdk.org
Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
Acked-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
lib/eal/windows/eal_thread.c

index 54fa93f..ff84cb4 100644 (file)
@@ -150,13 +150,18 @@ eal_thread_create(pthread_t *thread)
 
        th = CreateThread(NULL, 0,
                (LPTHREAD_START_ROUTINE)(ULONG_PTR)eal_thread_loop,
-                                               NULL, 0, (LPDWORD)thread);
+                                               NULL, CREATE_SUSPENDED, (LPDWORD)thread);
        if (!th)
                return -1;
 
        SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);
        SetThreadPriority(th, THREAD_PRIORITY_NORMAL);
 
+       if (ResumeThread(th) == (DWORD)-1) {
+               (void)CloseHandle(th);
+               return -1;
+       }
+
        return 0;
 }