From mboxrd@z Thu Jan 1 00:00:00 1970 From: Olivier Matz Subject: [PATCH v2 3/4] eal: set name when creating a control thread Date: Tue, 3 Apr 2018 15:04:38 +0200 Message-ID: <20180403130439.11151-4-olivier.matz@6wind.com> References: <20180403130439.11151-1-olivier.matz@6wind.com> Cc: Anatoly Burakov To: dev@dpdk.org Return-path: Received: from proxy.6wind.com (host.76.145.23.62.rev.coltfrance.com [62.23.145.76]) by dpdk.org (Postfix) with ESMTP id D64401B6D9 for ; Tue, 3 Apr 2018 15:04:56 +0200 (CEST) In-Reply-To: <20180403130439.11151-1-olivier.matz@6wind.com> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" To avoid code duplication, add a parameter to rte_ctrl_thread_create() to specify the name of the thread. This requires to add a wrapper for the thread start routine in rte_thread_init(), which will first wait that the thread is configured. Signed-off-by: Olivier Matz --- drivers/net/kni/rte_eth_kni.c | 3 +- lib/librte_eal/common/eal_common_thread.c | 52 ++++++++++++++++++++++++-- lib/librte_eal/common/include/rte_lcore.h | 7 +++- lib/librte_eal/linuxapp/eal/eal_interrupts.c | 13 ++----- lib/librte_eal/linuxapp/eal/eal_timer.c | 12 +----- lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c | 10 +---- lib/librte_pdump/rte_pdump.c | 10 +---- lib/librte_vhost/socket.c | 7 ++-- 8 files changed, 68 insertions(+), 46 deletions(-) diff --git a/drivers/net/kni/rte_eth_kni.c b/drivers/net/kni/rte_eth_kni.c index 26718eb3e..6b036d8e1 100644 --- a/drivers/net/kni/rte_eth_kni.c +++ b/drivers/net/kni/rte_eth_kni.c @@ -149,7 +149,8 @@ eth_kni_dev_start(struct rte_eth_dev *dev) } if (internals->no_request_thread == 0) { - ret = rte_ctrl_thread_create(&internals->thread, NULL, + ret = rte_ctrl_thread_create(&internals->thread, + "kni_handle_request", NULL, kni_handle_request, internals); if (ret) { RTE_LOG(ERR, PMD, diff --git a/lib/librte_eal/common/eal_common_thread.c b/lib/librte_eal/common/eal_common_thread.c index efbccddbc..575b03e9d 100644 --- a/lib/librte_eal/common/eal_common_thread.c +++ b/lib/librte_eal/common/eal_common_thread.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -141,10 +142,53 @@ eal_thread_dump_affinity(char *str, unsigned size) return ret; } + +struct rte_thread_ctrl_params { + void *(*start_routine)(void *); + void *arg; + pthread_barrier_t configured; +}; + +static void *rte_thread_init(void *arg) +{ + struct rte_thread_ctrl_params *params = arg; + void *(*start_routine)(void *) = params->start_routine; + void *routine_arg = params->arg; + + pthread_barrier_wait(¶ms->configured); + + return start_routine(routine_arg); +} + __rte_experimental int -rte_ctrl_thread_create(pthread_t *thread, - const pthread_attr_t *attr, - void *(*start_routine)(void *), void *arg) +rte_ctrl_thread_create(pthread_t *thread, const char *name, + const pthread_attr_t *attr, + void *(*start_routine)(void *), void *arg) { - return pthread_create(thread, attr, start_routine, arg); + struct rte_thread_ctrl_params params = { + .start_routine = start_routine, + .arg = arg, + }; + int ret; + + pthread_barrier_init(¶ms.configured, NULL, 2); + + ret = pthread_create(thread, attr, rte_thread_init, (void *)¶ms); + if (ret != 0) + return ret; + + if (name != NULL) { + ret = rte_thread_setname(*thread, name); + if (ret < 0) + goto fail; + } + + pthread_barrier_wait(¶ms.configured); + + return 0; + +fail: + pthread_kill(*thread, SIGTERM); + pthread_join(*thread, NULL); + return ret; } diff --git a/lib/librte_eal/common/include/rte_lcore.h b/lib/librte_eal/common/include/rte_lcore.h index f19075a88..f3d9bbb91 100644 --- a/lib/librte_eal/common/include/rte_lcore.h +++ b/lib/librte_eal/common/include/rte_lcore.h @@ -249,10 +249,12 @@ int rte_thread_setname(pthread_t id, const char *name); /** * Create a control thread. * - * Wrapper to pthread_create(). + * Wrapper to pthread_create() and pthread_setname_np(). * * @param thread * Filled with the thread id of the new created thread. + * @param name + * The name of the control thread (max 16 characters including '\0'). * @param attr * Attributes for the new thread. * @param start_routine @@ -264,7 +266,8 @@ int rte_thread_setname(pthread_t id, const char *name); * corresponding to the error number. */ __rte_experimental int -rte_ctrl_thread_create(pthread_t *thread, const pthread_attr_t *attr, +rte_ctrl_thread_create(pthread_t *thread, const char *name, + const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); /** diff --git a/lib/librte_eal/linuxapp/eal/eal_interrupts.c b/lib/librte_eal/linuxapp/eal/eal_interrupts.c index d927fb45d..3f184bed3 100644 --- a/lib/librte_eal/linuxapp/eal/eal_interrupts.c +++ b/lib/librte_eal/linuxapp/eal/eal_interrupts.c @@ -844,7 +844,7 @@ eal_intr_thread_main(__rte_unused void *arg) int rte_eal_intr_init(void) { - int ret = 0, ret_1 = 0; + int ret = 0; char thread_name[RTE_MAX_THREAD_NAME_LEN]; /* init the global interrupt source head */ @@ -860,20 +860,13 @@ rte_eal_intr_init(void) } /* create the host thread to wait/handle the interrupt */ - ret = rte_ctrl_thread_create(&intr_thread, NULL, + snprintf(thread_name, sizeof(thread_name), "eal-intr-thread"); + ret = rte_ctrl_thread_create(&intr_thread, thread_name, NULL, eal_intr_thread_main, NULL); if (ret != 0) { rte_errno = -ret; RTE_LOG(ERR, EAL, "Failed to create thread for interrupt handling\n"); - } else { - /* Set thread_name for aid in debugging. */ - snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, - "eal-intr-thread"); - ret_1 = rte_thread_setname(intr_thread, thread_name); - if (ret_1 != 0) - RTE_LOG(DEBUG, EAL, - "Failed to set thread name for interrupt handling\n"); } return ret; diff --git a/lib/librte_eal/linuxapp/eal/eal_timer.c b/lib/librte_eal/linuxapp/eal/eal_timer.c index f12d2e134..17b178e80 100644 --- a/lib/librte_eal/linuxapp/eal/eal_timer.c +++ b/lib/librte_eal/linuxapp/eal/eal_timer.c @@ -178,7 +178,8 @@ 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 = rte_ctrl_thread_create(&msb_inc_thread_id, NULL, + snprintf(thread_name, sizeof(thread_name), "hpet-msb-inc"); + ret = rte_ctrl_thread_create(&msb_inc_thread_id, thread_name, NULL, (void *(*)(void *))hpet_msb_inc, NULL); if (ret != 0) { RTE_LOG(ERR, EAL, "ERROR: Cannot create HPET timer thread!\n"); @@ -186,15 +187,6 @@ rte_eal_hpet_init(int make_default) return -1; } - /* - * Set thread_name for aid in debugging. - */ - snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, "hpet-msb-inc"); - ret = rte_thread_setname(msb_inc_thread_id, thread_name); - if (ret != 0) - RTE_LOG(DEBUG, EAL, - "Cannot set HPET timer thread name!\n"); - if (make_default) eal_timer_source = EAL_TIMER_HPET; return 0; diff --git a/lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c b/lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c index 072c0a978..0cc726c9b 100644 --- a/lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c +++ b/lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c @@ -374,7 +374,8 @@ vfio_mp_sync_setup(void) return -1; } - ret = rte_ctrl_thread_create(&socket_thread, NULL, + snprintf(thread_name, sizeof(thread_name), "vfio-sync"); + ret = rte_ctrl_thread_create(&socket_thread, thread_name, NULL, vfio_mp_sync_thread, NULL); if (ret) { RTE_LOG(ERR, EAL, @@ -383,13 +384,6 @@ vfio_mp_sync_setup(void) return -1; } - /* Set thread_name for aid in debugging. */ - snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, "vfio-sync"); - ret = rte_thread_setname(socket_thread, thread_name); - if (ret) - RTE_LOG(DEBUG, EAL, - "Failed to set thread name for secondary processes!\n"); - return 0; } diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index 248912c0a..6b86e44ce 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -548,7 +548,8 @@ rte_pdump_init(const char *path) } /* create the host thread to wait/handle pdump requests */ - ret = rte_ctrl_thread_create(&pdump_thread, NULL, + snprintf(thread_name, sizeof(thread_name), "pdump-thread"); + ret = rte_ctrl_thread_create(&pdump_thread, thread_name, NULL, pdump_thread_main, NULL); if (ret != 0) { RTE_LOG(ERR, PDUMP, @@ -556,13 +557,6 @@ rte_pdump_init(const char *path) strerror(-ret), __func__, __LINE__); return -1; } - /* Set thread_name for aid in debugging. */ - snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, "pdump-thread"); - ret = rte_thread_setname(pdump_thread, thread_name); - if (ret != 0) { - RTE_LOG(DEBUG, PDUMP, - "Failed to set thread name for pdump handling\n"); - } return 0; } diff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c index 8112f48e7..e90ec888b 100644 --- a/lib/librte_vhost/socket.c +++ b/lib/librte_vhost/socket.c @@ -467,7 +467,7 @@ vhost_user_reconnect_init(void) } TAILQ_INIT(&reconn_list.head); - ret = rte_ctrl_thread_create(&reconn_tid, NULL, + ret = rte_ctrl_thread_create(&reconn_tid, "vhost_reconnect", NULL, vhost_user_client_reconnect, NULL); if (ret != 0) { RTE_LOG(ERR, VHOST_CONFIG, "failed to create reconnect thread"); @@ -862,8 +862,9 @@ rte_vhost_driver_start(const char *path) return -1; } - int ret = rte_ctrl_thread_create(&fdset_tid, NULL, - fdset_event_dispatch, &vhost_user.fdset); + int ret = rte_ctrl_thread_create(&fdset_tid, + "vhost_dispatch", NULL, fdset_event_dispatch, + &vhost_user.fdset); if (ret != 0) { RTE_LOG(ERR, VHOST_CONFIG, "failed to create fdset handling thread"); -- 2.11.0