Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755622AbcDKXhG (ORCPT ); Mon, 11 Apr 2016 19:37:06 -0400 Received: from mail-pa0-f52.google.com ([209.85.220.52]:33572 "EHLO mail-pa0-f52.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755495AbcDKXg1 (ORCPT ); Mon, 11 Apr 2016 19:36:27 -0400 From: Andrey Vagin To: linux-kernel@vger.kernel.org Cc: Andrey Vagin , Oleg Nesterov , Andrew Morton , Cyrill Gorcunov , Pavel Emelyanov , Roger Luethi , Arnd Bergmann , Arnaldo Carvalho de Melo , David Ahern , Andy Lutomirski , Pavel Odintsov Subject: [PATCH 14/15] task_diag: Enhance fork tool to spawn threads Date: Mon, 11 Apr 2016 16:35:54 -0700 Message-Id: <1460417755-18201-15-git-send-email-avagin@openvz.org> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1460417755-18201-1-git-send-email-avagin@openvz.org> References: <1460417755-18201-1-git-send-email-avagin@openvz.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2897 Lines: 112 From: David Ahern Add option to fork threads as well as processes. Make the sleep time configurable too so that spawned tasks exit on their own. Signed-off-by: David Ahern Signed-off-by: Andrey Vagin --- tools/testing/selftests/task_diag/Makefile | 2 ++ tools/testing/selftests/task_diag/_run.sh | 4 ++-- tools/testing/selftests/task_diag/fork.c | 36 ++++++++++++++++++++++++++---- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/task_diag/Makefile b/tools/testing/selftests/task_diag/Makefile index 69b7934..c9977231 100644 --- a/tools/testing/selftests/task_diag/Makefile +++ b/tools/testing/selftests/task_diag/Makefile @@ -10,6 +10,8 @@ task_diag_comm.o: task_diag_comm.c task_diag_comm.h task_diag_all: task_diag_all.o task_diag_comm.o fork: fork.c + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ -lpthread + task_proc_all: task_proc_all.c clean: diff --git a/tools/testing/selftests/task_diag/_run.sh b/tools/testing/selftests/task_diag/_run.sh index 3f541fe..559f02a 100755 --- a/tools/testing/selftests/task_diag/_run.sh +++ b/tools/testing/selftests/task_diag/_run.sh @@ -2,7 +2,7 @@ set -o pipefail set -e -x -./fork 1000 +./fork 1000 10 nprocesses=`./task_diag_all all --maps | grep 'pid.*tgid.*ppid.*comm fork$' | wc -l` nthreads=`./task_diag_all All --smaps --cred | grep 'pid.*tgid.*ppid.*comm fork$' | wc -l` @@ -12,7 +12,7 @@ nchildren=`./task_diag_all children --pid 1 | grep 'pid.*tgid.*ppid.*comm fork$' killall -9 fork -[ "$nthreads" -eq 1000 ] && +[ "$nthreads" -eq 10000 ] && [ "$nprocesses" -eq 1000 ] && [ "$nchildren" -eq 1000 ] && true || { diff --git a/tools/testing/selftests/task_diag/fork.c b/tools/testing/selftests/task_diag/fork.c index c6e17d1..ebddedd2 100644 --- a/tools/testing/selftests/task_diag/fork.c +++ b/tools/testing/selftests/task_diag/fork.c @@ -2,15 +2,39 @@ #include #include #include +#include +void *f(void *arg) +{ + unsigned long t = (unsigned long) arg; + + sleep(t); + return NULL; +} + +/* usage: fork nproc [mthreads [sleep]] */ int main(int argc, char **argv) { - int i, n; + int i, j, n, m = 0; + unsigned long t_sleep = 1000; + pthread_attr_t attr; + pthread_t id; - if (argc < 2) + if (argc < 2) { + fprintf(stderr, "usage: fork nproc [mthreads [sleep]]\n"); return 1; + } n = atoi(argv[1]); + + if (argc > 2) + m = atoi(argv[2]); + + if (argc > 3) + t_sleep = atoi(argv[3]); + + pthread_attr_init(&attr); + for (i = 0; i < n; i++) { pid_t pid; @@ -20,8 +44,12 @@ int main(int argc, char **argv) return 1; } if (pid == 0) { - while (1) - sleep(1000); + if (m) { + for (j = 0; j < m-1; ++j) + pthread_create(&id, &attr, f, (void *)t_sleep); + } + + sleep(t_sleep); return 0; } } -- 2.5.5