From patchwork Wed Apr 22 21:06:43 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ravi Kerur X-Patchwork-Id: 4446 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 504499AD8; Wed, 22 Apr 2015 23:06:50 +0200 (CEST) Received: from mail-pa0-f41.google.com (mail-pa0-f41.google.com [209.85.220.41]) by dpdk.org (Postfix) with ESMTP id DF5617EB0 for ; Wed, 22 Apr 2015 23:06:47 +0200 (CEST) Received: by paboj16 with SMTP id oj16so283445105pab.0 for ; Wed, 22 Apr 2015 14:06:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=pt7DZhDhB6Ppw69Rc1I0btgrmboAX+cH6DDrXefu5Fw=; b=C83G/VgvDEnIV9ZgZwL7Mx+ge6Kxxdf8MPCWhgCFwIef2S6hVU5u7WYV91Vqc8o0Fh q+ONp+ZtFO/eC5VEp3WqRGBuDTbM+MIvAYUyE+P8KNn0sPUtUDwadx8A+94sJFrM5kYd xs/lPXq0mHKTqxzVgUiwugMHPAVediKk23+ENqIRixv79ksAD1lkDCMU/cKuDUj2F93B iy6q0PXgmsxW3JgA0pZjdjmOPAb1cPxXDUdMT2j9wg7JT4NH6NL2UwE25d9F/cE7yvjz 5LEPAFVzEhLlWOfhBGawgpvnLe4y4kNwuZfNVH1Otc2/YhPSABB4xPWSlqP39GoBtYfo Tdxw== X-Received: by 10.68.204.36 with SMTP id kv4mr43599208pbc.37.1429736807257; Wed, 22 Apr 2015 14:06:47 -0700 (PDT) Received: from user-PC.hsd1.ca.comcast.net (c-98-234-176-9.hsd1.ca.comcast.net. [98.234.176.9]) by mx.google.com with ESMTPSA id jd5sm5916956pbd.35.2015.04.22.14.06.46 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 22 Apr 2015 14:06:46 -0700 (PDT) From: Ravi Kerur To: dev@dpdk.org Date: Wed, 22 Apr 2015 14:06:43 -0700 Message-Id: <1429736803-16943-1-git-send-email-rkerur@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1429736748-16874-1-git-send-email-rkerur@gmail.com> References: <1429736748-16874-1-git-send-email-rkerur@gmail.com> Subject: [dpdk-dev] [PATCH] Use pthread_setname APIs X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" use pthread_setname_np and pthread_set_name_np for Linux and FreeBSD respectively. Restrict pthread name len to 16 via config for both Linux and FreeBSD. Testing: Linux: Compiled with both clang and gcc (x86_64-native-linuxapp-gcc and x86_64-native-linuxapp-clang). Compiled examples/vhost. make test. testpmd with I217 NIC. Check /proc//comm file for names. FreeBSD: Compiled with gcc (x86_64-native-bsdapp-gcc) helloworld/testpmd with I218 NIC. Signed-off-by: Ravi Kerur --- config/common_bsdapp | 5 +++++ config/common_linuxapp | 5 +++++ examples/vhost/Makefile | 1 + examples/vhost/main.c | 18 ++++++++++++++++-- examples/vhost_xen/Makefile | 1 + examples/vhost_xen/main.c | 20 ++++++++++++++++++-- lib/librte_eal/bsdapp/eal/eal.c | 7 +++++++ lib/librte_eal/linuxapp/eal/Makefile | 2 ++ lib/librte_eal/linuxapp/eal/eal.c | 11 +++++++++++ lib/librte_eal/linuxapp/eal/eal_interrupts.c | 20 +++++++++++++++++--- lib/librte_eal/linuxapp/eal/eal_pci_vfio_mp_sync.c | 16 ++++++++++++++-- lib/librte_eal/linuxapp/eal/eal_timer.c | 11 ++++++++++- 12 files changed, 107 insertions(+), 10 deletions(-) diff --git a/config/common_bsdapp b/config/common_bsdapp index c2374c0..9cec72b 100644 --- a/config/common_bsdapp +++ b/config/common_bsdapp @@ -244,6 +244,11 @@ CONFIG_RTE_PMD_RING_MAX_RX_RINGS=16 CONFIG_RTE_PMD_RING_MAX_TX_RINGS=16 # +# Max pthread name len +# +CONFIG_RTE_MAX_THREAD_NAME_LEN=16 + +# # Compile software PMD backed by PCAP files # CONFIG_RTE_LIBRTE_PMD_PCAP=y diff --git a/config/common_linuxapp b/config/common_linuxapp index 0078dc9..efa0db7 100644 --- a/config/common_linuxapp +++ b/config/common_linuxapp @@ -241,6 +241,11 @@ CONFIG_RTE_PMD_RING_MAX_RX_RINGS=16 CONFIG_RTE_PMD_RING_MAX_TX_RINGS=16 # +# Max pthread name len +# +CONFIG_RTE_MAX_THREAD_NAME_LEN=16 + +# # Compile software PMD backed by PCAP files # CONFIG_RTE_LIBRTE_PMD_PCAP=n diff --git a/examples/vhost/Makefile b/examples/vhost/Makefile index c269466..e95c68a 100644 --- a/examples/vhost/Makefile +++ b/examples/vhost/Makefile @@ -52,6 +52,7 @@ SRCS-y := main.c CFLAGS += -O2 -D_FILE_OFFSET_BITS=64 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -D_GNU_SOURCE include $(RTE_SDK)/mk/rte.extapp.mk diff --git a/examples/vhost/main.c b/examples/vhost/main.c index ad10f82..d337e88 100644 --- a/examples/vhost/main.c +++ b/examples/vhost/main.c @@ -2891,6 +2891,7 @@ main(int argc, char *argv[]) uint8_t portid; uint16_t queue_id; static pthread_t tid; + char thread_name[RTE_MAX_THREAD_NAME_LEN]; /* init EAL */ ret = rte_eal_init(argc, argv); @@ -3017,8 +3018,21 @@ main(int argc, char *argv[]) memset(&dev_statistics, 0, sizeof(dev_statistics)); /* Enable stats if the user option is set. */ - if (enable_stats) - pthread_create(&tid, NULL, (void*)print_stats, NULL ); + if (enable_stats) { + snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, "print-stats"); + + ret = pthread_create(&tid, NULL, (void*)print_stats, NULL ); + + if (ret != 0) + rte_exit(EXIT_FAILURE, + "Cannot create print-stats thread\n"); + + 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. */ if (zero_copy == 0) { diff --git a/examples/vhost_xen/Makefile b/examples/vhost_xen/Makefile index e6fa1a1..47e1489 100644 --- a/examples/vhost_xen/Makefile +++ b/examples/vhost_xen/Makefile @@ -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 += $(WERROR_FLAGS) +CFLAGS += -D_GNU_SOURCE LDFLAGS += -lxenstore include $(RTE_SDK)/mk/rte.extapp.mk diff --git a/examples/vhost_xen/main.c b/examples/vhost_xen/main.c index b4a86e3..7bce482 100644 --- a/examples/vhost_xen/main.c +++ b/examples/vhost_xen/main.c @@ -1433,6 +1433,7 @@ main(int argc, char *argv[]) int ret; uint8_t portid; static pthread_t tid; + char thread_name[RTE_MAX_THREAD_NAME_LEN]; /* init EAL */ ret = rte_eal_init(argc, argv); @@ -1505,8 +1506,23 @@ main(int argc, char *argv[]) memset(&dev_statistics, 0, sizeof(dev_statistics)); /* Enable stats if the user option is set. */ - if (enable_stats) - pthread_create(&tid, NULL, (void*)print_stats, NULL ); + if (enable_stats) { + + snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, + "print-xen-stats"); + + ret = pthread_create(&tid, NULL, (void*)print_stats, NULL ); + + if (ret != 0) + rte_exit(EXIT_FAILURE, + "Cannot create print-stats thread\n"); + + 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. */ RTE_LCORE_FOREACH_SLAVE(lcore_id) { diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c index 871d5f4..4dc25a8 100644 --- a/lib/librte_eal/bsdapp/eal/eal.c +++ b/lib/librte_eal/bsdapp/eal/eal.c @@ -438,6 +438,7 @@ rte_eal_init(int argc, char **argv) pthread_t thread_id; static rte_atomic32_t run_once = RTE_ATOMIC32_INIT(0); char cpuset[RTE_CPU_AFFINITY_STR_LEN]; + char thread_name[RTE_MAX_THREAD_NAME_LEN]; if (!rte_atomic32_test_and_set(&run_once)) return -1; @@ -525,6 +526,9 @@ rte_eal_init(int argc, char **argv) RTE_LCORE_FOREACH_SLAVE(i) { + snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, + "lcore-slave-%d", i); + /* * create communication pipes between master thread * and children @@ -541,6 +545,9 @@ rte_eal_init(int argc, char **argv) eal_thread_loop, NULL); if (ret != 0) rte_panic("Cannot create thread\n"); + + pthread_set_name_np(lcore_config[i].thread_id, + (const char *)thread_name); } /* diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile index 01f7b70..c7aba70 100644 --- a/lib/librte_eal/linuxapp/eal/Makefile +++ b/lib/librte_eal/linuxapp/eal/Makefile @@ -93,6 +93,8 @@ SRCS-$(CONFIG_RTE_LIBRTE_EAL_LINUXAPP) += eal_common_thread.c CFLAGS_eal.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_thread.o := -D_GNU_SOURCE CFLAGS_eal_log.o := -D_GNU_SOURCE diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c index bd770cf..058aed7 100644 --- a/lib/librte_eal/linuxapp/eal/eal.c +++ b/lib/librte_eal/linuxapp/eal/eal.c @@ -705,6 +705,7 @@ rte_eal_init(int argc, char **argv) struct shared_driver *solib = NULL; const char *logid; char cpuset[RTE_CPU_AFFINITY_STR_LEN]; + char thread_name[RTE_MAX_THREAD_NAME_LEN]; if (!rte_atomic32_test_and_set(&run_once)) return -1; @@ -816,6 +817,9 @@ rte_eal_init(int argc, char **argv) RTE_LCORE_FOREACH_SLAVE(i) { + snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, + "lcore-slave-%d", i); + /* * create communication pipes between master thread * and children @@ -832,6 +836,13 @@ rte_eal_init(int argc, char **argv) eal_thread_loop, NULL); if (ret != 0) rte_panic("Cannot create thread\n"); + + 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"); } /* diff --git a/lib/librte_eal/linuxapp/eal/eal_interrupts.c b/lib/librte_eal/linuxapp/eal/eal_interrupts.c index 66deda2..a844435 100644 --- a/lib/librte_eal/linuxapp/eal/eal_interrupts.c +++ b/lib/librte_eal/linuxapp/eal/eal_interrupts.c @@ -66,6 +66,7 @@ #include "eal_private.h" #include "eal_vfio.h" +#include "eal_thread.h" #define EAL_INTR_EPOLL_WAIT_FOREVER (-1) @@ -837,7 +838,8 @@ eal_intr_thread_main(__rte_unused void *arg) int 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 */ TAILQ_INIT(&intr_sources); @@ -849,13 +851,25 @@ rte_eal_intr_init(void) if (pipe(intr_pipe.pipefd) < 0) return -1; + snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, "eal-intr-thread"); + + /* create the host thread to wait/handle the interrupt */ ret = pthread_create(&intr_thread, NULL, eal_intr_thread_main, NULL); - if (ret != 0) + if (ret != 0) { RTE_LOG(ERR, EAL, "Failed to create thread for interrupt handling\n"); + } else { + ret_1 = pthread_setname_np(intr_thread, thread_name); + + /* + * Log an error if setname fails and return rc of pthread_create. + */ + if (ret_1 != 0) + RTE_LOG(ERR, EAL, + "Failed to set thread name for interrupt handling\n"); + } return -ret; } - diff --git a/lib/librte_eal/linuxapp/eal/eal_pci_vfio_mp_sync.c b/lib/librte_eal/linuxapp/eal/eal_pci_vfio_mp_sync.c index fec7080..c7ad972 100644 --- a/lib/librte_eal/linuxapp/eal/eal_pci_vfio_mp_sync.c +++ b/lib/librte_eal/linuxapp/eal/eal_pci_vfio_mp_sync.c @@ -34,6 +34,7 @@ #include #include #include +#include /* sys/un.h with __USE_MISC uses strlen, which is unsafe */ #ifdef __USE_MISC @@ -54,6 +55,7 @@ #include "eal_filesystem.h" #include "eal_pci_init.h" +#include "eal_thread.h" /** * @file @@ -374,20 +376,30 @@ int pci_vfio_mp_sync_setup(void) { int ret; + char thread_name[RTE_MAX_THREAD_NAME_LEN]; if (vfio_mp_sync_socket_setup() < 0) { RTE_LOG(ERR, EAL, "Failed to set up local socket!\n"); return -1; } + snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, "pci-vfio-sync"); + ret = pthread_create(&socket_thread, NULL, pci_vfio_mp_sync_thread, NULL); if (ret) { - RTE_LOG(ERR, EAL, "Failed to create thread for communication with " - "secondary processes!\n"); + RTE_LOG(ERR, EAL, + "Failed to create thread for communication with secondary processes!\n"); close(mp_socket_fd); return -1; } + + 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; } diff --git a/lib/librte_eal/linuxapp/eal/eal_timer.c b/lib/librte_eal/linuxapp/eal/eal_timer.c index 169c6e1..8f85b2a 100644 --- a/lib/librte_eal/linuxapp/eal/eal_timer.c +++ b/lib/librte_eal/linuxapp/eal/eal_timer.c @@ -186,6 +186,7 @@ int rte_eal_hpet_init(int make_default) { int fd, ret; + char thread_name[RTE_MAX_THREAD_NAME_LEN]; if (internal_config.no_hpet) { RTE_LOG(INFO, EAL, "HPET is disabled\n"); @@ -224,16 +225,24 @@ rte_eal_hpet_init(int make_default) eal_hpet_msb = (eal_hpet->counter_l >> 30); + snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, "hpet-msb-inc"); + /* 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, (void *(*)(void *))hpet_msb_inc, NULL); - if (ret < 0) { + if (ret != 0) { RTE_LOG(ERR, EAL, "ERROR: Cannot create HPET timer thread!\n"); internal_config.no_hpet = 1; return -1; } + 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) eal_timer_source = EAL_TIMER_HPET; return 0;