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++;