eal: add function to create control threads
authorOlivier Matz <olivier.matz@6wind.com>
Tue, 24 Apr 2018 14:46:48 +0000 (16:46 +0200)
committerThomas Monjalon <thomas@monjalon.net>
Tue, 24 Apr 2018 22:51:31 +0000 (00:51 +0200)
Many parts of dpdk use their own management threads. Introduce a new
wrapper for thread creation that will be extended in next commits 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>
Reviewed-by: Anatoly Burakov <anatoly.burakov@intel.com>
drivers/net/kni/Makefile
drivers/net/kni/rte_eth_kni.c
lib/librte_eal/common/eal_common_proc.c
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/rte_eal_version.map
lib/librte_vhost/socket.c

index 01eaef0..562e8d2 100644 (file)
@@ -10,6 +10,7 @@ LIB = librte_pmd_kni.a
 
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS)
+CFLAGS += -DALLOW_EXPERIMENTAL_API
 LDLIBS += -lpthread
 LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring
 LDLIBS += -lrte_ethdev -lrte_net -lrte_kvargs -lrte_kni
index 08fc6a3..fdd5925 100644 (file)
@@ -149,7 +149,7 @@ eth_kni_dev_start(struct rte_eth_dev *dev)
        }
 
        if (internals->no_request_thread == 0) {
-               ret = pthread_create(&internals->thread, NULL,
+               ret = rte_ctrl_thread_create(&internals->thread, NULL,
                        kni_handle_request, internals);
                if (ret) {
                        RTE_LOG(ERR, PMD,
index c450c84..abaa085 100644 (file)
@@ -662,7 +662,7 @@ rte_mp_channel_init(void)
                return -1;
        }
 
-       if (pthread_create(&mp_handle_tid, NULL, mp_handle, NULL) < 0) {
+       if (rte_ctrl_thread_create(&mp_handle_tid, NULL, mp_handle, NULL) < 0) {
                RTE_LOG(ERR, EAL, "failed to create mp thead: %s\n",
                        strerror(errno));
                close(mp_fd);
@@ -671,7 +671,7 @@ rte_mp_channel_init(void)
                return -1;
        }
 
-       if (pthread_create(&async_reply_handle_tid, NULL,
+       if (rte_ctrl_thread_create(&async_reply_handle_tid, NULL,
                        async_reply_handle, NULL) < 0) {
                RTE_LOG(ERR, EAL, "failed to create mp thead: %s\n",
                        strerror(errno));
index 40902e4..efbccdd 100644 (file)
@@ -140,3 +140,11 @@ exit:
 
        return ret;
 }
+
+__rte_experimental 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 7312975..30749d0 100644 (file)
@@ -276,6 +276,27 @@ 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.
+ */
+__rte_experimental 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 b5bcfc5..9a49ae6 100644 (file)
@@ -869,10 +869,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 {
@@ -885,7 +885,7 @@ rte_eal_intr_init(void)
                        "Failed to set thread name for interrupt handling\n");
        }
 
-       return -ret;
+       return ret;
 }
 
 static void
index 098e22a..6f5d9fe 100644 (file)
@@ -178,7 +178,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 d02d80b..bc3c02d 100644 (file)
@@ -213,6 +213,7 @@ DPDK_18.02 {
 EXPERIMENTAL {
        global:
 
+       rte_ctrl_thread_create;
        rte_dev_event_callback_register;
        rte_dev_event_callback_unregister;
        rte_dev_event_monitor_start;
index 6eec427..db9be6a 100644 (file)
@@ -476,7 +476,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");
@@ -1020,8 +1020,8 @@ rte_vhost_driver_start(const char *path)
                        return -1;
                }
 
-               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");