eal: set name to threads

This patch adds support for pthread_setname_np on Linux and
pthread_set_name_np on FreeBSD.

Signed-off-by: Ravi Kerur <rkerur@gmail.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
[Thomas: add name in tep_termination example]
This commit is contained in:
Ravi Kerur 2015-07-28 17:51:44 -07:00 committed by Thomas Monjalon
parent 9c5b8d8b9f
commit 67b6d3039e
13 changed files with 99 additions and 11 deletions

View File

@ -51,5 +51,6 @@ SRCS-y := main.c vxlan_setup.c vxlan.c
CFLAGS += -O3 CFLAGS += -O3
CFLAGS += $(WERROR_FLAGS) CFLAGS += $(WERROR_FLAGS)
CFLAGS += -D_GNU_SOURCE
include $(RTE_SDK)/mk/rte.extapp.mk include $(RTE_SDK)/mk/rte.extapp.mk

View File

@ -1167,6 +1167,7 @@ main(int argc, char *argv[])
uint8_t portid; uint8_t portid;
uint16_t queue_id; uint16_t queue_id;
static pthread_t tid; static pthread_t tid;
char thread_name[RTE_MAX_THREAD_NAME_LEN];
/* init EAL */ /* init EAL */
ret = rte_eal_init(argc, argv); ret = rte_eal_init(argc, argv);
@ -1243,8 +1244,15 @@ main(int argc, char *argv[])
memset(&dev_statistics, 0, sizeof(dev_statistics)); memset(&dev_statistics, 0, sizeof(dev_statistics));
/* Enable stats if the user option is set. */ /* Enable stats if the user option is set. */
if (enable_stats) if (enable_stats) {
pthread_create(&tid, NULL, (void *)print_stats, NULL); ret = pthread_create(&tid, NULL, (void *)print_stats, NULL);
if (ret != 0)
rte_exit(EXIT_FAILURE, "Cannot create print-stats thread\n");
snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, "print-stats");
ret = pthread_setname_np(tid, thread_name);
if (ret != 0)
RTE_LOG(ERR, VHOST_CONFIG, "Cannot set print-stats name\n");
}
/* Launch all data cores. */ /* Launch all data cores. */
RTE_LCORE_FOREACH_SLAVE(lcore_id) { RTE_LCORE_FOREACH_SLAVE(lcore_id) {

View File

@ -52,6 +52,7 @@ SRCS-y := main.c
CFLAGS += -O2 -D_FILE_OFFSET_BITS=64 CFLAGS += -O2 -D_FILE_OFFSET_BITS=64
CFLAGS += $(WERROR_FLAGS) CFLAGS += $(WERROR_FLAGS)
CFLAGS += -D_GNU_SOURCE
include $(RTE_SDK)/mk/rte.extapp.mk include $(RTE_SDK)/mk/rte.extapp.mk

View File

@ -2896,6 +2896,7 @@ main(int argc, char *argv[])
uint8_t portid; uint8_t portid;
uint16_t queue_id; uint16_t queue_id;
static pthread_t tid; static pthread_t tid;
char thread_name[RTE_MAX_THREAD_NAME_LEN];
signal(SIGINT, sigint_handler); signal(SIGINT, sigint_handler);
@ -3018,8 +3019,19 @@ main(int argc, char *argv[])
memset(&dev_statistics, 0, sizeof(dev_statistics)); memset(&dev_statistics, 0, sizeof(dev_statistics));
/* Enable stats if the user option is set. */ /* Enable stats if the user option is set. */
if (enable_stats) if (enable_stats) {
pthread_create(&tid, NULL, (void*)print_stats, NULL ); ret = pthread_create(&tid, NULL, (void *)print_stats, NULL);
if (ret != 0)
rte_exit(EXIT_FAILURE,
"Cannot create print-stats thread\n");
/* Set thread_name for aid in debugging. */
snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, "print-stats");
ret = pthread_setname_np(tid, thread_name);
if (ret != 0)
RTE_LOG(ERR, VHOST_CONFIG,
"Cannot set print-stats name\n");
}
/* Launch all data cores. */ /* Launch all data cores. */
if (zero_copy == 0) { if (zero_copy == 0) {

View File

@ -46,6 +46,7 @@ SRCS-y := main.c vhost_monitor.c xenstore_parse.c
CFLAGS += -O2 -I/usr/local/include -D_FILE_OFFSET_BITS=64 -Wno-unused-parameter CFLAGS += -O2 -I/usr/local/include -D_FILE_OFFSET_BITS=64 -Wno-unused-parameter
CFLAGS += $(WERROR_FLAGS) CFLAGS += $(WERROR_FLAGS)
CFLAGS += -D_GNU_SOURCE
LDFLAGS += -lxenstore LDFLAGS += -lxenstore
include $(RTE_SDK)/mk/rte.extapp.mk include $(RTE_SDK)/mk/rte.extapp.mk

View File

@ -1432,6 +1432,7 @@ main(int argc, char *argv[])
int ret; int ret;
uint8_t portid; uint8_t portid;
static pthread_t tid; static pthread_t tid;
char thread_name[RTE_MAX_THREAD_NAME_LEN];
/* init EAL */ /* init EAL */
ret = rte_eal_init(argc, argv); ret = rte_eal_init(argc, argv);
@ -1501,8 +1502,19 @@ main(int argc, char *argv[])
memset(&dev_statistics, 0, sizeof(dev_statistics)); memset(&dev_statistics, 0, sizeof(dev_statistics));
/* Enable stats if the user option is set. */ /* Enable stats if the user option is set. */
if (enable_stats) if (enable_stats) {
pthread_create(&tid, NULL, (void*)print_stats, NULL ); ret = pthread_create(&tid, NULL, (void *)print_stats, NULL);
if (ret != 0)
rte_exit(EXIT_FAILURE,
"Cannot create print-stats thread\n");
/* Set thread_name for aid in debugging. */
snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, "print-xen-stats");
ret = pthread_setname_np(tid, thread_name);
if (ret != 0)
RTE_LOG(ERR, VHOST_CONFIG,
"Cannot set print-stats name\n");
}
/* Launch all data cores. */ /* Launch all data cores. */
RTE_LCORE_FOREACH_SLAVE(lcore_id) { RTE_LCORE_FOREACH_SLAVE(lcore_id) {

View File

@ -467,6 +467,7 @@ rte_eal_init(int argc, char **argv)
pthread_t thread_id; pthread_t thread_id;
static rte_atomic32_t run_once = RTE_ATOMIC32_INIT(0); static rte_atomic32_t run_once = RTE_ATOMIC32_INIT(0);
char cpuset[RTE_CPU_AFFINITY_STR_LEN]; char cpuset[RTE_CPU_AFFINITY_STR_LEN];
char thread_name[RTE_MAX_THREAD_NAME_LEN];
if (!rte_atomic32_test_and_set(&run_once)) if (!rte_atomic32_test_and_set(&run_once))
return -1; return -1;
@ -572,6 +573,11 @@ rte_eal_init(int argc, char **argv)
eal_thread_loop, NULL); eal_thread_loop, NULL);
if (ret != 0) if (ret != 0)
rte_panic("Cannot create thread\n"); rte_panic("Cannot create thread\n");
/* Set thread_name for aid in debugging. */
snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN,
"lcore-slave-%d", i);
pthread_set_name_np(lcore_config[i].thread_id, thread_name);
} }
/* /*

View File

@ -51,6 +51,9 @@ extern "C" {
#define RTE_MAGIC 19820526 /**< Magic number written by the main partition when ready. */ #define RTE_MAGIC 19820526 /**< Magic number written by the main partition when ready. */
/* Maximum thread_name length. */
#define RTE_MAX_THREAD_NAME_LEN 16
/** /**
* The lcore role (used in RTE or not). * The lcore role (used in RTE or not).
*/ */

View File

@ -93,6 +93,8 @@ SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += malloc_heap.c
CFLAGS_eal.o := -D_GNU_SOURCE CFLAGS_eal.o := -D_GNU_SOURCE
CFLAGS_eal_interrupts.o := -D_GNU_SOURCE CFLAGS_eal_interrupts.o := -D_GNU_SOURCE
CFLAGS_eal_pci_vfio_mp_sync.o := -D_GNU_SOURCE
CFLAGS_eal_timer.o := -D_GNU_SOURCE
CFLAGS_eal_lcore.o := -D_GNU_SOURCE CFLAGS_eal_lcore.o := -D_GNU_SOURCE
CFLAGS_eal_thread.o := -D_GNU_SOURCE CFLAGS_eal_thread.o := -D_GNU_SOURCE
CFLAGS_eal_log.o := -D_GNU_SOURCE CFLAGS_eal_log.o := -D_GNU_SOURCE

View File

@ -734,6 +734,7 @@ rte_eal_init(int argc, char **argv)
struct shared_driver *solib = NULL; struct shared_driver *solib = NULL;
const char *logid; const char *logid;
char cpuset[RTE_CPU_AFFINITY_STR_LEN]; char cpuset[RTE_CPU_AFFINITY_STR_LEN];
char thread_name[RTE_MAX_THREAD_NAME_LEN];
if (!rte_atomic32_test_and_set(&run_once)) if (!rte_atomic32_test_and_set(&run_once))
return -1; return -1;
@ -863,6 +864,15 @@ rte_eal_init(int argc, char **argv)
eal_thread_loop, NULL); eal_thread_loop, NULL);
if (ret != 0) if (ret != 0)
rte_panic("Cannot create thread\n"); rte_panic("Cannot create thread\n");
/* Set thread_name for aid in debugging. */
snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN,
"lcore-slave-%d", i);
ret = pthread_setname_np(lcore_config[i].thread_id,
thread_name);
if (ret != 0)
RTE_LOG(ERR, EAL,
"Cannot set name for lcore thread\n");
} }
/* /*

View File

@ -67,6 +67,7 @@
#include "eal_private.h" #include "eal_private.h"
#include "eal_vfio.h" #include "eal_vfio.h"
#include "eal_thread.h"
#define EAL_INTR_EPOLL_WAIT_FOREVER (-1) #define EAL_INTR_EPOLL_WAIT_FOREVER (-1)
#define NB_OTHER_INTR 1 #define NB_OTHER_INTR 1
@ -860,7 +861,8 @@ eal_intr_thread_main(__rte_unused void *arg)
int int
rte_eal_intr_init(void) rte_eal_intr_init(void)
{ {
int ret = 0; int ret = 0, ret_1 = 0;
char thread_name[RTE_MAX_THREAD_NAME_LEN];
/* init the global interrupt source head */ /* init the global interrupt source head */
TAILQ_INIT(&intr_sources); TAILQ_INIT(&intr_sources);
@ -875,9 +877,18 @@ rte_eal_intr_init(void)
/* create the host thread to wait/handle the interrupt */ /* create the host thread to wait/handle the interrupt */
ret = pthread_create(&intr_thread, NULL, ret = pthread_create(&intr_thread, NULL,
eal_intr_thread_main, NULL); eal_intr_thread_main, NULL);
if (ret != 0) if (ret != 0) {
RTE_LOG(ERR, EAL, RTE_LOG(ERR, EAL,
"Failed to create thread for interrupt handling\n"); "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 = pthread_setname_np(intr_thread, thread_name);
if (ret_1 != 0)
RTE_LOG(ERR, EAL,
"Failed to set thread name for interrupt handling\n");
}
return -ret; return -ret;
} }

View File

@ -34,6 +34,7 @@
#include <string.h> #include <string.h>
#include <fcntl.h> #include <fcntl.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <pthread.h>
/* sys/un.h with __USE_MISC uses strlen, which is unsafe */ /* sys/un.h with __USE_MISC uses strlen, which is unsafe */
#ifdef __USE_MISC #ifdef __USE_MISC
@ -54,6 +55,7 @@
#include "eal_filesystem.h" #include "eal_filesystem.h"
#include "eal_pci_init.h" #include "eal_pci_init.h"
#include "eal_thread.h"
/** /**
* @file * @file
@ -374,6 +376,7 @@ int
pci_vfio_mp_sync_setup(void) pci_vfio_mp_sync_setup(void)
{ {
int ret; int ret;
char thread_name[RTE_MAX_THREAD_NAME_LEN];
if (vfio_mp_sync_socket_setup() < 0) { if (vfio_mp_sync_socket_setup() < 0) {
RTE_LOG(ERR, EAL, "Failed to set up local socket!\n"); RTE_LOG(ERR, EAL, "Failed to set up local socket!\n");
@ -383,11 +386,19 @@ pci_vfio_mp_sync_setup(void)
ret = pthread_create(&socket_thread, NULL, ret = pthread_create(&socket_thread, NULL,
pci_vfio_mp_sync_thread, NULL); pci_vfio_mp_sync_thread, NULL);
if (ret) { if (ret) {
RTE_LOG(ERR, EAL, "Failed to create thread for communication with " RTE_LOG(ERR, EAL,
"secondary processes!\n"); "Failed to create thread for communication with secondary processes!\n");
close(mp_socket_fd); close(mp_socket_fd);
return -1; return -1;
} }
/* Set thread_name for aid in debugging. */
snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, "pci-vfio-sync");
ret = pthread_setname_np(socket_thread, thread_name);
if (ret)
RTE_LOG(ERR, EAL,
"Failed to set thread name for secondary processes!\n");
return 0; return 0;
} }

View File

@ -166,6 +166,7 @@ int
rte_eal_hpet_init(int make_default) rte_eal_hpet_init(int make_default)
{ {
int fd, ret; int fd, ret;
char thread_name[RTE_MAX_THREAD_NAME_LEN];
if (internal_config.no_hpet) { if (internal_config.no_hpet) {
RTE_LOG(NOTICE, EAL, "HPET is disabled\n"); RTE_LOG(NOTICE, EAL, "HPET is disabled\n");
@ -208,12 +209,21 @@ rte_eal_hpet_init(int make_default)
* msb (hpet is 32 bits by default under linux) */ * msb (hpet is 32 bits by default under linux) */
ret = pthread_create(&msb_inc_thread_id, NULL, ret = pthread_create(&msb_inc_thread_id, NULL,
(void *(*)(void *))hpet_msb_inc, NULL); (void *(*)(void *))hpet_msb_inc, NULL);
if (ret < 0) { if (ret != 0) {
RTE_LOG(ERR, EAL, "ERROR: Cannot create HPET timer thread!\n"); RTE_LOG(ERR, EAL, "ERROR: Cannot create HPET timer thread!\n");
internal_config.no_hpet = 1; internal_config.no_hpet = 1;
return -1; return -1;
} }
/*
* Set thread_name for aid in debugging.
*/
snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, "hpet-msb-inc");
ret = pthread_setname_np(msb_inc_thread_id, thread_name);
if (ret != 0)
RTE_LOG(ERR, EAL,
"ERROR: Cannot set HPET timer thread name!\n");
if (make_default) if (make_default)
eal_timer_source = EAL_TIMER_HPET; eal_timer_source = EAL_TIMER_HPET;
return 0; return 0;