From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@dpdk.org>
Received: from dpdk.org (dpdk.org [92.243.14.124])
	by inbox.dpdk.org (Postfix) with ESMTP id E380AA00C3;
	Thu, 23 Apr 2020 22:06:30 +0200 (CEST)
Received: from [92.243.14.124] (localhost [127.0.0.1])
	by dpdk.org (Postfix) with ESMTP id 689941C220;
	Thu, 23 Apr 2020 22:06:30 +0200 (CEST)
Received: from EUR03-AM5-obe.outbound.protection.outlook.com
 (mail-eopbgr30049.outbound.protection.outlook.com [40.107.3.49])
 by dpdk.org (Postfix) with ESMTP id 838AD1C210
 for <dev@dpdk.org>; Thu, 23 Apr 2020 22:06:28 +0200 (CEST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; 
 s=selector2-armh-onmicrosoft-com;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=4Lios49dwagSC9fu042gENl0bjLvc1qqTpzCUtUUXcU=;
 b=GY4HdM7nc7mIcqM9rA2QDybDR3J061uqBxQPiYH5Uc9d47D7oNTGVwDtjYNSeI8fizw+M3MzWDs7d8oTfc5fwZnJ3qtCJsDwf+BqN0O96kpngGBPUNMq9yhA6hL0VVi7DZa71BP1TbsjGriDFhcaYNGFOQWshc748YjWHm8nxS4=
Received: from VI1P194CA0057.EURP194.PROD.OUTLOOK.COM (2603:10a6:803:3c::46)
 by VE1PR08MB4686.eurprd08.prod.outlook.com (2603:10a6:802:af::14) with
 Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2921.26; Thu, 23 Apr
 2020 20:06:26 +0000
Received: from VE1EUR03FT011.eop-EUR03.prod.protection.outlook.com
 (2603:10a6:803:3c:cafe::4c) by VI1P194CA0057.outlook.office365.com
 (2603:10a6:803:3c::46) with Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2937.13 via Frontend
 Transport; Thu, 23 Apr 2020 20:06:26 +0000
Authentication-Results: spf=pass (sender IP is 63.35.35.123)
 smtp.mailfrom=arm.com; dpdk.org; dkim=pass (signature was verified)
 header.d=armh.onmicrosoft.com;dpdk.org; dmarc=bestguesspass action=none
 header.from=arm.com;
Received-SPF: Pass (protection.outlook.com: domain of arm.com designates
 63.35.35.123 as permitted sender) receiver=protection.outlook.com;
 client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com;
Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by
 VE1EUR03FT011.mail.protection.outlook.com (10.152.18.134) with
 Microsoft SMTP
 Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
 15.20.2937.19 via Frontend Transport; Thu, 23 Apr 2020 20:06:25 +0000
Received: ("Tessian outbound 29c24b8a1b7a:v53");
 Thu, 23 Apr 2020 20:06:25 +0000
X-CR-MTA-TID: 64aa7808
Received: from a479c09dd905.3
 by 64aa7808-outbound-1.mta.getcheckrecipient.com id
 41761A03-35F9-4901-A865-A0696996BDE3.1; 
 Thu, 23 Apr 2020 20:06:20 +0000
Received: from EUR01-VE1-obe.outbound.protection.outlook.com
 by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id a479c09dd905.3
 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384);
 Thu, 23 Apr 2020 20:06:20 +0000
ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;
 b=LVhBHz/IuFNPBMhWQMtugOmNpaRVp/86YkNVu7OojbvtuxB5yZ4aMY35ngxhcauKTjXn3TTeAbhwqhLwSKqdpYe0OgRmXvveFeLP+mSyj28rEwaPfoIy8t5+6zqH5cWr2BGRXFt5A5xfBlG31YB3iRNpQZlu9UaajxRoaAehdbH0jNTnV3LxAoP/aCXNi8r55ADrHc4c5lrYUUTB01ZLTLg29xnGbiLVXX/v/GIJzzEokXFN1QsRIM2Nh0fmfvJnx43yJcPItnYL0yMUYnUCVPqBMY6XD1tYAcAiqzWMIp+LK1QEvcHR0mk4l+VZGFaZx4W2/FrV/E2aO9/ChpmH7g==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; 
 s=arcselector9901;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=4Lios49dwagSC9fu042gENl0bjLvc1qqTpzCUtUUXcU=;
 b=SJmSRz6oCB8lNRGgZ8HjBWwWr0nm+ldhaLUXJ9dskc+hsUKhWO8gzP+d7VrVE8I6wrFMOAu5Fu3sqCwLqTSHqfn7lt+RlyjkiHBv+cbocF50I0Y+yeKlDMXyiHwr7geAXdVLze0IptxPlNWyt5brQnGxmS5iJIllCAnh7L+TBCqkP7bbYS8YMdLkb+fBePgNT0ap7KcFamhzVsuK2ontkqVQBk4JAK9TCboZzOznyezcj0YDIWRo/PnD9HTKHoX30zyrEuNThvnwTWdcXJ4ICQpXh2ueot5/PBrd1x7N8djoy1KWnVoXjbdXlba0YuUuDs2Y/x4CkxbwwkQqdU28BA==
ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass
 smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass
 header.d=arm.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; 
 s=selector2-armh-onmicrosoft-com;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=4Lios49dwagSC9fu042gENl0bjLvc1qqTpzCUtUUXcU=;
 b=GY4HdM7nc7mIcqM9rA2QDybDR3J061uqBxQPiYH5Uc9d47D7oNTGVwDtjYNSeI8fizw+M3MzWDs7d8oTfc5fwZnJ3qtCJsDwf+BqN0O96kpngGBPUNMq9yhA6hL0VVi7DZa71BP1TbsjGriDFhcaYNGFOQWshc748YjWHm8nxS4=
Received: from DBBPR08MB4646.eurprd08.prod.outlook.com (2603:10a6:10:f5::16)
 by DBBPR08MB4284.eurprd08.prod.outlook.com (2603:10a6:10:d0::10) with
 Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2937.13; Thu, 23 Apr
 2020 20:06:16 +0000
Received: from DBBPR08MB4646.eurprd08.prod.outlook.com
 ([fe80::1870:afc4:b90f:609d]) by DBBPR08MB4646.eurprd08.prod.outlook.com
 ([fe80::1870:afc4:b90f:609d%5]) with mapi id 15.20.2921.030; Thu, 23 Apr 2020
 20:06:16 +0000
From: Honnappa Nagarahalli <Honnappa.Nagarahalli@arm.com>
To: Phil Yang <Phil.Yang@arm.com>, "erik.g.carrillo@intel.com"
 <erik.g.carrillo@intel.com>, "rsanford@akamai.com" <rsanford@akamai.com>,
 "dev@dpdk.org" <dev@dpdk.org>
CC: "thomas@monjalon.net" <thomas@monjalon.net>, "david.marchand@redhat.com"
 <david.marchand@redhat.com>, "konstantin.ananyev@intel.com"
 <konstantin.ananyev@intel.com>, "jerinj@marvell.com" <jerinj@marvell.com>,
 "hemant.agrawal@nxp.com" <hemant.agrawal@nxp.com>, Gavin Hu
 <Gavin.Hu@arm.com>, nd <nd@arm.com>, Honnappa Nagarahalli
 <Honnappa.Nagarahalli@arm.com>, nd <nd@arm.com>
Thread-Topic: [PATCH v2] lib/timer: relax barrier for status update
Thread-Index: AQHWFy2kpAXDRLSmfkanX9/OtCmKHKiHJcEQ
Date: Thu, 23 Apr 2020 20:06:16 +0000
Message-ID: <DBBPR08MB4646967163244A5380431F7A98D30@DBBPR08MB4646.eurprd08.prod.outlook.com>
References: <1582526539-14360-2-git-send-email-phil.yang@arm.com>
 <1587398752-9345-1-git-send-email-phil.yang@arm.com>
In-Reply-To: <1587398752-9345-1-git-send-email-phil.yang@arm.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
x-ts-tracking-id: 14172ba7-b4fe-4f32-884f-e6381f0fefd0.0
x-checkrecipientchecked: true
Authentication-Results-Original: spf=none (sender IP is )
 smtp.mailfrom=Honnappa.Nagarahalli@arm.com; 
x-originating-ip: [70.113.25.165]
x-ms-publictraffictype: Email
X-MS-Office365-Filtering-HT: Tenant
X-MS-Office365-Filtering-Correlation-Id: 5e9bc7bc-d8b2-4354-ad3e-08d7e7c1cd69
x-ms-traffictypediagnostic: DBBPR08MB4284:|DBBPR08MB4284:|VE1PR08MB4686:
x-ld-processed: f34e5979-57d9-4aaa-ad4d-b122a662184d,ExtAddr
x-ms-exchange-transport-forked: True
X-Microsoft-Antispam-PRVS: <VE1PR08MB4686F08918E07904A2CFA4E698D30@VE1PR08MB4686.eurprd08.prod.outlook.com>
x-checkrecipientrouted: true
nodisclaimer: true
x-ms-oob-tlc-oobclassifiers: OLM:8882;OLM:8882;
x-forefront-prvs: 03827AF76E
X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255; CTRY:; LANG:en;
 SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DBBPR08MB4646.eurprd08.prod.outlook.com;
 PTR:; CAT:NONE; SFTY:;
 SFS:(4636009)(346002)(136003)(396003)(376002)(366004)(39860400002)(2906002)(5660300002)(52536014)(478600001)(66446008)(110136005)(54906003)(6506007)(33656002)(7696005)(4326008)(966005)(86362001)(186003)(66946007)(66476007)(66556008)(64756008)(76116006)(15650500001)(8936002)(71200400001)(8676002)(9686003)(26005)(81156014)(55016002)(316002);
 DIR:OUT; SFP:1101; 
received-spf: None (protection.outlook.com: arm.com does not designate
 permitted sender hosts)
X-MS-Exchange-SenderADCheck: 1
X-Microsoft-Antispam-Untrusted: BCL:0;
X-Microsoft-Antispam-Message-Info-Original: Hwhydz29zHYkTyfaBa6DVShpVe2hW6OIxE/Eu7LsH8484DvpN+zoY7QZm5uYB3IXeTpn4CtD0Zlfb6K1MsdXNkZ23NAkWgnEx6+r0D7XLE4klzUx+juHI8rIB2rAQm1jKwey68K/5Ot5h3H7KYPpjqV2eCinAIHvE2NbYzlRa7AdmMifxeTRwnaw4H2oQzlHRRcQ8239wry+pDRJ9p1HOdD62qTve5PBP1NWe0fBfRMsNNUnjUpok9iEJCGV50FEDbCTFSUDsTH+BIU4u17c/c7B4QD9rmmiK/yLCDWM11fSXrUA2GRlMADDjybgDfk+0AG58gnNPQHwgOfFPhc67zjryHFmctFbLuG+RK20mCGZ0uQIiuE9DM3mRP9NmPLTZX/MSp4AN9rqA3xE2Cpxa1p0M/0Mf008nzdXbMQFe20kheLW4PjBA7sMnhRyQjNjJrTW8MlSmfpmRRDmcYGJI9mbNnwOP3VUrrOLvfF7ydeg0QQK5UgxLK+HfKgZU8k+5AAv+4LVFEPwl75EuKIjQQ==
x-ms-exchange-antispam-messagedata: M/c+kJFiX8wo1t6nMYr1pghiUbqY1862VpGz4agjZrAw76rwKHo1Lw4Z1rZJrDepDdo/dyw+3/KbCY0BbfLIeqFEJCYaMiBD8RB1/CMmer32ycYWqlCR442uXz6WitErxPKQWo50SP5lCnRuSMvJ3g==
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR08MB4284
Original-Authentication-Results: spf=none (sender IP is )
 smtp.mailfrom=Honnappa.Nagarahalli@arm.com; 
X-EOPAttributedMessage: 0
X-MS-Exchange-Transport-CrossTenantHeadersStripped: VE1EUR03FT011.eop-EUR03.prod.protection.outlook.com
X-Forefront-Antispam-Report: CIP:63.35.35.123; CTRY:IE; LANG:en; SCL:1; SRV:;
 IPV:CAL; SFV:NSPM; H:64aa7808-outbound-1.mta.getcheckrecipient.com;
 PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com; CAT:NONE; SFTY:;
 SFS:(10009020)(4636009)(396003)(39860400002)(346002)(136003)(376002)(46966005)(52536014)(316002)(70586007)(8936002)(70206006)(81156014)(82310400002)(336012)(82740400003)(966005)(33656002)(47076004)(15650500001)(356005)(5660300002)(9686003)(478600001)(55016002)(8676002)(54906003)(7696005)(26005)(81166007)(36906005)(2906002)(6506007)(110136005)(86362001)(186003)(4326008);
 DIR:OUT; SFP:1101; 
X-MS-Office365-Filtering-Correlation-Id-Prvs: 199e1fc5-ddb7-4bbe-d1a2-08d7e7c1c7e3
X-Forefront-PRVS: 03827AF76E
X-Microsoft-Antispam: BCL:0;
X-Microsoft-Antispam-Message-Info: KhzV8Hz/x7kCEYuFCsv2U4H/Zy1fTKH+ijldYfv199Xn+4yB0ozyqBy6tyjapyme2MUPfnw9KQjB3qe/9yI+9sAb5VapK5qHUTgnzjCkdRKFMdgwOLNOAVYjWkq1Nm18az6JYHVlzl00nL/498ymMGIvwBP2fo6uq/tbtCebcL+edfG9Jkc+amJcLyZHlv4izpU2rwnJ4PayP8FPxHbSJVSNrdYzJN5o6UqnzoVbkKXhhyh0jaEOocldh9m6P7JzIlOfnpxMM6arN6oUDTk+oUDd8bkJHfCDxJpL8WPY8nb0/U0G1FMy8qsO1Zuj5/w0sdn6KLq47aj1Zbx+HcISXUdHQdDswbJ0UJW974WnGhiQz9lEE0x+tn5GmiZRN9v0H04LQmDkDfrQTMaRMx3DvSpjgGkFRQkTzWWMgt5LFo07bc5z7h91zOpMKvQH8kclUsAT+YxR6YXZdcveE3itWvSJ83wfWgLzoj/Env7/6cjtjQPR5vDbSYvaF4aYy/7vL0X8KXhIOTOWrC1i9GfnNLelyKDMUhxt7/IzDa2UdpaQ/xn1wT5KZHszz9xys+T5LtEbZsWKGci1FFddrlH4bQ==
X-OriginatorOrg: arm.com
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Apr 2020 20:06:25.5754 (UTC)
X-MS-Exchange-CrossTenant-Network-Message-Id: 5e9bc7bc-d8b2-4354-ad3e-08d7e7c1cd69
X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d
X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d; Ip=[63.35.35.123];
 Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com]
X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem
X-MS-Exchange-Transport-CrossTenantHeadersStamped: VE1PR08MB4686
Subject: Re: [dpdk-dev] [PATCH v2] lib/timer: relax barrier for status update
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
Errors-To: dev-bounces@dpdk.org
Sender: "dev" <dev-bounces@dpdk.org>

Hi Erik,

> Subject: [PATCH v2] lib/timer: relax barrier for status update
>=20
> Volatile has no ordering semantics. The rte_timer structure defines timer
> status as a volatile variable and uses the rte_r/wmb barrier to guarantee
> inter-thread visibility.
>=20
> This patch optimized the volatile operation with c11 atomic operations an=
d
> one-way barrier to save the performance penalty. According to the
> timer_perf_autotest benchmarking results, this patch can uplift 10%~16%
> timer appending performance, 3%~20% timer resetting performance and 45%
> timer callbacks scheduling performance on aarch64 and no loss in
> performance for x86.
>=20
> Suggested-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
> Signed-off-by: Phil Yang <phil.yang@arm.com>
> Reviewed-by: Gavin Hu <gavin.hu@arm.com>
>=20
> ---
> This patch depends on patch:
> http://patchwork.dpdk.org/patch/65997/
>=20
> v2:
> 1. Changed the memory ordering comment in timer_set_config_state.
> 2. It is still using built-ins as the wrapper functions for C11 built-ins=
 are not
> defined yet.
It is too late to get the wrapper functions done for 20.05. It was decided =
in yesterday's tech board meeting to go ahead with C11 atomic built-ins (si=
nce there is lot of code in DPDK that uses C11 built-ins). If there are no =
further comments, can you please provide your ack?

>=20
>  lib/librte_timer/rte_timer.c | 85 ++++++++++++++++++++++++++++++--------=
---
> ---
>  lib/librte_timer/rte_timer.h |  2 +-
>  2 files changed, 60 insertions(+), 27 deletions(-)
>=20
> diff --git a/lib/librte_timer/rte_timer.c b/lib/librte_timer/rte_timer.c =
index
> 269e921..ba17216 100644
> --- a/lib/librte_timer/rte_timer.c
> +++ b/lib/librte_timer/rte_timer.c
> @@ -10,7 +10,6 @@
>  #include <assert.h>
>  #include <sys/queue.h>
>=20
> -#include <rte_atomic.h>
>  #include <rte_common.h>
>  #include <rte_cycles.h>
>  #include <rte_eal_memconfig.h>
> @@ -218,7 +217,7 @@ rte_timer_init(struct rte_timer *tim)
>=20
>  	status.state =3D RTE_TIMER_STOP;
>  	status.owner =3D RTE_TIMER_NO_OWNER;
> -	tim->status.u32 =3D status.u32;
> +	__atomic_store_n(&tim->status.u32, status.u32,
> __ATOMIC_RELAXED);
>  }
>=20
>  /*
> @@ -239,9 +238,9 @@ timer_set_config_state(struct rte_timer *tim,
>=20
>  	/* wait that the timer is in correct status before update,
>  	 * and mark it as being configured */
> -	while (success =3D=3D 0) {
> -		prev_status.u32 =3D tim->status.u32;
> +	prev_status.u32 =3D __atomic_load_n(&tim->status.u32,
> __ATOMIC_RELAXED);
>=20
> +	while (success =3D=3D 0) {
>  		/* timer is running on another core
>  		 * or ready to run on local core, exit
>  		 */
> @@ -258,9 +257,15 @@ timer_set_config_state(struct rte_timer *tim,
>  		 * mark it atomically as being configured */
>  		status.state =3D RTE_TIMER_CONFIG;
>  		status.owner =3D (int16_t)lcore_id;
> -		success =3D rte_atomic32_cmpset(&tim->status.u32,
> -					      prev_status.u32,
> -					      status.u32);
> +		/* CONFIG states are acting as locked states. If the
> +		 * timer is in CONFIG state, the state cannot be changed
> +		 * by other threads. So, we should use ACQUIRE here.
> +		 */
> +		success =3D __atomic_compare_exchange_n(&tim->status.u32,
> +					      &prev_status.u32,
> +					      status.u32, 0,
> +					      __ATOMIC_ACQUIRE,
> +					      __ATOMIC_RELAXED);
>  	}
>=20
>  	ret_prev_status->u32 =3D prev_status.u32; @@ -279,20 +284,27 @@
> timer_set_running_state(struct rte_timer *tim)
>=20
>  	/* wait that the timer is in correct status before update,
>  	 * and mark it as running */
> -	while (success =3D=3D 0) {
> -		prev_status.u32 =3D tim->status.u32;
> +	prev_status.u32 =3D __atomic_load_n(&tim->status.u32,
> __ATOMIC_RELAXED);
>=20
> +	while (success =3D=3D 0) {
>  		/* timer is not pending anymore */
>  		if (prev_status.state !=3D RTE_TIMER_PENDING)
>  			return -1;
>=20
>  		/* here, we know that timer is stopped or pending,
> -		 * mark it atomically as being configured */
> +		 * mark it atomically as being running
> +		 */
>  		status.state =3D RTE_TIMER_RUNNING;
>  		status.owner =3D (int16_t)lcore_id;
> -		success =3D rte_atomic32_cmpset(&tim->status.u32,
> -					      prev_status.u32,
> -					      status.u32);
> +		/* RUNNING states are acting as locked states. If the
> +		 * timer is in RUNNING state, the state cannot be changed
> +		 * by other threads. So, we should use ACQUIRE here.
> +		 */
> +		success =3D __atomic_compare_exchange_n(&tim->status.u32,
> +					      &prev_status.u32,
> +					      status.u32, 0,
> +					      __ATOMIC_ACQUIRE,
> +					      __ATOMIC_RELAXED);
>  	}
>=20
>  	return 0;
> @@ -520,10 +532,12 @@ __rte_timer_reset(struct rte_timer *tim, uint64_t
> expire,
>=20
>  	/* update state: as we are in CONFIG state, only us can modify
>  	 * the state so we don't need to use cmpset() here */
> -	rte_wmb();
>  	status.state =3D RTE_TIMER_PENDING;
>  	status.owner =3D (int16_t)tim_lcore;
> -	tim->status.u32 =3D status.u32;
> +	/* The "RELEASE" ordering guarantees the memory operations above
> +	 * the status update are observed before the update by all threads
> +	 */
> +	__atomic_store_n(&tim->status.u32, status.u32, __ATOMIC_RELEASE);
>=20
>  	if (tim_lcore !=3D lcore_id || !local_is_locked)
>  		rte_spinlock_unlock(&priv_timer[tim_lcore].list_lock);
> @@ -600,10 +614,12 @@ __rte_timer_stop(struct rte_timer *tim, int
> local_is_locked,
>  	}
>=20
>  	/* mark timer as stopped */
> -	rte_wmb();
>  	status.state =3D RTE_TIMER_STOP;
>  	status.owner =3D RTE_TIMER_NO_OWNER;
> -	tim->status.u32 =3D status.u32;
> +	/* The "RELEASE" ordering guarantees the memory operations above
> +	 * the status update are observed before the update by all threads
> +	 */
> +	__atomic_store_n(&tim->status.u32, status.u32, __ATOMIC_RELEASE);
>=20
>  	return 0;
>  }
> @@ -637,7 +653,8 @@ rte_timer_stop_sync(struct rte_timer *tim)  int
> rte_timer_pending(struct rte_timer *tim)  {
> -	return tim->status.state =3D=3D RTE_TIMER_PENDING;
> +	return __atomic_load_n(&tim->status.state,
> +				__ATOMIC_RELAXED) =3D=3D
> RTE_TIMER_PENDING;
>  }
>=20
>  /* must be called periodically, run all timer that expired */ @@ -739,8
> +756,12 @@ __rte_timer_manage(struct rte_timer_data *timer_data)
>  			/* remove from done list and mark timer as stopped
> */
>  			status.state =3D RTE_TIMER_STOP;
>  			status.owner =3D RTE_TIMER_NO_OWNER;
> -			rte_wmb();
> -			tim->status.u32 =3D status.u32;
> +			/* The "RELEASE" ordering guarantees the memory
> +			 * operations above the status update are observed
> +			 * before the update by all threads
> +			 */
> +			__atomic_store_n(&tim->status.u32, status.u32,
> +				__ATOMIC_RELEASE);
>  		}
>  		else {
>  			/* keep it in list and mark timer as pending */ @@ -
> 748,8 +769,12 @@ __rte_timer_manage(struct rte_timer_data *timer_data)
>  			status.state =3D RTE_TIMER_PENDING;
>  			__TIMER_STAT_ADD(priv_timer, pending, 1);
>  			status.owner =3D (int16_t)lcore_id;
> -			rte_wmb();
> -			tim->status.u32 =3D status.u32;
> +			/* The "RELEASE" ordering guarantees the memory
> +			 * operations above the status update are observed
> +			 * before the update by all threads
> +			 */
> +			__atomic_store_n(&tim->status.u32, status.u32,
> +				__ATOMIC_RELEASE);
>  			__rte_timer_reset(tim, tim->expire + tim->period,
>  				tim->period, lcore_id, tim->f, tim->arg, 1,
>  				timer_data);
> @@ -919,8 +944,12 @@ rte_timer_alt_manage(uint32_t timer_data_id,
>  			/* remove from done list and mark timer as stopped
> */
>  			status.state =3D RTE_TIMER_STOP;
>  			status.owner =3D RTE_TIMER_NO_OWNER;
> -			rte_wmb();
> -			tim->status.u32 =3D status.u32;
> +			/* The "RELEASE" ordering guarantees the memory
> +			 * operations above the status update are observed
> +			 * before the update by all threads
> +			 */
> +			__atomic_store_n(&tim->status.u32, status.u32,
> +				__ATOMIC_RELEASE);
>  		} else {
>  			/* keep it in list and mark timer as pending */
>  			rte_spinlock_lock(
> @@ -928,8 +957,12 @@ rte_timer_alt_manage(uint32_t timer_data_id,
>  			status.state =3D RTE_TIMER_PENDING;
>  			__TIMER_STAT_ADD(data->priv_timer, pending, 1);
>  			status.owner =3D (int16_t)this_lcore;
> -			rte_wmb();
> -			tim->status.u32 =3D status.u32;
> +			/* The "RELEASE" ordering guarantees the memory
> +			 * operations above the status update are observed
> +			 * before the update by all threads
> +			 */
> +			__atomic_store_n(&tim->status.u32, status.u32,
> +				__ATOMIC_RELEASE);
>  			__rte_timer_reset(tim, tim->expire + tim->period,
>  				tim->period, this_lcore, tim->f, tim->arg, 1,
>  				data);
> diff --git a/lib/librte_timer/rte_timer.h b/lib/librte_timer/rte_timer.h =
index
> c6b3d45..df533fa 100644
> --- a/lib/librte_timer/rte_timer.h
> +++ b/lib/librte_timer/rte_timer.h
> @@ -101,7 +101,7 @@ struct rte_timer
>  {
>  	uint64_t expire;       /**< Time when timer expire. */
>  	struct rte_timer *sl_next[MAX_SKIPLIST_DEPTH];
> -	volatile union rte_timer_status status; /**< Status of timer. */
> +	union rte_timer_status status; /**< Status of timer. */
>  	uint64_t period;       /**< Period of timer (0 if not periodic). */
>  	rte_timer_cb_t f;      /**< Callback function. */
>  	void *arg;             /**< Argument to callback function. */
> --
> 2.7.4