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 0560EA04B1 for ; Wed, 23 Sep 2020 15:25:53 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id B4E541DC8E; Wed, 23 Sep 2020 15:25:52 +0200 (CEST) Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by dpdk.org (Postfix) with ESMTP id 32FCD1DB61 for ; Wed, 23 Sep 2020 15:25:47 +0200 (CEST) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20200923132546euoutp02399b62c42ba0f0439e269cb49db630c1~3bI1QqxpN1116311163euoutp02C for ; Wed, 23 Sep 2020 13:25:46 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20200923132546euoutp02399b62c42ba0f0439e269cb49db630c1~3bI1QqxpN1116311163euoutp02C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1600867546; bh=F2MlnKN/Nod7IV1TW08UZJ2Os/OjS7XiqwUPYcL+iys=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=n6cAk5Tai8JjRdisJpBP7mXSfkkdH+fia0eF5xOgujaMcR67HXjvISZcw/X6Hzxlf m67T25E4MuzVNJ9Sx/gEdTACV7YLRXpHbF9Xx9AiAT2ysuxdiw6jLor2HTeytYrqMF zmps52GtG9HLXrAVkqcnDgpGX1q9SeNdFeaStJz8= Received: from eusmges1new.samsung.com (unknown [203.254.199.242]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20200923132546eucas1p146579ec1d91ad7b6eb8a2b30439d4bed~3bI1GCjZI2311923119eucas1p1Y; Wed, 23 Sep 2020 13:25:46 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges1new.samsung.com (EUCPMTA) with SMTP id 84.B3.06456.ADC4B6F5; Wed, 23 Sep 2020 14:25:46 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20200923132546eucas1p212b6eede801514b544d82d41f5b7e4b8~3bI0xKIs-1223812238eucas1p28; Wed, 23 Sep 2020 13:25:46 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20200923132546eusmtrp177a398ec63c36538bb3008465a3879b2~3bI0wh5_u3190431904eusmtrp1B; Wed, 23 Sep 2020 13:25:46 +0000 (GMT) X-AuditID: cbfec7f2-809ff70000001938-1f-5f6b4cdaaaed Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id E9.FA.06017.ADC4B6F5; Wed, 23 Sep 2020 14:25:46 +0100 (BST) Received: from Padamandas.fritz.box (unknown [106.210.88.70]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20200923132545eusmtip24ddf44d28ad55e2edebf9e2f005aa862~3bI0DlCy_2716727167eusmtip2c; Wed, 23 Sep 2020 13:25:45 +0000 (GMT) From: Lukasz Wojciechowski To: David Hunt , Bruce Richardson Cc: dev@dpdk.org, l.wojciechow@partner.samsung.com, stable@dpdk.org Date: Wed, 23 Sep 2020 15:25:35 +0200 Message-Id: <20200923132541.21417-3-l.wojciechow@partner.samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200923132541.21417-1-l.wojciechow@partner.samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrCIsWRmVeSWpSXmKPExsWy7djP87q3fLLjDd5elLW4screom/SRyaL d5+2M1k861nHaPGv4w+7A6vHrwVLWT0W73nJ5HHw3R6mAOYoLpuU1JzMstQifbsErozz026w F8zSrejY84y5gfGkShcjJ4eEgInExC0b2boYuTiEBFYwShz6uJERwvnCKNHV9JEFpEpI4DOj xLPfcjAdzZ/2M0EULWeU2H36ATuE8wmofcYJZpAqNgFbiSMzv7KC2CICYRLNzXuBJnFwMAs4 Szz5ygZiCgu4S7RfCAWpYBFQlXhx7ic7SJhXwFVi1g91iFXyEqs3HAAbyCngJvHhx3uw2yQE LrNJ/PzQwwJR5CJxfM11ZghbWOLV8S3sELaMxOnJIDUgDdsYJa7+/gnVvZ9R4nrvCqgqa4nD /36zQdymKbF+lz6IKSHgKPGumRHC5JO48VYQpJgZyJy0bTozRJhXoqNNCGKGnsTTnqmMMFv/ rH0CdZmHRPfbLayQwLnKKLH+yQ3mCYzysxB2LWBkXMUonlpanJueWmyYl1quV5yYW1yal66X nJ+7iREY96f/Hf+0g/HrpaRDjAIcjEo8vBy62fFCrIllxZW5hxglOJiVRHidzp6OE+JNSays Si3Kjy8qzUktPsQozcGiJM5rvOhlrJBAemJJanZqakFqEUyWiYNTqoHR8FLPq5LuuY2L3/se dhG4llbIpu/70+Tas3bVtU8mP7Extgy9xDX5/Ba51n9ypR0LpzVu5NIxKP0+kZPbmifoXtrf 56X7VvU+Y9mZsFRQ38vp2+LM+yLmq3Nzil21OHt/vnqZND3wu/V2xyl7Q9fpflJaJsFwpcXw 4bH8va9SBc/vX2L3p/uoEktxRqKhFnNRcSIAs/A07vcCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrGLMWRmVeSWpSXmKPExsVy+t/xe7q3fLLjDR7vYbe4screom/SRyaL d5+2M1k861nHaPGv4w+7A6vHrwVLWT0W73nJ5HHw3R6mAOYoPZui/NKSVIWM/OISW6VoQwsj PUNLCz0jE0s9Q2PzWCsjUyV9O5uU1JzMstQifbsEvYzz026wF8zSrejY84y5gfGkShcjJ4eE gIlE86f9TF2MXBxCAksZJU6t3sHcxcgBlJCR+HBJAKJGWOLPtS42iJoPjBJ/jl5gB0mwCdhK HJn5lRWkXkQgTOLESn+QMLOAu8SWxVPBxggD2e0XQkHCLAKqEi/O/WQHCfMKuErM+qEOMV1e YvWGA8wgNqeAm8SHH+8ZITY1MkpsfNvGOIGRbwEjwypGkdTS4tz03GIjveLE3OLSvHS95Pzc TYzAMNx27OeWHYxd74IPMQpwMCrx8HLoZscLsSaWFVfmHmKU4GBWEuF1Ons6Tog3JbGyKrUo P76oNCe1+BCjKdBRE5mlRJPzgTGSVxJvaGpobmFpaG5sbmxmoSTO2yFwMEZIID2xJDU7NbUg tQimj4mDU6qBUSRfJ/3D+fPrHTuOT5vEsyHgyszpLTMkipmuCExPSuSeaG3QXXfH5Mi1pP9q YlfDNrS28Oncniad39V14U3Ut6Zb5dPWxYZM0X3x0tFx1Uzbe1v8jMN1JkvbabBf03OeUn/9 3xvH275C/0K+uP5sN98df+TGY/+Gx9uOHRX6Wb8mJorBfIHYHiWW4oxEQy3mouJEAJmDuexZ AgAA X-CMS-MailID: 20200923132546eucas1p212b6eede801514b544d82d41f5b7e4b8 X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20200923132546eucas1p212b6eede801514b544d82d41f5b7e4b8 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20200923132546eucas1p212b6eede801514b544d82d41f5b7e4b8 References: <20200923014713.16932-1-l.wojciechow@partner.samsung.com> <20200923132541.21417-1-l.wojciechow@partner.samsung.com> Subject: [dpdk-stable] [PATCH v3 2/8] app/test: synchronize statistics between lcores 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 | 39 ++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/app/test/test_distributor.c b/app/test/test_distributor.c index 35b25463a..0e49e3714 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; } @@ -52,6 +53,7 @@ static inline void clear_packet_count(void) { memset(&worker_stats, 0, sizeof(worker_stats)); + rte_atomic_thread_fence(__ATOMIC_RELEASE); } /* this is the basic worker function for sanity test @@ -72,13 +74,13 @@ handle_work(void *arg) num = rte_distributor_get_pkt(db, id, buf, buf, num); 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; @@ -134,7 +136,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 */ @@ -159,7 +162,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"); } @@ -185,7 +190,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); @@ -280,15 +286,17 @@ handle_work_with_free_mbufs(void *arg) buf[i] = NULL; num = rte_distributor_get_pkt(d, id, buf, buf, num); 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, buf, num); } - 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; } @@ -363,8 +371,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, @@ -379,10 +388,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. @@ -394,10 +404,11 @@ handle_work_for_shutdown_test(void *arg) id, buf, buf, num); while (!quit) { - worker_stats[id].handled_packets += num; count += num; rte_pktmbuf_free(pkt); num = rte_distributor_get_pkt(d, id, buf, buf, num); + __atomic_fetch_add(&worker_stats[id].handled_packets, + num, __ATOMIC_ACQ_REL); } returned = rte_distributor_return_pkt(d, id, buf, num); @@ -461,7 +472,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. " @@ -514,7 +526,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