]> git.droids-corp.org - dpdk.git/commitdiff
eal: new function to create control threads
authorOlivier Matz <olivier.matz@6wind.com>
Wed, 29 Nov 2017 09:57:10 +0000 (10:57 +0100)
committerOlivier Matz <olivier.matz@6wind.com>
Fri, 8 Dec 2017 09:51:36 +0000 (10:51 +0100)
Many parts of dpdk use their own management threads. Introduce a new
wrapper for thread creation that will be extended in next commit to set
the name and affinity.

To be consistent with other DPDK APIs, the return value is negative in
case of error, which was not the case for pthread_create().

Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
lib/librte_eal/common/eal_common_thread.c
lib/librte_eal/common/include/rte_lcore.h
lib/librte_eal/linuxapp/eal/eal_interrupts.c
lib/librte_eal/linuxapp/eal/eal_timer.c
lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c
lib/librte_eal/rte_eal_version.map
lib/librte_pdump/rte_pdump.c
lib/librte_vhost/socket.c

index 55e96963b8408388260d3369c4055f8c1da228cb..f1a88f85e5d12d8e49197430c8ea7213081dc988 100644 (file)
@@ -169,3 +169,10 @@ exit:
 
        return ret;
 }
+
+int rte_ctrl_thread_create(pthread_t *thread,
+                       const pthread_attr_t *attr,
+                       void *(*start_routine)(void *), void *arg)
+{
+       return pthread_create(thread, attr, start_routine, arg);
+}
index c89e6bab14f2a9ef52e3bfbced57f3104f908067..11f481c52589ff5f57c6d75d793c7c62c0aa33a7 100644 (file)
@@ -262,6 +262,26 @@ void rte_thread_get_affinity(rte_cpuset_t *cpusetp);
  */
 int rte_thread_setname(pthread_t id, const char *name);
 
+/**
+ * Create a control thread.
+ *
+ * Wrapper to pthread_create().
+ *
+ * @param thread
+ *   Filled with the thread id of the new created thread.
+ * @param attr
+ *   Attributes for the new thread.
+ * @param start_routine
+ *   Function to be executed by the new thread.
+ * @param arg
+ *   Argument passed to start_routine.
+ * @return
+ *   On success, returns 0; on error, it returns a negative value
+ *   corresponding to the error number.
+ */
+int rte_ctrl_thread_create(pthread_t *thread, const pthread_attr_t *attr,
+                       void *(*start_routine)(void *), void *arg);
+
 /**
  * Test if the core supplied has a specific role
  *
index 1c20693d9e5099cd2549b1c5c5fc35dfe5a1a248..8fee317e557f5bc6450eaaeea8902693f92ea6d1 100644 (file)
@@ -889,10 +889,10 @@ rte_eal_intr_init(void)
        }
 
        /* create the host thread to wait/handle the interrupt */
-       ret = pthread_create(&intr_thread, NULL,
+       ret = rte_ctrl_thread_create(&intr_thread, NULL,
                        eal_intr_thread_main, NULL);
        if (ret != 0) {
-               rte_errno = ret;
+               rte_errno = -ret;
                RTE_LOG(ERR, EAL,
                        "Failed to create thread for interrupt handling\n");
        } else {
@@ -905,7 +905,7 @@ rte_eal_intr_init(void)
                        "Failed to set thread name for interrupt handling\n");
        }
 
-       return -ret;
+       return ret;
 }
 
 static void
index a616928bedb336ed699c43f35aa6b7c58649e473..1766f9353538e4684392ea6dac6f05ae43693e36 100644 (file)
@@ -207,7 +207,7 @@ rte_eal_hpet_init(int make_default)
 
        /* create a thread that will increment a global variable for
         * msb (hpet is 32 bits by default under linux) */
-       ret = pthread_create(&msb_inc_thread_id, NULL,
+       ret = rte_ctrl_thread_create(&msb_inc_thread_id, NULL,
                        (void *(*)(void *))hpet_msb_inc, NULL);
        if (ret != 0) {
                RTE_LOG(ERR, EAL, "ERROR: Cannot create HPET timer thread!\n");
index b53ed7eb362faf5bdc3e9e71043171d3350b4942..d104f89200e72fd215c9ffe12d67860929717112 100644 (file)
@@ -403,7 +403,7 @@ vfio_mp_sync_setup(void)
                return -1;
        }
 
-       ret = pthread_create(&socket_thread, NULL,
+       ret = rte_ctrl_thread_create(&socket_thread, NULL,
                        vfio_mp_sync_thread, NULL);
        if (ret) {
                RTE_LOG(ERR, EAL,
index f4f46c1be8b739909151ceeb74a68a6c026e8f2c..49b02aa082ea31a65b5170a0f4843e0ec5337dce 100644 (file)
@@ -203,6 +203,7 @@ DPDK_17.11 {
 EXPERIMENTAL {
        global:
 
+       rte_ctrl_thread_create;
        rte_eal_devargs_insert;
        rte_eal_devargs_parse;
        rte_eal_devargs_remove;
index 44dcc9531f968f15f468ad3f5160b940a72537a8..70de0c48bfdac48d139c7be92728fdacc3a2b2e3 100644 (file)
@@ -577,11 +577,12 @@ rte_pdump_init(const char *path)
        }
 
        /* create the host thread to wait/handle pdump requests */
-       ret = pthread_create(&pdump_thread, NULL, pdump_thread_main, NULL);
+       ret = rte_ctrl_thread_create(&pdump_thread, NULL,
+                               pdump_thread_main, NULL);
        if (ret != 0) {
                RTE_LOG(ERR, PDUMP,
                        "Failed to create the pdump thread:%s, %s:%d\n",
-                       strerror(ret), __func__, __LINE__);
+                       strerror(-ret), __func__, __LINE__);
                return -1;
        }
        /* Set thread_name for aid in debugging. */
index 811e6bf160fd2f393065cdc48b753e14000f9e7d..905d040a4be12b2f84af244bc3d676fd9dc6b536 100644 (file)
@@ -470,7 +470,7 @@ vhost_user_reconnect_init(void)
        }
        TAILQ_INIT(&reconn_list.head);
 
-       ret = pthread_create(&reconn_tid, NULL,
+       ret = rte_ctrl_thread_create(&reconn_tid, NULL,
                             vhost_user_client_reconnect, NULL);
        if (ret != 0) {
                RTE_LOG(ERR, VHOST_CONFIG, "failed to create reconnect thread");
@@ -834,8 +834,8 @@ rte_vhost_driver_start(const char *path)
                return -1;
 
        if (fdset_tid == 0) {
-               int ret = pthread_create(&fdset_tid, NULL, fdset_event_dispatch,
-                                    &vhost_user.fdset);
+               int ret = rte_ctrl_thread_create(&fdset_tid, NULL,
+                       fdset_event_dispatch, &vhost_user.fdset);
                if (ret != 0)
                        RTE_LOG(ERR, VHOST_CONFIG,
                                "failed to create fdset handling thread");