From patchwork Sat May 2 00:02:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Honnappa Nagarahalli X-Patchwork-Id: 186046 Delivered-To: patch@linaro.org Received: by 2002:a50:3a95:0:0:0:0:0 with SMTP id v21csp791593ecc; Fri, 1 May 2020 17:03:22 -0700 (PDT) X-Google-Smtp-Source: APiQypKHnw3wryZ2MZFhJUimqU/MJYhwVoQvLsnKBR42SAbUqQugzhESQzVvRAp/rQbplSbRcKIt X-Received: by 2002:a17:906:3e52:: with SMTP id t18mr5492294eji.204.1588377802844; Fri, 01 May 2020 17:03:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1588377802; cv=none; d=google.com; s=arc-20160816; b=zkRtDI7cAh1/KqIlA4pSbJieXJdC/gfrOye/FbSCnM8etRbf6qKmR47pIRCs5frqtt bpKDAet/vtSryGisQXLYgTj/M4AHVEzrT/T51SCmyjvGEeIYU9cdUPQQkKz7qer3ZWPa d9mTZnFcsQwv9QLPdtM00i54FWcpwCbpMDLXm7wGY+0xEX84jrhGW2Hny0Ehd1sqvUoY 9C97ac+DvoLTrLY3wXOUGfqw6suo4dfEcK81wyTuPchnpgQkfk58RjnW9mkEZ48zh3bL 7XAE902SaDGUsQKNjocyDe5oVefQhc2obMeEJgRqQjd9tcZw1BTUBhwFphumbojB+LpX 8+Rw== 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=LqaS+GjCg016U30gmSiBSPO1v/Y89LcBhTbHV4Z/B1s=; b=WrmlCyJsgyGNXqhRv0cGRmecR4DkXBxMk1pEDvYCTgRQhG29VMHGAldlqxwKgbzrfu Vz8D696jglXsk5nh7wDRuWECYKd+Voe8xmFmDPM87kPEDYq1P/+DXZBZQh3P6zNh09Az OCYU+sRnYx06kDPgmZQ/LC2Igv3K+yLnOddOZ1AqGk0sy0x4amh0S2vMKEI8/wHhSZfD /nMr3Y7cKRlrDY46U8EYhKT20/LYqUVdmX14Q76VBeFsz2V5HdTw+JmIzJM41X+GFhwQ 7gFrRNMxic+jlBquDmVfRKPWNTUn07+QtELqcNzF0pPLYs+rGbpFbQMQHLZmwgrR6OmT qRRw== 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 w14si2449534edl.600.2020.05.01.17.03.22; Fri, 01 May 2020 17:03:22 -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 160D51D9C6; Sat, 2 May 2020 02:03:07 +0200 (CEST) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by dpdk.org (Postfix) with ESMTP id 22C601D99E; Sat, 2 May 2020 02:03:04 +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 A04E7106F; Fri, 1 May 2020 17:03:03 -0700 (PDT) Received: from qc2400f-1.austin.arm.com (qc2400f-1.austin.arm.com [10.118.14.48]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 8D3203F305; Fri, 1 May 2020 17:03:03 -0700 (PDT) From: Honnappa Nagarahalli To: dev@dpdk.org, phil.yang@arm.com, 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, stable@dpdk.org Date: Fri, 1 May 2020 19:02:41 -0500 Message-Id: <20200502000245.11071-3-honnappa.nagarahalli@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200502000245.11071-1-honnappa.nagarahalli@arm.com> References: <1587659482-27133-1-git-send-email-phil.yang@arm.com> <20200502000245.11071-1-honnappa.nagarahalli@arm.com> Subject: [dpdk-dev] [PATCH v3 2/6] service: identify service running on another core correctly 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" 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 reduces 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 --- lib/librte_eal/common/rte_service.c | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) -- 2.17.1 Acked-by: Harry van Haaren diff --git a/lib/librte_eal/common/rte_service.c b/lib/librte_eal/common/rte_service.c index b8c465eb9..c89472b83 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 indicate that the service + * is running on a core. */ - 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++;