From patchwork Wed May 6 15:27:59 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phil Yang X-Patchwork-Id: 186261 Delivered-To: patch@linaro.org Received: by 2002:a92:8d81:0:0:0:0:0 with SMTP id w1csp2251360ill; Wed, 6 May 2020 08:28:58 -0700 (PDT) X-Google-Smtp-Source: APiQypLzSHOiXOAZLTInr/9sWLwRjWU6MbR0mQK2cpPBAAN03lGykJiaP1ZDZsLIXu7k2iv66Oz9 X-Received: by 2002:a50:9d42:: with SMTP id j2mr7452045edk.249.1588778938389; Wed, 06 May 2020 08:28:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1588778938; cv=none; d=google.com; s=arc-20160816; b=eGVi+lCIBGj2CV1StN0Xk0THgscOAmAlrinoTiufQOrLTFexBFFbNTBxhd/i48nOxV xYTsqL44NV8UZflBSmzpsbSn9JZxkHPjBAIDrdufcp77dgMq39QyWS6bBBwEUB0MG0t0 xQVdqRUSOvigTQe4qYS6rino0WSuBJbrarNV9devz+kkJUjXt9WZ0OeVkQLrLDKXX2Mw DLOFpo4Dl2lOX19ux4XYb9lKPps5G85KGG2U8ox6+EAyqzRXZXefQgSUczB374gjMaMm TxepRmfVv5Lso7iKJjNA0Cti0Ck9p7NQHXPZq967YLU7hZYfjhHHC9RZ78yylbA/vHgW PAZQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:references:in-reply-to :message-id:date:cc:to:from; bh=Vo4V77ZYV/N5/nIF2XQiIHeLduLaL/vvmw91zios+O0=; b=rBaGEv1oH2kvKP8UQemjsFW9GLRbCr2FgygyxPDJcU7Bm+947FtRb1pnEarfehlVLj KmkaaqreX8WNUQjoVITPTtkuSNiW9hMoH225U44qTsLhtSAz/AfQ/3ciixyaqhu4iIh9 Jv4CDNiWk2y8xe5sWpBSCu87jwD28IyMd42uonKjebl/RPQ8HmeZZ41/jZldkaIkZyA+ xCiVocoVe3iFkPyVwa4Ev9Jw2ZKkMzTsDESYh7N1PQ0eleJNWnYxB0DdWLIS2fL8ZKpm gXKu0dlkXlY935VsqXnhMB9/wpME+0tY3O5Y6dl4Nyx4F0Qxjk5xiDZYLuAXYcdc5QCy ygOQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of dev-bounces@dpdk.org designates 92.243.14.124 as permitted sender) smtp.mailfrom=dev-bounces@dpdk.org Return-Path: Received: from dpdk.org (dpdk.org. [92.243.14.124]) by mx.google.com with ESMTP id v26si1346753ejq.460.2020.05.06.08.28.58; Wed, 06 May 2020 08:28:58 -0700 (PDT) Received-SPF: pass (google.com: domain of dev-bounces@dpdk.org designates 92.243.14.124 as permitted sender) client-ip=92.243.14.124; Authentication-Results: mx.google.com; spf=pass (google.com: domain of dev-bounces@dpdk.org designates 92.243.14.124 as permitted sender) smtp.mailfrom=dev-bounces@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id A0F431D977; Wed, 6 May 2020 17:28:57 +0200 (CEST) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by dpdk.org (Postfix) with ESMTP id 313FB1D966; Wed, 6 May 2020 17:28:56 +0200 (CEST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id A50F9D6E; Wed, 6 May 2020 08:28:55 -0700 (PDT) Received: from localhost.localdomain (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 8663E3F68F; Wed, 6 May 2020 08:28:47 -0700 (PDT) From: Phil Yang To: dev@dpdk.org, harry.van.haaren@intel.com Cc: thomas@monjalon.net, david.marchand@redhat.com, konstantin.ananyev@intel.com, jerinj@marvell.com, hemant.agrawal@nxp.com, gage.eads@intel.com, bruce.richardson@intel.com, Honnappa.Nagarahalli@arm.com, nd@arm.com, Honnappa Nagarahalli , stable@dpdk.org Date: Wed, 6 May 2020 23:27:59 +0800 Message-Id: <1588778884-13047-2-git-send-email-phil.yang@arm.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1588778884-13047-1-git-send-email-phil.yang@arm.com> References: <1588760683-11027-1-git-send-email-phil.yang@arm.com> <1588778884-13047-1-git-send-email-phil.yang@arm.com> Subject: [dpdk-dev] [PATCH v6 1/6] service: fix race condition for MT unsafe service X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Honnappa Nagarahalli The MT unsafe service might get configured to run on another core while the service is running currently. This might result in the MT unsafe service running on multiple cores simultaneously. Use 'execute_lock' always when the service is MT unsafe. If the service is known to be mmapped on a single lcore, setting the service capability to MT safe will avoid taking the lock and improve the performance. Fixes: e9139a32f6e8 ("service: add function to run on app lcore") Cc: stable@dpdk.org Signed-off-by: Honnappa Nagarahalli Reviewed-by: Phil Yang Acked-by: Harry van Haaren --- lib/librte_eal/common/rte_service.c | 11 +++++------ lib/librte_eal/include/rte_service.h | 8 ++++++-- lib/librte_eal/include/rte_service_component.h | 6 +++++- 3 files changed, 16 insertions(+), 9 deletions(-) -- 2.7.4 diff --git a/lib/librte_eal/common/rte_service.c b/lib/librte_eal/common/rte_service.c index 70d17a5..b8c465e 100644 --- a/lib/librte_eal/common/rte_service.c +++ b/lib/librte_eal/common/rte_service.c @@ -50,6 +50,10 @@ struct rte_service_spec_impl { uint8_t internal_flags; /* per service statistics */ + /* Indicates how many cores the service is mapped to run on. + * It does not indicate the number of cores the service is running + * on currently. + */ rte_atomic32_t num_mapped_cores; uint64_t calls; uint64_t cycles_spent; @@ -370,12 +374,7 @@ service_run(uint32_t i, struct core_state *cs, uint64_t service_mask, cs->service_active_on_lcore[i] = 1; - /* check do we need cmpset, if MT safe or <= 1 core - * mapped, atomic ops are not required. - */ - const int use_atomics = (service_mt_safe(s) == 0) && - (rte_atomic32_read(&s->num_mapped_cores) > 1); - if (use_atomics) { + if (service_mt_safe(s) == 0) { if (!rte_atomic32_cmpset((uint32_t *)&s->execute_lock, 0, 1)) return -EBUSY; diff --git a/lib/librte_eal/include/rte_service.h b/lib/librte_eal/include/rte_service.h index d8701dd..3a1c735 100644 --- a/lib/librte_eal/include/rte_service.h +++ b/lib/librte_eal/include/rte_service.h @@ -104,12 +104,16 @@ int32_t rte_service_probe_capability(uint32_t id, uint32_t capability); * Each core can be added or removed from running a specific service. This * function enables or disables *lcore* to run *service_id*. * - * If multiple cores are enabled on a service, an atomic is used to ensure that - * only one cores runs the service at a time. The exception to this is when + * If multiple cores are enabled on a service, a lock is used to ensure that + * only one core runs the service at a time. The exception to this is when * a service indicates that it is multi-thread safe by setting the capability * called RTE_SERVICE_CAP_MT_SAFE. With the multi-thread safe capability set, * the service function can be run on multiple threads at the same time. * + * If the service is known to be mapped to a single lcore, setting the + * capability of the service to RTE_SERVICE_CAP_MT_SAFE can achieve + * better performance by avoiding the use of lock. + * * @param service_id the service to apply the lcore to * @param lcore The lcore that will be mapped to service * @param enable Zero to unmap or disable the core, non-zero to enable diff --git a/lib/librte_eal/include/rte_service_component.h b/lib/librte_eal/include/rte_service_component.h index 16eab79..b75aba1 100644 --- a/lib/librte_eal/include/rte_service_component.h +++ b/lib/librte_eal/include/rte_service_component.h @@ -43,7 +43,7 @@ struct rte_service_spec { /** * Register a new service. * - * A service represents a component that the requires CPU time periodically to + * A service represents a component that requires CPU time periodically to * achieve its purpose. * * For example the eventdev SW PMD requires CPU cycles to perform its @@ -56,6 +56,10 @@ struct rte_service_spec { * *rte_service_component_runstate_set*, which indicates that the service * component is ready to be executed. * + * If the service is known to be mapped to a single lcore, setting the + * capability of the service to RTE_SERVICE_CAP_MT_SAFE can achieve + * better performance. + * * @param spec The specification of the service to register * @param[out] service_id A pointer to a uint32_t, which will be filled in * during registration of the service. It is set to the integers From patchwork Wed May 6 15:28:00 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phil Yang X-Patchwork-Id: 186262 Delivered-To: patch@linaro.org Received: by 2002:a92:8d81:0:0:0:0:0 with SMTP id w1csp2251501ill; Wed, 6 May 2020 08:29:09 -0700 (PDT) X-Google-Smtp-Source: APiQypI/W872Gu7YoKuvlzNRBhXfONUOfYqtsOpAAMQMHtynhg4f+/gbmNrA4AtBX86v/LktvDZd X-Received: by 2002:a05:6402:1f6:: with SMTP id i22mr7710200edy.271.1588778949328; Wed, 06 May 2020 08:29:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1588778949; cv=none; d=google.com; s=arc-20160816; b=U8fIs0TrQvcISWqV6a9UIwf/zPvMQwnEJjR5DrcRA67FFBVnum1s2Xu5YhNOWTKRoA thYRJgnGLAPfob9PFM1QaWYno+YnIR/6WyBLhA5R99CIegO/SNO8qhFifR3/0nOfZfOi Z+Fn4G8Ib8+p9NhZWyjQPM/1RRGwrcVpbcJFjFwFaED37V06mvybuH3VCdhNl85HzH8I HhPW7RJdvrK0U9gCzkAf6NbZA0KCRvL6VZ4O+ANtHkN3HAL70aNghYf6hCyJNdF14ske NUhw+3hD0AEWXjI4hTDVXsdtEv22twRgbsMhSssIOMBXccQH/lLtBEE2wk9mbwSfTw1M aRQA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:references:in-reply-to :message-id:date:cc:to:from; bh=XyTHIG8Yut73x3x/VmRXUpkJ2sjyF1Tfn/QgMrfIhh0=; b=MY7oNuaHc7c9n34v/L/hw6UNxHByyN+8PORz4U5HWnQ6R74P8BhX0lyRlZ2o4wCSof q495rNcyQwkw42j6fFWkLJlwD8Jc0p4tr69Hx5Q63Ds01OG6Vd+7oRLpVtS16MMdJf4V 3b6gm5JgOcXu+UqCGm/DAvuhooOuALpZ16W6q2KuSIPzeWBAktymBAi1gQxQGqVY4Lgm Cz1uHY5+ORu/JiphvRALHTx0rbeTSke81zEmaPru/shuQW8itkPo2cxcn5LOZvlVgCGc vfZuaz9sGq8hCWZq8hjWu64sJM36GEOmU7myL4D7+j+/3fFiZo6+F/u0cNIEaKG5Ctcr fM7g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of dev-bounces@dpdk.org designates 92.243.14.124 as permitted sender) smtp.mailfrom=dev-bounces@dpdk.org Return-Path: Received: from dpdk.org (dpdk.org. [92.243.14.124]) by mx.google.com with ESMTP id ce9si1401244ejc.139.2020.05.06.08.29.09; Wed, 06 May 2020 08:29:09 -0700 (PDT) Received-SPF: pass (google.com: domain of dev-bounces@dpdk.org designates 92.243.14.124 as permitted sender) client-ip=92.243.14.124; Authentication-Results: mx.google.com; spf=pass (google.com: domain of dev-bounces@dpdk.org designates 92.243.14.124 as permitted sender) smtp.mailfrom=dev-bounces@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E7FFD1D976; Wed, 6 May 2020 17:29:08 +0200 (CEST) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by dpdk.org (Postfix) with ESMTP id 08DBD1D976; Wed, 6 May 2020 17:29:07 +0200 (CEST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 8A5ABD6E; Wed, 6 May 2020 08:29:06 -0700 (PDT) Received: from localhost.localdomain (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 838E43F68F; Wed, 6 May 2020 08:28:56 -0700 (PDT) From: Phil Yang To: dev@dpdk.org, harry.van.haaren@intel.com Cc: thomas@monjalon.net, david.marchand@redhat.com, konstantin.ananyev@intel.com, jerinj@marvell.com, hemant.agrawal@nxp.com, gage.eads@intel.com, bruce.richardson@intel.com, Honnappa.Nagarahalli@arm.com, nd@arm.com, Honnappa Nagarahalli , stable@dpdk.org Date: Wed, 6 May 2020 23:28:00 +0800 Message-Id: <1588778884-13047-3-git-send-email-phil.yang@arm.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1588778884-13047-1-git-send-email-phil.yang@arm.com> References: <1588760683-11027-1-git-send-email-phil.yang@arm.com> <1588778884-13047-1-git-send-email-phil.yang@arm.com> Subject: [dpdk-dev] [PATCH v6 2/6] service: fix identification of service running on other lcore X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Honnappa Nagarahalli The logic to identify if the MT unsafe service is running on another core can return -EBUSY spuriously. In such cases, running the service becomes costlier than using atomic operations. Assume that the application passes the right parameters and reduce the number of instructions for all cases. Cc: stable@dpdk.org Fixes: 8d39d3e237c2 ("service: fix race in service on app lcore function") Signed-off-by: Honnappa Nagarahalli Reviewed-by: Phil Yang Acked-by: Harry van Haaren --- lib/librte_eal/common/rte_service.c | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) -- 2.7.4 diff --git a/lib/librte_eal/common/rte_service.c b/lib/librte_eal/common/rte_service.c index b8c465e..c283408 100644 --- a/lib/librte_eal/common/rte_service.c +++ b/lib/librte_eal/common/rte_service.c @@ -360,7 +360,7 @@ rte_service_runner_do_callback(struct rte_service_spec_impl *s, /* Expects the service 's' is valid. */ static int32_t service_run(uint32_t i, struct core_state *cs, uint64_t service_mask, - struct rte_service_spec_impl *s) + struct rte_service_spec_impl *s, uint32_t serialize_mt_unsafe) { if (!s) return -EINVAL; @@ -374,7 +374,7 @@ service_run(uint32_t i, struct core_state *cs, uint64_t service_mask, cs->service_active_on_lcore[i] = 1; - if (service_mt_safe(s) == 0) { + if ((service_mt_safe(s) == 0) && (serialize_mt_unsafe == 1)) { if (!rte_atomic32_cmpset((uint32_t *)&s->execute_lock, 0, 1)) return -EBUSY; @@ -412,24 +412,14 @@ rte_service_run_iter_on_app_lcore(uint32_t id, uint32_t serialize_mt_unsafe) SERVICE_VALID_GET_OR_ERR_RET(id, s, -EINVAL); - /* Atomically add this core to the mapped cores first, then examine if - * we can run the service. This avoids a race condition between - * checking the value, and atomically adding to the mapped count. + /* Increment num_mapped_cores to reflect that this core is + * now mapped capable of running the service. */ - if (serialize_mt_unsafe) - rte_atomic32_inc(&s->num_mapped_cores); + rte_atomic32_inc(&s->num_mapped_cores); - if (service_mt_safe(s) == 0 && - rte_atomic32_read(&s->num_mapped_cores) > 1) { - if (serialize_mt_unsafe) - rte_atomic32_dec(&s->num_mapped_cores); - return -EBUSY; - } - - int ret = service_run(id, cs, UINT64_MAX, s); + int ret = service_run(id, cs, UINT64_MAX, s, serialize_mt_unsafe); - if (serialize_mt_unsafe) - rte_atomic32_dec(&s->num_mapped_cores); + rte_atomic32_dec(&s->num_mapped_cores); return ret; } @@ -449,7 +439,7 @@ rte_service_runner_func(void *arg) if (!service_valid(i)) continue; /* return value ignored as no change to code flow */ - service_run(i, cs, service_mask, service_get(i)); + service_run(i, cs, service_mask, service_get(i), 1); } cs->loops++;