From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 58DB442DD2; Wed, 5 Jul 2023 09:44:27 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2BD39406BC; Wed, 5 Jul 2023 09:44:27 +0200 (CEST) Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by mails.dpdk.org (Postfix) with ESMTP id A112140150; Wed, 5 Jul 2023 09:44:25 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1688543066; x=1720079066; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=Y/oRAHIR73LDtTOMUWW3+gW0My0ytDMrihvRGjx+k9I=; b=I+Mjyq1lk+NyuV8cTmPLxZojsHnLsu1VSrH3tC1/LCM3zZL4hk1cBGOI GilTzwtl63MbHNWk4E1UI8Ojv467gZ19UrApm5ASvHOgGNEt2QfV38UZv tMIZoQ8juyJfbePIwn3XyFZ/4zzoK3fiZgP5efdDXrRgWVsT0EOTfKxaz 7M/J4ff6U7TNO9YS1d8PdJPKUUNnlixNdotNvt9+cu2uwP4lqAm+rzuwA WFYeKRyHjQoGugKKVH+atcg1Ajs6IFgxYc4kA1leBwFVCUXL8rf8F70BS CVer630k1gUGayIjDAhM+n615BHypTH8nZhJcDiB434qkYPGKVg+m1U5r A==; X-IronPort-AV: E=McAfee;i="6600,9927,10761"; a="363307301" X-IronPort-AV: E=Sophos;i="6.01,182,1684825200"; d="scan'208";a="363307301" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Jul 2023 00:44:17 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10761"; a="863636325" X-IronPort-AV: E=Sophos;i="6.01,182,1684825200"; d="scan'208";a="863636325" Received: from unknown (HELO localhost.localdomain) ([10.239.252.104]) by fmsmga001-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Jul 2023 00:44:16 -0700 From: Kaisen You To: dev@dpdk.org Cc: qiming.yang@intel.com, yidingx.zhou@intel.com, Kaisen You , stable@dpdk.org Subject: [PATCH] child process synchronization NIC startup parameters Date: Wed, 5 Jul 2023 15:43:09 +0800 Message-Id: <20230705074309.3237510-1-kaisenx.you@intel.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org In meson_test, because the child process does not synchronize the NIC startup parameters of the parent process at startup, it uses all NICs bound by vfio as startup parameters by default, and an exception occurs in the subsequent hugefile check, causing the test to fail. Synchronize the NIC startup parameters of the parent process to the child process to solve this problem. Fixes: 786b29255c49 ("test: fix file prefix discovery") Cc: stable@dpdk.org Signed-off-by: Kaisen You --- app/test/process.h | 81 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 3 deletions(-) diff --git a/app/test/process.h b/app/test/process.h index 1f073b9c5c..95dffab69c 100644 --- a/app/test/process.h +++ b/app/test/process.h @@ -15,6 +15,8 @@ #include /* strerror */ #include /* readlink */ #include +#include +#include #include /* strlcpy */ @@ -24,6 +26,7 @@ #else #define self "self" #define exe "exe" +#define MAX_EXTRA_ARGS 32 #endif #ifdef RTE_LIB_PDUMP @@ -34,6 +37,50 @@ extern uint16_t flag_for_send_pkts; #endif #endif +/* get cmdline form PID. Read process info form /proc/$PID. */ +static char *get_cmdline_from_pid(pid_t pid, char *buf, int len) +{ + char filename[PATH_MAX]; + char *name = NULL; + int fd; + int ret; + + if (pid < 1 || buf == NULL || len < 0) { + printf("%s: illegal param\n", __func__); + return NULL; + } + + snprintf(filename, PATH_MAX, "/proc/%d/cmdline", pid); + memset(buf, 0, len); + fd = open(filename, O_RDONLY); + if (fd < 0) { + perror("open:"); + return NULL; + } + ret = read(fd, buf, len); + close(fd); + + if (ret < 0) + return NULL; + + if (buf[ret-1] == '\n') + buf[--ret] = 0; + + name = buf; + while (ret) { + if (((unsigned char)*name) < ' ') + *name = ' '; + name++; + ret--; + } + *name = 0; + + if (buf[0]) + return buf; + + return NULL; +} + /* * launches a second copy of the test process using the given argv parameters, * which should include argv[0] as the process name. To identify in the @@ -44,9 +91,15 @@ static inline int process_dup(const char *const argv[], int numargs, const char *env_value) { int num; - char *argv_cpy[numargs + 1]; - int i, status; + char *argv_cpy[MAX_EXTRA_ARGS]; + int i, status, n, s, j; char path[32]; + char buf[1024]; + char *token; + char str_1[] = "-a"; + char str_2[] = " "; + char *argv_str[MAX_EXTRA_ARGS]; + char *argv_copy[MAX_EXTRA_ARGS]; #ifdef RTE_LIB_PDUMP #ifdef RTE_NET_RING pthread_t thread; @@ -113,10 +166,32 @@ process_dup(const char *const argv[], int numargs, const char *env_value) closedir(dir); } #endif + /* Add the -a parameter to the child process start parameter */ + get_cmdline_from_pid(getppid(), buf, 1024); + token = strtok(buf, str_2); + argv_str[0] = strdup(token); + n = 0; + j = 0; + while (token != NULL) { + n = n + 1; + argv_str[n] = strdup(token); + token = strtok(NULL, str_2); + } + for (s = 0; s < n; s++) { + if (strcmp(argv_str[s], str_1) == 0 || + strcmp(argv_str[s + 1], str_1) == 0) { + argv_copy[j] = strdup(argv_str[s + 1]); + j++; + } + } + for (s = 0; s < j; s++) + argv_cpy[numargs + s] = strdup(argv_copy[s]); + printf("Running binary with argv[]:"); - for (i = 0; i < num; i++) + for (i = 0; i < num + j; i++) printf("'%s' ", argv_cpy[i]); printf("\n"); + argv_cpy[numargs + j] = NULL; fflush(stdout); /* set the environment variable */ -- 2.25.1