DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH v2] Add support for pthread_setname
@ 2015-07-29  0:50 Ravi Kerur
  2015-07-29  0:51 ` [dpdk-dev] [PATCH v2] Add support for pthreads setname Ravi Kerur
  0 siblings, 1 reply; 4+ messages in thread
From: Ravi Kerur @ 2015-07-29  0:50 UTC (permalink / raw)
  To: dev

This patch adds support for pthread_setname_np on Linux
and pthread_set_name_np on FreeBSD to aid in debugging by
identifying DPDK threads by it name. Following is the sample
output on Linux and FreeBSD.

On Linux:
rkerur@dpdk-ubuntu# ps H -C testpmd -o 'pid tid cmd comm'
  PID   TID CMD                         COMMAND
32590 32590 x86_64-native-linuxapp-gcc/ testpmd
32590 32591 x86_64-native-linuxapp-gcc/ eal-intr-thread
32590 32592 x86_64-native-linuxapp-gcc/ lcore-slave-1
32590 32593 x86_64-native-linuxapp-gcc/ lcore-slave-2
32590 32594 x86_64-native-linuxapp-gcc/ lcore-slave-3
32590 32595 x86_64-native-linuxapp-gcc/ lcore-slave-4
32590 32596 x86_64-native-linuxapp-gcc/ lcore-slave-5
32590 32597 x86_64-native-linuxapp-gcc/ lcore-slave-6
32590 32598 x86_64-native-linuxapp-gcc/ lcore-slave-7

On FreeBSD:
rkerur@dpdk-bsd:~ # procstat -t 28630
  PID    TID COMM             TDNAME           CPU  PRI STATE   WCHAN
28630 100066 cmdline          -                  0  133 sleep   ttyin
28630 100170 cmdline          lcore-slave-1      1  152 sleep   piperd
28630 100171 cmdline          lcore-slave-2      2  152 sleep   piperd
28630 100172 cmdline          lcore-slave-3      3  152 sleep   piperd

Ravi Kerur (1):
  Add support for pthreads_setname.

 examples/vhost/Makefile                            |  1 +
 examples/vhost/main.c                              | 21 +++++++++++++++++++--
 examples/vhost_xen/Makefile                        |  1 +
 examples/vhost_xen/main.c                          | 21 +++++++++++++++++++--
 lib/librte_eal/bsdapp/eal/eal.c                    |  7 +++++++
 lib/librte_eal/common/include/rte_eal.h            |  3 +++
 lib/librte_eal/linuxapp/eal/Makefile               |  2 ++
 lib/librte_eal/linuxapp/eal/eal.c                  | 11 +++++++++++
 lib/librte_eal/linuxapp/eal/eal_interrupts.c       | 21 +++++++++++++++++++--
 lib/librte_eal/linuxapp/eal/eal_pci_vfio_mp_sync.c | 18 ++++++++++++++++--
 lib/librte_eal/linuxapp/eal/eal_timer.c            | 14 +++++++++++++-
 11 files changed, 111 insertions(+), 9 deletions(-)

-- 
1.9.1

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [dpdk-dev] [PATCH v2] Add support for pthreads setname.
  2015-07-29  0:50 [dpdk-dev] [PATCH v2] Add support for pthread_setname Ravi Kerur
@ 2015-07-29  0:51 ` Ravi Kerur
  2015-07-29 23:56   ` Stephen Hemminger
  0 siblings, 1 reply; 4+ messages in thread
From: Ravi Kerur @ 2015-07-29  0:51 UTC (permalink / raw)
  To: dev

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

Changes in V2:
Remove config support for max thread name len.
Restrict max thread name len to 16 on Linux and FreeBSD.
Fix checkpatch.pl errors.
Changes based on code review comments from Thomas.

Changes in V1:
Add support for _setname_ on Linux and FreeBSD.

Signed-off-by: Ravi Kerur <rkerur@gmail.com>
---
 examples/vhost/Makefile                            |  1 +
 examples/vhost/main.c                              | 21 +++++++++++++++++++--
 examples/vhost_xen/Makefile                        |  1 +
 examples/vhost_xen/main.c                          | 21 +++++++++++++++++++--
 lib/librte_eal/bsdapp/eal/eal.c                    |  7 +++++++
 lib/librte_eal/common/include/rte_eal.h            |  3 +++
 lib/librte_eal/linuxapp/eal/Makefile               |  2 ++
 lib/librte_eal/linuxapp/eal/eal.c                  | 11 +++++++++++
 lib/librte_eal/linuxapp/eal/eal_interrupts.c       | 21 +++++++++++++++++++--
 lib/librte_eal/linuxapp/eal/eal_pci_vfio_mp_sync.c | 18 ++++++++++++++++--
 lib/librte_eal/linuxapp/eal/eal_timer.c            | 14 +++++++++++++-
 11 files changed, 111 insertions(+), 9 deletions(-)

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 1b137b9..cfe3c6c 100644
--- a/examples/vhost/main.c
+++ b/examples/vhost/main.c
@@ -2896,6 +2896,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];
 
 	signal(SIGINT, sigint_handler);
 
@@ -3018,8 +3019,24 @@ 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) {
+
+		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. */
 	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 5d20700..fb79efa 100644
--- a/examples/vhost_xen/main.c
+++ b/examples/vhost_xen/main.c
@@ -1432,6 +1432,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);
@@ -1501,8 +1502,24 @@ 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) {
+
+		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. */
 	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 1b6f705..7c1cd7a 100644
--- a/lib/librte_eal/bsdapp/eal/eal.c
+++ b/lib/librte_eal/bsdapp/eal/eal.c
@@ -467,6 +467,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;
@@ -572,6 +573,12 @@ rte_eal_init(int argc, char **argv)
 				     eal_thread_loop, NULL);
 		if (ret != 0)
 			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);
 	}
 
 	/*
diff --git a/lib/librte_eal/common/include/rte_eal.h b/lib/librte_eal/common/include/rte_eal.h
index f36a792..d2816a8 100644
--- a/lib/librte_eal/common/include/rte_eal.h
+++ b/lib/librte_eal/common/include/rte_eal.h
@@ -51,6 +51,9 @@ extern "C" {
 
 #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).
  */
diff --git a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile
index 376d275..0e49545 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) += malloc_heap.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 33e1067..20acb31 100644
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
@@ -734,6 +734,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;
@@ -863,6 +864,16 @@ rte_eal_init(int argc, char **argv)
 				     eal_thread_loop, NULL);
 		if (ret != 0)
 			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");
 	}
 
 	/*
diff --git a/lib/librte_eal/linuxapp/eal/eal_interrupts.c b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
index 3f87875..c6bd49e 100644
--- a/lib/librte_eal/linuxapp/eal/eal_interrupts.c
+++ b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
@@ -67,6 +67,7 @@
 
 #include "eal_private.h"
 #include "eal_vfio.h"
+#include "eal_thread.h"
 
 #define EAL_INTR_EPOLL_WAIT_FOREVER (-1)
 #define NB_OTHER_INTR               1
@@ -864,7 +865,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);
@@ -879,9 +881,24 @@ rte_eal_intr_init(void)
 	/* 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 {
+		/* 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);
+
+		/*
+		 * 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..b95a055 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 <string.h>
 #include <fcntl.h>
 #include <sys/socket.h>
+#include <pthread.h>
 
 /* 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,6 +376,7 @@ 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");
@@ -383,11 +386,22 @@ pci_vfio_mp_sync_setup(void)
 	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;
 	}
+
+	/* 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;
 }
 
diff --git a/lib/librte_eal/linuxapp/eal/eal_timer.c b/lib/librte_eal/linuxapp/eal/eal_timer.c
index 76a8a65..d76ecbd 100644
--- a/lib/librte_eal/linuxapp/eal/eal_timer.c
+++ b/lib/librte_eal/linuxapp/eal/eal_timer.c
@@ -166,6 +166,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(NOTICE, EAL, "HPET is disabled\n");
@@ -208,12 +209,23 @@ rte_eal_hpet_init(int make_default)
 	 * 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;
 	}
 
+	/*
+	 * 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)
 		eal_timer_source = EAL_TIMER_HPET;
 	return 0;
-- 
1.9.1

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [dpdk-dev] [PATCH v2] Add support for pthreads setname.
  2015-07-29  0:51 ` [dpdk-dev] [PATCH v2] Add support for pthreads setname Ravi Kerur
@ 2015-07-29 23:56   ` Stephen Hemminger
  2015-11-03 14:34     ` Thomas Monjalon
  0 siblings, 1 reply; 4+ messages in thread
From: Stephen Hemminger @ 2015-07-29 23:56 UTC (permalink / raw)
  To: Ravi Kerur; +Cc: dev

On Tue, 28 Jul 2015 17:51:44 -0700
Ravi Kerur <rkerur@gmail.com> wrote:

> This patch adds support for pthread_setname_np on Linux and
> pthread_set_name_np on FreeBSD.
> 
> Changes in V2:
> Remove config support for max thread name len.
> Restrict max thread name len to 16 on Linux and FreeBSD.
> Fix checkpatch.pl errors.
> Changes based on code review comments from Thomas.
> 
> Changes in V1:
> Add support for _setname_ on Linux and FreeBSD.
> 
> Signed-off-by: Ravi Kerur <rkerur@gmail.com>

Looks like good simple solution.
Acked-by: Stephen Hemminger <stephen@networkplumber.org>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [dpdk-dev] [PATCH v2] Add support for pthreads setname.
  2015-07-29 23:56   ` Stephen Hemminger
@ 2015-11-03 14:34     ` Thomas Monjalon
  0 siblings, 0 replies; 4+ messages in thread
From: Thomas Monjalon @ 2015-11-03 14:34 UTC (permalink / raw)
  To: Ravi Kerur; +Cc: dev

> > This patch adds support for pthread_setname_np on Linux and
> > pthread_set_name_np on FreeBSD.
> > 
> > Changes in V2:
> > Remove config support for max thread name len.
> > Restrict max thread name len to 16 on Linux and FreeBSD.
> > Fix checkpatch.pl errors.
> > Changes based on code review comments from Thomas.
> > 
> > Changes in V1:
> > Add support for _setname_ on Linux and FreeBSD.
> > 
> > Signed-off-by: Ravi Kerur <rkerur@gmail.com>
> 
> Looks like good simple solution.
> Acked-by: Stephen Hemminger <stephen@networkplumber.org>

Applied with update of tep_termination. Thanks

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2015-11-03 14:35 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-07-29  0:50 [dpdk-dev] [PATCH v2] Add support for pthread_setname Ravi Kerur
2015-07-29  0:51 ` [dpdk-dev] [PATCH v2] Add support for pthreads setname Ravi Kerur
2015-07-29 23:56   ` Stephen Hemminger
2015-11-03 14:34     ` Thomas Monjalon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).