From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 26E90A3201 for ; Mon, 21 Oct 2019 10:25:34 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id CF11137B7; Mon, 21 Oct 2019 10:25:33 +0200 (CEST) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) by dpdk.org (Postfix) with ESMTP id 656DF374E for ; Mon, 21 Oct 2019 10:25:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1571646331; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=KykPfnCDbmeW2/MmvQv12+Zes+rTFESUde3s5kcZH0w=; b=GrLes1/xgANOddWpnLZir2oBK8xMrbT85W1EZJ23a06nbRL1vHEkrHuvX1iBCTcLbRvddY D/YEzmr3c2NrBeNYGC1q4w1h3tFkNg94NL/XE5DKQXHXdGj5DQQqzB6TosYCVpK3nVLxtu ES73ApxEl7utYhpbNItS8ApHGBRyq34= Received: from mail-vk1-f200.google.com (mail-vk1-f200.google.com [209.85.221.200]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-335-n1LKfY1SPhuMczBj-fjvsQ-1; Mon, 21 Oct 2019 04:25:28 -0400 Received: by mail-vk1-f200.google.com with SMTP id q187so5879789vkq.4 for ; Mon, 21 Oct 2019 01:25:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=X0wzLHxLEv2FnupP0j6PaNjvSH9hrLePE8TSUkFtmps=; b=FV4SQ+pSb/8KoxLypPfHt2Z6ojUH1K8h1TmIpZvijqDsDdfWIN0F8erTG3wPTOxrLK 1eL1bu3WEI//LXivd7wT5/7Cd2XXNTkMkqFF+dlwFhCGOraDc1mP96/FBzkXgOOd8j8K gP22jlfJB6AMaN8EhOVQyuYmJeIWkmLEamZKEQhOEU/ETvlDw1L3+6DhrASm3Le9KFmQ KfYy6z06SOHXydhEtP45qrsU8bT+/AAvjB6SThgmaZlBPrn9tMqtNeVAxsTuwxbWMtQB trPiRuCuDB5wl5AFnKxhh7Ch3T00C+nIXuHeYhs+xRt8MwEkVuusDuhSXSqfzmvzALkg dYyA== X-Gm-Message-State: APjAAAWfq6xRhQr1lC6nhU8tuFr3/JRUUVYnRy8seTmwfWv7ofp2rPUw DPnHXwUxOjXGy7O9UtaSVTVKMEqiyXCUW+l/8/SkB6XLyaRy45th3vtMkTyFXePN9Sih9R07dOd yWofd84IpBefFKwQPCl0= X-Received: by 2002:a67:fc49:: with SMTP id p9mr12229649vsq.198.1571646327942; Mon, 21 Oct 2019 01:25:27 -0700 (PDT) X-Google-Smtp-Source: APXvYqylm9TlKvwE40pcdyHXPanRLEMxfb2niGwpn/m910H4RmHCcuLUdUAPgY65Cyyl/Uk+cw/yy8CzYIVS4xc8f9g= X-Received: by 2002:a67:fc49:: with SMTP id p9mr12229636vsq.198.1571646327608; Mon, 21 Oct 2019 01:25:27 -0700 (PDT) MIME-Version: 1.0 References: <1571139508-21701-1-git-send-email-phil.yang@arm.com> <1571397690-14116-1-git-send-email-phil.yang@arm.com> <1571397690-14116-2-git-send-email-phil.yang@arm.com> In-Reply-To: <1571397690-14116-2-git-send-email-phil.yang@arm.com> From: David Marchand Date: Mon, 21 Oct 2019 10:25:16 +0200 Message-ID: To: Phil Yang Cc: Jerin Jacob Kollanukkaran , Gage Eads , dev , Thomas Monjalon , Hemant Agrawal , Honnappa Nagarahalli , Gavin Hu , nd X-MC-Unique: n1LKfY1SPhuMczBj-fjvsQ-1 X-Mimecast-Spam-Score: 0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [dpdk-dev] [PATCH v11 2/3] test/atomic: add 128b compare and swap test 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" On Fri, Oct 18, 2019 at 1:22 PM Phil Yang wrote: > > Add 128b atomic compare and swap test for aarch64 and x86_64. > Extend the test iteration from 10 thousand to 1 million times to test > the stability of the atomic APIs. > > Signed-off-by: Phil Yang > Reviewed-by: Honnappa Nagarahalli > Acked-by: Gage Eads > Acked-by: Jerin Jacob > Tested-by: Jerin Jacob > --- > app/test/test_atomic.c | 125 +++++++++++++++++++++++++++++++++++++++++++= +++++- > 1 file changed, 123 insertions(+), 2 deletions(-) > > diff --git a/app/test/test_atomic.c b/app/test/test_atomic.c > index 43be30e..14bd3a8 100644 > --- a/app/test/test_atomic.c > +++ b/app/test/test_atomic.c > @@ -1,5 +1,6 @@ > /* SPDX-License-Identifier: BSD-3-Clause > * Copyright(c) 2010-2014 Intel Corporation > + * Copyright(c) 2019 Arm Limited > */ > > #include > @@ -20,7 +21,7 @@ > * Atomic Variables > * =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > * > - * - The main test function performs three subtests. The first test > + * - The main test function performs four subtests. The first test > * checks that the usual inc/dec/add/sub functions are working > * correctly: > * > @@ -61,11 +62,27 @@ > * atomic_sub(&count, tmp+1); > * > * - At the end of the test, the *count* value must be 0. > + * > + * - Test "128b compare and swap" (aarch64 and x86_64 only) > + * > + * - Initialize 128-bit atomic variables to zero. > + * > + * - Invoke ``test_atomic128_cmp_exchange()`` on each lcore. Before do= ing > + * anything else, the cores are waiting a synchro. Each lcore does > + * these compare and swap (CAS) operations several times:: > + * > + * Acquired CAS update counter.val[0] + 2; counter.val[1] + 1; > + * Released CAS update counter.val[0] + 2; counter.val[1] + 1; > + * Acquired_Released CAS update counter.val[0] + 2; counter.val[1]= + 1; > + * Relaxed CAS update counter.val[0] + 2; counter.val[1] + 1; > + * > + * - At the end of the test, the *count128* first 64-bit value and > + * second 64-bit value differ by the total iterations. > */ > > #define NUM_ATOMIC_TYPES 3 > > -#define N 10000 > +#define N 1000000 > > static rte_atomic16_t a16; > static rte_atomic32_t a32; > @@ -216,6 +233,78 @@ test_atomic_dec_and_test(__attribute__((unused)) voi= d *arg) > return 0; > } > > +#if defined(RTE_ARCH_X86_64) || defined(RTE_ARCH_ARM64) > +static rte_int128_t count128; > + > +/* > + * rte_atomic128_cmp_exchange() should update a 128 bits counter's first= 64 > + * bits by 2 and the second 64 bits by 1 in this test. It should return = true > + * if the compare exchange operation is successful. > + * This test repeats 128 bits compare and swap operations N rounds. In e= ach > + * iteration it runs compare and swap operation with different memory mo= dels. > + */ > +static int > +test_atomic128_cmp_exchange(__attribute__((unused)) void *arg) > +{ > + rte_int128_t expected; > + int success; > + unsigned int i; > + > + while (rte_atomic32_read(&synchro) =3D=3D 0) > + ; > + > + expected =3D count128; > + > + for (i =3D 0; i < N; i++) { > + do { > + rte_int128_t desired; > + > + desired.val[0] =3D expected.val[0] + 2; > + desired.val[1] =3D expected.val[1] + 1; > + > + success =3D rte_atomic128_cmp_exchange(&count128, > + &expected, &desired, 1, > + __ATOMIC_ACQUIRE, __ATOMIC_RELAXED); > + } while (success =3D=3D 0); > + > + do { > + rte_int128_t desired; > + > + desired.val[0] =3D expected.val[0] + 2; > + desired.val[1] =3D expected.val[1] + 1; > + > + success =3D rte_atomic128_cmp_exchange(&count128, > + &expected, &desired, 1, > + __ATOMIC_RELEASE, __ATOMIC_RELAXE= D); > + } while (success =3D=3D 0); > + > + do { > + rte_int128_t desired; > + > + desired.val[0] =3D expected.val[0] + 2; > + desired.val[1] =3D expected.val[1] + 1; > + > + success =3D rte_atomic128_cmp_exchange(&count128, > + &expected, &desired, 1, > + __ATOMIC_ACQ_REL, __ATOMIC_RELAXE= D); > + } while (success =3D=3D 0); > + > + do { > + rte_int128_t desired; > + > + desired.val[0] =3D expected.val[0] + 2; > + desired.val[1] =3D expected.val[1] + 1; > + > + success =3D rte_atomic128_cmp_exchange(&count128, > + &expected, &desired, 1, > + __ATOMIC_RELAXED, __ATOMIC_RELAXE= D); > + } while (success =3D=3D 0); > + } > + > + return 0; > +} > +#endif > + > static int > test_atomic(void) > { > @@ -340,6 +429,38 @@ test_atomic(void) > return -1; > } > > +#if defined(RTE_ARCH_X86_64) || defined(RTE_ARCH_ARM64) > + /* > + * This case tests the functionality of rte_atomic128b_cmp_exchan= ge > + * API. It calls rte_atomic128b_cmp_exchange with four kinds of m= emory > + * models successively on each slave core. Once each 128-bit atom= ic > + * compare and swap operation is successful, it updates the globa= l > + * 128-bit counter by 2 for the first 64-bit and 1 for the second > + * 64-bit. Each slave core iterates this test N times. > + * At the end of test, verify whether the first 64-bits of the 12= 8-bit > + * counter and the second 64bits is differ by the total iteration= s. If > + * it is, the test passes. > + */ > + printf("128b compare and swap test\n"); > + uint64_t iterations =3D 0; > + > + rte_atomic32_clear(&synchro); > + count128.val[0] =3D 0; > + count128.val[1] =3D 0; > + > + rte_eal_mp_remote_launch(test_atomic128_cmp_exchange, NULL, > + SKIP_MASTER); > + rte_atomic32_set(&synchro, 1); > + rte_eal_mp_wait_lcore(); > + rte_atomic32_clear(&synchro); > + > + iterations =3D count128.val[0] - count128.val[1]; > + if (iterations !=3D 4*N*(rte_lcore_count()-1)) { > + printf("128b compare and swap failed\n"); > + return -1; > + } > +#endif > + > return 0; > } > > -- > 2.7.4 > Applied, thanks. --=20 David Marchand