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 13B60A04B1 for ; Sat, 10 Oct 2020 18:06:15 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id A328B1D938; Sat, 10 Oct 2020 18:05:50 +0200 (CEST) Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by dpdk.org (Postfix) with ESMTP id EFB4E1D92F for ; Sat, 10 Oct 2020 18:05:47 +0200 (CEST) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20201010160537euoutp024578584aec7a4a94abf01343c2b93d78~8rSQNR8sX2850728507euoutp02b for ; Sat, 10 Oct 2020 16:05:37 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20201010160537euoutp024578584aec7a4a94abf01343c2b93d78~8rSQNR8sX2850728507euoutp02b DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1602345937; bh=Ac7zUxbaUtkPUHeaPly+rcwUzr6TKwAmXEJAVMzD+lE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TzYFL9STJa8jHI7DNa9q0Ct2msvSHKqWYbG2Ijud6FVKd2WZ7CYcKfmfUpwsSVUcD iWcBZJeh2GSVgMqPLv5hzi1AWpPjKkXByXN92nd4m7mjPmvxI+jFekvjBBdo3o3Bmx VEb/oN35j5mM7Jyt3pCh7Yj9cT4l9W6ryKUJyMo0= Received: from eusmges1new.samsung.com (unknown [203.254.199.242]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20201010160529eucas1p15f13911de33cd87b46d546803a869e77~8rSIU8Pv02439624396eucas1p1w; Sat, 10 Oct 2020 16:05:29 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges1new.samsung.com (EUCPMTA) with SMTP id 11.E6.06456.9CBD18F5; Sat, 10 Oct 2020 17:05:29 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20201010160528eucas1p2b9b8189aef51c18d116f97ccebf5719c~8rSHrQtaR1129911299eucas1p2y; Sat, 10 Oct 2020 16:05:28 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20201010160528eusmtrp12676966b6f9c1b93a586a671e47e8de9~8rSHqs6qm2920229202eusmtrp1w; Sat, 10 Oct 2020 16:05:28 +0000 (GMT) X-AuditID: cbfec7f2-809ff70000001938-1c-5f81dbc9660a Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 3A.A6.06017.8CBD18F5; Sat, 10 Oct 2020 17:05:28 +0100 (BST) Received: from Padamandas.fritz.box (unknown [106.210.88.70]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20201010160527eusmtip12d50cfd036f29206d8e5c3f0695d0d23~8rSG-F62m2442224422eusmtip10; Sat, 10 Oct 2020 16:05:27 +0000 (GMT) From: Lukasz Wojciechowski To: David Hunt , Bruce Richardson Cc: dev@dpdk.org, l.wojciechow@partner.samsung.com, stable@dpdk.org Date: Sat, 10 Oct 2020 18:04:57 +0200 Message-Id: <20201010160508.19709-7-l.wojciechow@partner.samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201010160508.19709-1-l.wojciechow@partner.samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrCIsWRmVeSWpSXmKPExsWy7djP87onbzfGG2x+ymtxY5W9Rd+kj0wW 7z5tZ7J41rOO0eJfxx92B1aPXwuWsnos3vOSyePguz1MAcxRXDYpqTmZZalF+nYJXBmXO88y FjzUrejdtZOxgXGSahcjJ4eEgInEoouTGbsYuTiEBFYwSmxdvosJJCEk8IVRYv5xd4jEZ0aJ U51PgKo4wDouN5hBxJczSjxpf88O0fCJUeLPcjsQm03AVuLIzK+sILaIQJhEc/NeFpBeZgFn iSdf2UDCwgKeElc//AbbxSKgKrGr7zLYeF4BV4mZZ9QgbpOXWL3hADOIzSngJnG26yAbyFoJ gctsEq2PDrNDFLlIHN95nQXCFpZ4dXwLVFxG4vTkHhaIhm2MEld//2SEcPYzSlzvXQFVZS1x +N9vNojjNCXW79KHCDtK9PReYoL4l0/ixltBkDAzkDlp23RmiDCvREebEES1nsTTnqmMMGv/ rH0CdY6HxKIdf6BhexUYVFPeMk5glJ+FsGwBI+MqRvHU0uLc9NRiw7zUcr3ixNzi0rx0veT8 3E2MwLg//e/4px2MXy8lHWIU4GBU4uE9cLwxXog1say4MvcQowQHs5IIr9PZ03FCvCmJlVWp RfnxRaU5qcWHGKU5WJTEeY0XvYwVEkhPLEnNTk0tSC2CyTJxcEo1MLZzrxf5r3z4U/XtGWaJ 80JXrWW8MuG7YKnk9AxF04vJ9+ftsbcP/Mp63a9t/7r0fv6eiHmqlf1aJ6S+cvw8rLkmjz17 nbc78yFmKcOdnx6vrP3id77zUd0qteLaYov3ErP2FD9hj24uib/qx3LHt/LOqtjVD6wFAqcc Ndp+ag/XhiZFJhl3TSWW4oxEQy3mouJEABtrYxD3AgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrGLMWRmVeSWpSXmKPExsVy+t/xu7onbjfGG1ztUbG4screom/SRyaL d5+2M1k861nHaPGv4w+7A6vHrwVLWT0W73nJ5HHw3R6mAOYoPZui/NKSVIWM/OISW6VoQwsj PUNLCz0jE0s9Q2PzWCsjUyV9O5uU1JzMstQifbsEvYzLnWcZCx7qVvTu2snYwDhJtYuRg0NC wETicoNZFyMXh5DAUkaJc+sPs0PEZSQ+XBLoYuQEMoUl/lzrYoOo+cAo8eLqKjaQBJuArcSR mV9ZQepFBMIkTqz0BwkzC7hLbFk8lRnEFhbwlLj64TcTiM0ioCqxq+8yI0g5r4CrxMwzahDj 5SVWbzgAVs4p4CZxtusg1KpGRokTt2+yTWDkW8DIsIpRJLW0ODc9t9hIrzgxt7g0L10vOT93 EyMwDLcd+7llB2PXu+BDjAIcjEo8vBKnGuOFWBPLiitzDzFKcDArifA6nT0dJ8SbklhZlVqU H19UmpNafIjRFOioicxSosn5wBjJK4k3NDU0t7A0NDc2NzazUBLn7RA4GCMkkJ5YkpqdmlqQ WgTTx8TBKdXAuPftvAn+q/64teckHjYRd9wmVyuxVHrb7+ijExnPLj/lV/5B4CJzg8KB49+b dinXnTK3qrl3oIvhx89O33dT38y/E9q5qOnS/ACZhokRV+atfcWzcs+arniv3DlGpyTLK24I de39zNbfKvXc4rHEMttt8gwxLdyXGBSfRQdPq/bx/Hktda1yuBJLcUaioRZzUXEiAMgK5PtZ AgAA X-CMS-MailID: 20201010160528eucas1p2b9b8189aef51c18d116f97ccebf5719c X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20201010160528eucas1p2b9b8189aef51c18d116f97ccebf5719c X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20201010160528eucas1p2b9b8189aef51c18d116f97ccebf5719c References: <20201009220202.20834-1-l.wojciechow@partner.samsung.com> <20201010160508.19709-1-l.wojciechow@partner.samsung.com> Subject: [dpdk-stable] [PATCH v7 06/16] test/distributor: synchronize lcores statistics X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Sender: "stable" Statistics of handled packets are cleared and read on main lcore, while they are increased in workers handlers on different lcores. Without synchronization occasionally showed invalid values. This patch uses atomic acquire/release mechanisms to synchronize. Fixes: c3eabff124e6 ("distributor: add unit tests") Cc: bruce.richardson@intel.com Cc: stable@dpdk.org Signed-off-by: Lukasz Wojciechowski Acked-by: David Hunt --- app/test/test_distributor.c | 43 +++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/app/test/test_distributor.c b/app/test/test_distributor.c index 6cd7a2edd..838459392 100644 --- a/app/test/test_distributor.c +++ b/app/test/test_distributor.c @@ -43,7 +43,8 @@ total_packet_count(void) { unsigned i, count = 0; for (i = 0; i < worker_idx; i++) - count += worker_stats[i].handled_packets; + count += __atomic_load_n(&worker_stats[i].handled_packets, + __ATOMIC_ACQUIRE); return count; } @@ -51,7 +52,10 @@ total_packet_count(void) static inline void clear_packet_count(void) { - memset(&worker_stats, 0, sizeof(worker_stats)); + unsigned int i; + for (i = 0; i < RTE_MAX_LCORE; i++) + __atomic_store_n(&worker_stats[i].handled_packets, 0, + __ATOMIC_RELEASE); } /* this is the basic worker function for sanity test @@ -69,13 +73,13 @@ handle_work(void *arg) num = rte_distributor_get_pkt(db, id, buf, NULL, 0); while (!quit) { __atomic_fetch_add(&worker_stats[id].handled_packets, num, - __ATOMIC_RELAXED); + __ATOMIC_ACQ_REL); count += num; num = rte_distributor_get_pkt(db, id, buf, buf, num); } __atomic_fetch_add(&worker_stats[id].handled_packets, num, - __ATOMIC_RELAXED); + __ATOMIC_ACQ_REL); count += num; rte_distributor_return_pkt(db, id, buf, num); return 0; @@ -131,7 +135,8 @@ sanity_test(struct worker_params *wp, struct rte_mempool *p) for (i = 0; i < rte_lcore_count() - 1; i++) printf("Worker %u handled %u packets\n", i, - worker_stats[i].handled_packets); + __atomic_load_n(&worker_stats[i].handled_packets, + __ATOMIC_ACQUIRE)); printf("Sanity test with all zero hashes done.\n"); /* pick two flows and check they go correctly */ @@ -156,7 +161,9 @@ sanity_test(struct worker_params *wp, struct rte_mempool *p) for (i = 0; i < rte_lcore_count() - 1; i++) printf("Worker %u handled %u packets\n", i, - worker_stats[i].handled_packets); + __atomic_load_n( + &worker_stats[i].handled_packets, + __ATOMIC_ACQUIRE)); printf("Sanity test with two hash values done\n"); } @@ -182,7 +189,8 @@ sanity_test(struct worker_params *wp, struct rte_mempool *p) for (i = 0; i < rte_lcore_count() - 1; i++) printf("Worker %u handled %u packets\n", i, - worker_stats[i].handled_packets); + __atomic_load_n(&worker_stats[i].handled_packets, + __ATOMIC_ACQUIRE)); printf("Sanity test with non-zero hashes done\n"); rte_mempool_put_bulk(p, (void *)bufs, BURST); @@ -275,14 +283,16 @@ handle_work_with_free_mbufs(void *arg) num = rte_distributor_get_pkt(d, id, buf, NULL, 0); while (!quit) { - worker_stats[id].handled_packets += num; count += num; + __atomic_fetch_add(&worker_stats[id].handled_packets, num, + __ATOMIC_ACQ_REL); for (i = 0; i < num; i++) rte_pktmbuf_free(buf[i]); num = rte_distributor_get_pkt(d, id, buf, NULL, 0); } - worker_stats[id].handled_packets += num; count += num; + __atomic_fetch_add(&worker_stats[id].handled_packets, num, + __ATOMIC_ACQ_REL); rte_distributor_return_pkt(d, id, buf, num); return 0; } @@ -358,8 +368,9 @@ handle_work_for_shutdown_test(void *arg) /* wait for quit single globally, or for worker zero, wait * for zero_quit */ while (!quit && !(id == zero_id && zero_quit)) { - worker_stats[id].handled_packets += num; count += num; + __atomic_fetch_add(&worker_stats[id].handled_packets, num, + __ATOMIC_ACQ_REL); for (i = 0; i < num; i++) rte_pktmbuf_free(buf[i]); num = rte_distributor_get_pkt(d, id, buf, NULL, 0); @@ -373,10 +384,11 @@ handle_work_for_shutdown_test(void *arg) total += num; } - worker_stats[id].handled_packets += num; count += num; returned = rte_distributor_return_pkt(d, id, buf, num); + __atomic_fetch_add(&worker_stats[id].handled_packets, num, + __ATOMIC_ACQ_REL); if (id == zero_id) { /* for worker zero, allow it to restart to pick up last packet * when all workers are shutting down. @@ -387,7 +399,8 @@ handle_work_for_shutdown_test(void *arg) num = rte_distributor_get_pkt(d, id, buf, NULL, 0); while (!quit) { - worker_stats[id].handled_packets += num; + __atomic_fetch_add(&worker_stats[id].handled_packets, + num, __ATOMIC_ACQ_REL); count += num; rte_pktmbuf_free(pkt); num = rte_distributor_get_pkt(d, id, buf, NULL, 0); @@ -454,7 +467,8 @@ sanity_test_with_worker_shutdown(struct worker_params *wp, for (i = 0; i < rte_lcore_count() - 1; i++) printf("Worker %u handled %u packets\n", i, - worker_stats[i].handled_packets); + __atomic_load_n(&worker_stats[i].handled_packets, + __ATOMIC_ACQUIRE)); if (total_packet_count() != BURST * 2) { printf("Line %d: Error, not all packets flushed. " @@ -507,7 +521,8 @@ test_flush_with_worker_shutdown(struct worker_params *wp, zero_quit = 0; for (i = 0; i < rte_lcore_count() - 1; i++) printf("Worker %u handled %u packets\n", i, - worker_stats[i].handled_packets); + __atomic_load_n(&worker_stats[i].handled_packets, + __ATOMIC_ACQUIRE)); if (total_packet_count() != BURST) { printf("Line %d: Error, not all packets flushed. " -- 2.17.1