From patchwork Tue Mar 31 22:33:38 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Monjalon X-Patchwork-Id: 4212 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 19AC96A95; Wed, 1 Apr 2015 00:34:27 +0200 (CEST) Received: from mail-wg0-f47.google.com (mail-wg0-f47.google.com [74.125.82.47]) by dpdk.org (Postfix) with ESMTP id 562906942 for ; Wed, 1 Apr 2015 00:34:25 +0200 (CEST) Received: by wgbdm7 with SMTP id dm7so34790711wgb.1 for ; Tue, 31 Mar 2015 15:34:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id; bh=CP1N3lq4H4Kz2c6LzCOmkhvyNF45h596gCnuYOUJQBw=; b=i3GfB5HWtjY0GdNWHrPGm3bLa/YN/6OtmdHPWB4GpfGKJbPA1WpNU3RsrvzPbhAr8Z gOafQYmju0Rsy2kIgkQUo0atn2rkQKb4+MVpamSra+qAleodp2V0eIv6qpCCSeWF//Ma K2pHN8zDGKKcTKqQJZGnmByR4Au9HpxxPR6PFdJ/73ap0dO2YF/ZTHgyc/U1cM5Bl5aC dXz8A7BAebsrVk2GgRT1CaIf3xzNGGTzsHigCDR6T6Oa7BFqFH9rDEBT3Zkg8lK6op21 Jz0XnYIhef95NHhLXFZenkorItY4DsEZBuYn4sQuxYmZ2xpBUrYFB9h1xPp8gndUGNQ8 VsQA== X-Gm-Message-State: ALoCoQkKOqaB0acpGOrLuMEhQDS5tS/xUHl3shdWP1QDamXexW90ojRip1dVPTG/7BG3YV0Jr/7P X-Received: by 10.180.82.9 with SMTP id e9mr9292029wiy.88.1427841265169; Tue, 31 Mar 2015 15:34:25 -0700 (PDT) Received: from localhost.localdomain (136-92-190-109.dsl.ovh.fr. [109.190.92.136]) by mx.google.com with ESMTPSA id r14sm475617wiv.13.2015.03.31.15.34.23 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 31 Mar 2015 15:34:24 -0700 (PDT) From: Thomas Monjalon To: dev@dpdk.org Date: Wed, 1 Apr 2015 00:33:38 +0200 Message-Id: <1427841218-23352-1-git-send-email-thomas.monjalon@6wind.com> X-Mailer: git-send-email 2.2.2 Subject: [dpdk-dev] [PATCH] eal: rename --lcores option to --threads 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" Threads are no longer strictly assigned to a lcore with a 1:1 map. So they really should be called threads. The term lcore should be reserved for a physical hyperthreaded CPU part. This patch only renames the option --lcores to avoid confusion from a user perspective. But a deeper cleanup should be done later in EAL: e.g. lcore_id should be renamed to thread_id. Signed-off-by: Thomas Monjalon --- app/test/test_eal_flags.c | 34 ++++----- doc/guides/prog_guide/env_abstraction_layer.rst | 25 ++++--- doc/guides/testpmd_app_ug/run_app.rst | 10 +-- lib/librte_eal/common/eal_common_options.c | 96 ++++++++++++------------- lib/librte_eal/common/eal_options.h | 4 +- 5 files changed, 84 insertions(+), 85 deletions(-) diff --git a/app/test/test_eal_flags.c b/app/test/test_eal_flags.c index 0352f87..1096bea 100644 --- a/app/test/test_eal_flags.c +++ b/app/test/test_eal_flags.c @@ -512,7 +512,7 @@ test_missing_c_flag(void) /* -c flag but no coremask value */ const char *argv1[] = { prgname, prefix, mp_flag, "-n", "3", "-c"}; - /* No -c, -l or --lcores flag at all */ + /* No -c, -l or --threads flag at all */ const char *argv2[] = { prgname, prefix, mp_flag, "-n", "3"}; /* bad coremask value */ const char *argv3[] = { prgname, prefix, mp_flag, @@ -538,37 +538,37 @@ test_missing_c_flag(void) const char *argv11[] = { prgname, prefix, mp_flag, "-n", "3", "-l", "1-2,3" }; - /* --lcores flag but no lcores value */ + /* --threads flag but no lcores value */ const char *argv12[] = { prgname, prefix, mp_flag, - "-n", "3", "--lcores" }; + "-n", "3", "--threads" }; const char *argv13[] = { prgname, prefix, mp_flag, - "-n", "3", "--lcores", " " }; + "-n", "3", "--threads", " " }; /* bad lcores value */ const char *argv14[] = { prgname, prefix, mp_flag, - "-n", "3", "--lcores", "1-3-5" }; + "-n", "3", "--threads", "1-3-5" }; const char *argv15[] = { prgname, prefix, mp_flag, - "-n", "3", "--lcores", "0-1,,2" }; + "-n", "3", "--threads", "0-1,,2" }; const char *argv16[] = { prgname, prefix, mp_flag, - "-n", "3", "--lcores", "0-,1" }; + "-n", "3", "--threads", "0-,1" }; const char *argv17[] = { prgname, prefix, mp_flag, - "-n", "3", "--lcores", "(0-,2-4)" }; + "-n", "3", "--threads", "(0-,2-4)" }; const char *argv18[] = { prgname, prefix, mp_flag, - "-n", "3", "--lcores", "(-1,2)" }; + "-n", "3", "--threads", "(-1,2)" }; const char *argv19[] = { prgname, prefix, mp_flag, - "-n", "3", "--lcores", "(2-4)@(2-4-6)" }; + "-n", "3", "--threads", "(2-4)@(2-4-6)" }; const char *argv20[] = { prgname, prefix, mp_flag, - "-n", "3", "--lcores", "(a,2)" }; + "-n", "3", "--threads", "(a,2)" }; const char *argv21[] = { prgname, prefix, mp_flag, - "-n", "3", "--lcores", "1-3@(1,3)" }; + "-n", "3", "--threads", "1-3@(1,3)" }; const char *argv22[] = { prgname, prefix, mp_flag, - "-n", "3", "--lcores", "3@((1,3)" }; + "-n", "3", "--threads", "3@((1,3)" }; const char *argv23[] = { prgname, prefix, mp_flag, - "-n", "3", "--lcores", "(4-7)=(1,3)" }; + "-n", "3", "--threads", "(4-7)=(1,3)" }; const char *argv24[] = { prgname, prefix, mp_flag, - "-n", "3", "--lcores", "[4-7]@(1,3)" }; + "-n", "3", "--threads", "[4-7]@(1,3)" }; /* sanity check of tests - valid lcores value */ const char *argv25[] = { prgname, prefix, mp_flag, - "-n", "3", "--lcores", + "-n", "3", "--threads", "0-1,2@(5-7),(3-5)@(0,2),(0,6),7"}; if (launch_proc(argv1) == 0 @@ -601,7 +601,7 @@ test_missing_c_flag(void) return -1; } - /* start --lcores tests */ + /* start --threads tests */ if (launch_proc(argv12) == 0 || launch_proc(argv13) == 0 || launch_proc(argv14) == 0 || launch_proc(argv15) == 0 || launch_proc(argv16) == 0 || launch_proc(argv17) == 0 || diff --git a/doc/guides/prog_guide/env_abstraction_layer.rst b/doc/guides/prog_guide/env_abstraction_layer.rst index 1b531e2..8509774 100644 --- a/doc/guides/prog_guide/env_abstraction_layer.rst +++ b/doc/guides/prog_guide/env_abstraction_layer.rst @@ -232,35 +232,34 @@ For further flexibility, it is useful to set pthread affinity not only to a CPU EAL pthread and lcore Affinity ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The term "lcore" refers to an EAL thread, which is really a Linux/FreeBSD pthread. "EAL pthreads" are created and managed by EAL and execute the tasks issued by *remote_launch*. In each EAL pthread, there is a TLS (Thread Local Storage) called *_lcore_id* for unique identification. As EAL pthreads usually bind 1:1 to the physical CPU, the *_lcore_id* is typically equal to the CPU ID. When using multiple pthreads, however, the binding is no longer always 1:1 between an EAL pthread and a specified physical CPU. The EAL pthread may have affinity to a CPU set, and as such the *_lcore_id* will not be the same as the CPU ID. -For this reason, there is an EAL long option '--lcores' defined to assign the CPU affinity of lcores. +For this reason, there is an EAL long option '--threads' defined to assign the CPU affinity of lcores. For a specified lcore ID or ID group, the option allows setting the CPU set for that EAL pthread. The format pattern: - --lcores='[@cpu_set][,[@cpu_set],...]' + --threads='[@cpu_set][,[@cpu_set],...]' -'lcore_set' and 'cpu_set' can be a single number, range or a group. +'thread_set' and 'cpu_set' can be a single number, range or a group. A number is a "digit([0-9]+)"; a range is "-"; a group is "([,,...])". -If a '\@cpu_set' value is not supplied, the value of 'cpu_set' will default to the value of 'lcore_set'. +If a '\@cpu_set' value is not supplied, the value of 'cpu_set' will default to the value of 'thread_set'. :: - For example, "--lcores='1,2@(5-7),(3-5)@(0,2),(0,6),7-8'" which means start 9 EAL thread; - lcore 0 runs on cpuset 0x41 (cpu 0,6); - lcore 1 runs on cpuset 0x2 (cpu 1); - lcore 2 runs on cpuset 0xe0 (cpu 5,6,7); - lcore 3,4,5 runs on cpuset 0x5 (cpu 0,2); - lcore 6 runs on cpuset 0x41 (cpu 0,6); - lcore 7 runs on cpuset 0x80 (cpu 7); - lcore 8 runs on cpuset 0x100 (cpu 8). + For example, "--threads='1,2@(5-7),(3-5)@(0,2),(0,6),7-8'" which means start 9 EAL thread; + thread 0 runs on cpuset 0x41 (cpu 0,6); + thread 1 runs on cpuset 0x2 (cpu 1); + thread 2 runs on cpuset 0xe0 (cpu 5,6,7); + thread 3,4,5 runs on cpuset 0x5 (cpu 0,2); + thread 6 runs on cpuset 0x41 (cpu 0,6); + thread 7 runs on cpuset 0x80 (cpu 7); + thread 8 runs on cpuset 0x100 (cpu 8). Using this option, for each given lcore ID, the associated CPUs can be assigned. It's also compatible with the pattern of corelist('-l') option. diff --git a/doc/guides/testpmd_app_ug/run_app.rst b/doc/guides/testpmd_app_ug/run_app.rst index 6cbbf40..830df56 100644 --- a/doc/guides/testpmd_app_ug/run_app.rst +++ b/doc/guides/testpmd_app_ug/run_app.rst @@ -49,18 +49,18 @@ See the DPDK Getting Started Guide for more information on these options. The argument format is [-c2][,c3[-c4],...] where c1, c2, etc are core indexes between 0 and 128 -* --lcores COREMAP +* --threads COREMAP - Map lcore set to physical cpu set + Map thread set to physical cpu set The argument format is - '[<,lcores[@cpus]>...]' + '[<,threads[@cpus]>...]' - lcores and cpus list are grouped by '(' and ')' + threads and cpus list are grouped by '(' and ')' Within the group, '-' is used for range separator, ',' is used for single number separator. '( )' can be omitted for single element group, - '@' can be omitted if cpus and lcores have the same value + '@' can be omitted if cpus and threads have the same value * --master-lcore ID diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c index 8fcb1ab..68799d0 100644 --- a/lib/librte_eal/common/eal_common_options.c +++ b/lib/librte_eal/common/eal_common_options.c @@ -74,7 +74,6 @@ eal_long_options[] = { {OPT_FILE_PREFIX, 1, NULL, OPT_FILE_PREFIX_NUM }, {OPT_HELP, 0, NULL, OPT_HELP_NUM }, {OPT_HUGE_DIR, 1, NULL, OPT_HUGE_DIR_NUM }, - {OPT_LCORES, 1, NULL, OPT_LCORES_NUM }, {OPT_LOG_LEVEL, 1, NULL, OPT_LOG_LEVEL_NUM }, {OPT_MASTER_LCORE, 1, NULL, OPT_MASTER_LCORE_NUM }, {OPT_NO_HPET, 0, NULL, OPT_NO_HPET_NUM }, @@ -86,6 +85,7 @@ eal_long_options[] = { {OPT_PROC_TYPE, 1, NULL, OPT_PROC_TYPE_NUM }, {OPT_SOCKET_MEM, 1, NULL, OPT_SOCKET_MEM_NUM }, {OPT_SYSLOG, 1, NULL, OPT_SYSLOG_NUM }, + {OPT_THREADS, 1, NULL, OPT_THREADS_NUM }, {OPT_VDEV, 1, NULL, OPT_VDEV_NUM }, {OPT_VFIO_INTR, 1, NULL, OPT_VFIO_INTR_NUM }, {OPT_VMWARE_TSC_MAP, 0, NULL, OPT_VMWARE_TSC_MAP_NUM }, @@ -442,42 +442,42 @@ convert_to_cpuset(rte_cpuset_t *cpusetp, } /* - * The format pattern: --lcores='[<,lcores[@cpus]>...]' - * lcores, cpus could be a single digit/range or a group. + * The format pattern: --threads='[<,threads[@cpus]>...]' + * threads, cpus could be a single digit/range or a group. * '(' and ')' are necessary if it's a group. - * If not supply '@cpus', the value of cpus uses the same as lcores. + * If not supply '@cpus', the value of cpus uses the same as threads. * e.g. '1,2@(5-7),(3-5)@(0,2),(0,6),7-8' means start 9 EAL thread as below - * lcore 0 runs on cpuset 0x41 (cpu 0,6) - * lcore 1 runs on cpuset 0x2 (cpu 1) - * lcore 2 runs on cpuset 0xe0 (cpu 5,6,7) - * lcore 3,4,5 runs on cpuset 0x5 (cpu 0,2) - * lcore 6 runs on cpuset 0x41 (cpu 0,6) - * lcore 7 runs on cpuset 0x80 (cpu 7) - * lcore 8 runs on cpuset 0x100 (cpu 8) + * thread 0 runs on cpuset 0x41 (cpu 0,6) + * thread 1 runs on cpuset 0x2 (cpu 1) + * thread 2 runs on cpuset 0xe0 (cpu 5,6,7) + * thread 3,4,5 runs on cpuset 0x5 (cpu 0,2) + * thread 6 runs on cpuset 0x41 (cpu 0,6) + * thread 7 runs on cpuset 0x80 (cpu 7) + * thread 8 runs on cpuset 0x100 (cpu 8) */ static int -eal_parse_lcores(const char *lcores) +eal_parse_threads(const char *threads) { struct rte_config *cfg = rte_eal_get_configuration(); static uint16_t set[RTE_MAX_LCORE]; unsigned idx = 0; int i; unsigned count = 0; - const char *lcore_start = NULL; + const char *thread_start = NULL; const char *end = NULL; int offset; rte_cpuset_t cpuset; int lflags = 0; int ret = -1; - if (lcores == NULL) + if (threads == NULL) return -1; /* Remove all blank characters ahead and after */ - while (isblank(*lcores)) - lcores++; - i = strlen(lcores); - while ((i > 0) && isblank(lcores[i - 1])) + while (isblank(*threads)) + threads++; + i = strlen(threads); + while ((i > 0) && isblank(threads[i - 1])) i--; CPU_ZERO(&cpuset); @@ -491,27 +491,27 @@ eal_parse_lcores(const char *lcores) /* Get list of cores */ do { - while (isblank(*lcores)) - lcores++; - if (*lcores == '\0') + while (isblank(*threads)) + threads++; + if (*threads == '\0') goto err; - /* record lcore_set start point */ - lcore_start = lcores; + /* record thread_set start point */ + thread_start = threads; /* go across a complete bracket */ - if (*lcore_start == '(') { - lcores += strcspn(lcores, ")"); - if (*lcores++ == '\0') + if (*thread_start == '(') { + threads += strcspn(threads, ")"); + if (*threads++ == '\0') goto err; } /* scan the separator '@', ','(next) or '\0'(finish) */ - lcores += strcspn(lcores, "@,"); + threads += strcspn(threads, "@,"); - if (*lcores == '@') { + if (*threads == '@') { /* explicit assign cpu_set */ - offset = eal_parse_set(lcores + 1, set, RTE_DIM(set)); + offset = eal_parse_set(threads + 1, set, RTE_DIM(set)); if (offset < 0) goto err; @@ -519,31 +519,31 @@ eal_parse_lcores(const char *lcores) if (0 > convert_to_cpuset(&cpuset, set, RTE_DIM(set))) goto err; - end = lcores + 1 + offset; + end = threads + 1 + offset; } else { /* ',' or '\0' */ /* haven't given cpu_set, current loop done */ - end = lcores; + end = threads; /* go back to check - */ - offset = strcspn(lcore_start, "(-"); - if (offset < (end - lcore_start) && - *(lcore_start + offset) != '(') + offset = strcspn(thread_start, "(-"); + if (offset < (end - thread_start) && + *(thread_start + offset) != '(') lflags = 1; } if (*end != ',' && *end != '\0') goto err; - /* parse lcore_set from start point */ - if (0 > eal_parse_set(lcore_start, set, RTE_DIM(set))) + /* parse thread_set from start point */ + if (0 > eal_parse_set(thread_start, set, RTE_DIM(set))) goto err; - /* without '@', by default using lcore_set as cpu_set */ - if (*lcores != '@' && + /* without '@', by default using thread_set as cpu_set */ + if (*threads != '@' && 0 > convert_to_cpuset(&cpuset, set, RTE_DIM(set))) goto err; - /* start to update lcore_set */ + /* start to update thread_set */ for (idx = 0; idx < RTE_MAX_LCORE; idx++) { if (!set[idx]) continue; @@ -562,7 +562,7 @@ eal_parse_lcores(const char *lcores) sizeof(rte_cpuset_t)); } - lcores = end + 1; + threads = end + 1; } while (*end != '\0'); if (count == 0) @@ -777,10 +777,10 @@ eal_parse_common_option(int opt, const char *optarg, conf->log_level = log; break; } - case OPT_LCORES_NUM: - if (eal_parse_lcores(optarg) < 0) { + case OPT_THREADS_NUM: + if (eal_parse_threads(optarg) < 0) { RTE_LOG(ERR, EAL, "invalid parameter for --" - OPT_LCORES "\n"); + OPT_THREADS "\n"); return -1; } break; @@ -822,7 +822,7 @@ eal_check_common_options(struct internal_config *internal_cfg) if (!lcores_parsed) { RTE_LOG(ERR, EAL, "CPU cores must be enabled with options " - "-c, -l or --lcores\n"); + "-c, -l or --threads\n"); return -1; } if (cfg->lcore_role[cfg->master_lcore] != ROLE_RTE) { @@ -876,14 +876,14 @@ eal_common_usage(void) " -l CORELIST List of cores to run on\n" " The argument format is [-c2][,c3[-c4],...]\n" " where c1, c2, etc are core indexes between 0 and %d\n" - " --"OPT_LCORES" COREMAP Map lcore set to physical cpu set\n" + " --"OPT_THREADS" COREMAP Map thread set to physical cpu set\n" " The argument format is\n" - " '[<,lcores[@cpus]>...]'\n" - " lcores and cpus list are grouped by '(' and ')'\n" + " '[<,threads[@cpus]>...]'\n" + " threads and cpus list are grouped by '(' and ')'\n" " Within the group, '-' is used for range separator,\n" " ',' is used for single number separator.\n" " '( )' can be omitted for single element group,\n" - " '@' can be omitted if cpus and lcores have the same value\n" + " '@' can be omitted if cpus and threads have the same value\n" " --"OPT_MASTER_LCORE" ID Core ID that is used as master\n" " -n CHANNELS Number of memory channels\n" " -m MB Memory to allocate (see also --"OPT_SOCKET_MEM")\n" diff --git a/lib/librte_eal/common/eal_options.h b/lib/librte_eal/common/eal_options.h index f6714d9..d979c62 100644 --- a/lib/librte_eal/common/eal_options.h +++ b/lib/librte_eal/common/eal_options.h @@ -53,8 +53,6 @@ enum { OPT_FILE_PREFIX_NUM, #define OPT_HUGE_DIR "huge-dir" OPT_HUGE_DIR_NUM, -#define OPT_LCORES "lcores" - OPT_LCORES_NUM, #define OPT_LOG_LEVEL "log-level" OPT_LOG_LEVEL_NUM, #define OPT_MASTER_LCORE "master-lcore" @@ -73,6 +71,8 @@ enum { OPT_SOCKET_MEM_NUM, #define OPT_SYSLOG "syslog" OPT_SYSLOG_NUM, +#define OPT_THREADS "threads" + OPT_THREADS_NUM, #define OPT_VDEV "vdev" OPT_VDEV_NUM, #define OPT_VFIO_INTR "vfio-intr"