From patchwork Mon Feb 13 13:41:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo Liang X-Patchwork-Id: 1741649 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.linux.it (client-ip=213.254.12.146; helo=picard.linux.it; envelope-from=ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it; receiver=) Received: from picard.linux.it (picard.linux.it [213.254.12.146]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4PFlqW57RVz23hX for ; Tue, 14 Feb 2023 00:41:26 +1100 (AEDT) Received: from picard.linux.it (localhost [IPv6:::1]) by picard.linux.it (Postfix) with ESMTP id EBCBF3CBF8B for ; Mon, 13 Feb 2023 14:41:22 +0100 (CET) X-Original-To: ltp@lists.linux.it Delivered-To: ltp@picard.linux.it Received: from in-6.smtp.seeweb.it (in-6.smtp.seeweb.it [217.194.8.6]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384)) (No client certificate requested) by picard.linux.it (Postfix) with ESMTPS id D4DF73CB0FA for ; Mon, 13 Feb 2023 14:41:20 +0100 (CET) Received: from Atcsqr.andestech.com (60-248-80-70.hinet-ip.hinet.net [60.248.80.70]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by in-6.smtp.seeweb.it (Postfix) with ESMTPS id 6D344140098D for ; Mon, 13 Feb 2023 14:41:17 +0100 (CET) Received: from mail.andestech.com (ATCPCS16.andestech.com [10.0.1.222]) by Atcsqr.andestech.com with ESMTP id 31DDfAu2009697; Mon, 13 Feb 2023 21:41:10 +0800 (+08) (envelope-from ycliang@andestech.com) Received: from atctrx.andestech.com (10.0.15.173) by ATCPCS16.andestech.com (10.0.1.222) with Microsoft SMTP Server id 14.3.498.0; Mon, 13 Feb 2023 21:41:09 +0800 From: Leo Yu-Chi Liang To: Date: Mon, 13 Feb 2023 21:41:04 +0800 Message-ID: <20230213134104.229241-1-ycliang@andestech.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 X-Originating-IP: [10.0.15.173] X-DNSRBL: X-SPAM-SOURCE-CHECK: pass X-MAIL: Atcsqr.andestech.com 31DDfAu2009697 X-Virus-Scanned: clamav-milter 0.102.4 at in-6.smtp.seeweb.it X-Virus-Status: Clean X-Spam-Status: No, score=0.4 required=7.0 tests=PDS_RDNS_DYNAMIC_FP, RDNS_DYNAMIC,SPF_HELO_NONE,SPF_PASS autolearn=disabled version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on in-6.smtp.seeweb.it Subject: [LTP] [PATCH 1/1] lib/tst_pid.c: Count used pid by traversing /proc X-BeenThere: ltp@lists.linux.it X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux Test Project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it Sender: "ltp" Use "ps -eT | wc -l" to calculate the number of used pid could have an incorrectly larger result because "ps -eT" may list the same pid multiple times (with different SPID). Instead, we could count used pid by traversing /proc directory and count the subdirectories that have name composed of digits. Increase PIDS_RESERVED to avoid fork failure. Signed-off-by: Leo Yu-Chi Liang Reviewed-by: Petr Vorel --- lib/tst_pid.c | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/lib/tst_pid.c b/lib/tst_pid.c index 5595e79bd..7582e4828 100644 --- a/lib/tst_pid.c +++ b/lib/tst_pid.c @@ -18,6 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include #include #include @@ -35,7 +36,7 @@ #define CGROUPS_V1_SLICE_FMT "/sys/fs/cgroup/pids/user.slice/user-%d.slice/pids.max" #define CGROUPS_V2_SLICE_FMT "/sys/fs/cgroup/user.slice/user-%d.slice/pids.max" /* Leave some available processes for the OS */ -#define PIDS_RESERVE 50 +#define PIDS_RESERVE 200 pid_t tst_get_unused_pid_(void (*cleanup_fn) (void)) { @@ -113,21 +114,16 @@ static int get_session_pids_limit(void (*cleanup_fn) (void)) int tst_get_free_pids_(void (*cleanup_fn) (void)) { - FILE *f; - int rc, used_pids, max_pids, max_session_pids, max_threads; - - f = popen("ps -eT | wc -l", "r"); - if (!f) { - tst_brkm(TBROK, cleanup_fn, "Could not run 'ps' to calculate used pids"); - return -1; - } - rc = fscanf(f, "%i", &used_pids); - pclose(f); - - if (rc != 1 || used_pids < 0) { - tst_brkm(TBROK, cleanup_fn, "Could not read output of 'ps' to calculate used pids"); - return -1; + DIR *f; + struct dirent *ent; + int max_pids, max_session_pids, max_threads, used_pids = 0; + + f = SAFE_OPENDIR("/proc"); + while ((ent = SAFE_READDIR(f))) { + if (isdigit(ent->d_name[0])) + ++used_pids; } + SAFE_CLOSEDIR(f); SAFE_FILE_SCANF(cleanup_fn, PID_MAX_PATH, "%d", &max_pids); SAFE_FILE_SCANF(cleanup_fn, THREADS_MAX_PATH, "%d", &max_threads);