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 6D70BA04B5 for ; Wed, 23 Sep 2020 03:47:26 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E0E541DB51; Wed, 23 Sep 2020 03:47:25 +0200 (CEST) Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by dpdk.org (Postfix) with ESMTP id 264C51DA86 for ; Wed, 23 Sep 2020 03:47:21 +0200 (CEST) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20200923014720euoutp02dc02d736f187cd54a55f88743385fd47~3RnBLtYYt1896818968euoutp02v for ; Wed, 23 Sep 2020 01:47:20 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20200923014720euoutp02dc02d736f187cd54a55f88743385fd47~3RnBLtYYt1896818968euoutp02v DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1600825640; bh=xPWUwWzs8KDd9GRIYyNVFLY6E9FQFwkbk3DM1rTtSlk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ReCLG3HFEb4MOmmku7lXgMTemU1Sart/ySUaSRJLnOQ+3UBxbMllV3NZzzMVesRtL I+jCgCiAVYdxqei9d16O7qs3KbXoKSvfEB1ZUDVHgO6AgRen01E7SnEUnBv4VC4QM0 99LgEpQBVr7DCUfGRfrshVzgCofpDcmprLv+k3M0= Received: from eusmges2new.samsung.com (unknown [203.254.199.244]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20200923014719eucas1p2a4e75338e0095cf58358e3272c9de1d8~3RnAJ-vGw1510915109eucas1p2S; Wed, 23 Sep 2020 01:47:19 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges2new.samsung.com (EUCPMTA) with SMTP id 2A.7D.05997.729AA6F5; Wed, 23 Sep 2020 02:47:19 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20200923014719eucas1p2f26000109e86a649796e902c30e58bf0~3Rm-qh8ZM1449114491eucas1p2m; Wed, 23 Sep 2020 01:47:19 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20200923014719eusmtrp17b956b0e588a629851a5e974f0aa505d~3Rm-p7ZWx1355413554eusmtrp1J; Wed, 23 Sep 2020 01:47:19 +0000 (GMT) X-AuditID: cbfec7f4-65dff7000000176d-88-5f6aa927d404 Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 59.DB.06017.629AA6F5; Wed, 23 Sep 2020 02:47:18 +0100 (BST) Received: from Padamandas.fritz.box (unknown [106.210.88.70]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20200923014718eusmtip139e6492333de448e9ad19859e792d5c5~3Rm_-7RUw1064810648eusmtip1t; Wed, 23 Sep 2020 01:47:18 +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 03:47:07 +0200 Message-Id: <20200923014713.16932-3-l.wojciechow@partner.samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200923014713.16932-1-l.wojciechow@partner.samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrCIsWRmVeSWpSXmKPExsWy7djPc7rqK7PiDV6+lra4screom/SRyaL d5+2M1k861nHaPGv4w+7A6vHrwVLWT0W73nJ5HHw3R6mAOYoLpuU1JzMstQifbsErowPC3tZ Ct7qVEzf+p+1gXGhShcjB4eEgInE+7bgLkYuDiGBFYwSB7+tZoJwvjBKPPrXyALhfGaUmD3l A1sXIydYx9LGJ1BVyxklNvc/ZIRwPjFKPDvTAlbFJmArcWTmV1YQW0QgTKK5eS8LyD5mAWeJ J1/BSoQF3CUu3v/ABGKzCKhKdLR/ZwSxeQVcJa78mMAMsUxeYvWGA8wgrZwCbhJP/8mDrJIQ uMwmcfjYaiaIGheJKYeWMkLYwhKvjm9hh7BlJE5P7mGBaNjGKHH1909GCGc/o8T13hVQVdYS h//9ZoM4TlNi/S59SLg4ShzakwRh8knceCsIUswMZE7aNp0ZIswr0dEmBDFDT+Jpz1RGmK1/ 1j5hgbA9JP7sXAsOBCGBq4wS58/HTWCUn4WwagEj4ypG8dTS4tz01GKjvNRyveLE3OLSvHS9 5PzcTYzAuD/97/iXHYy7/iQdYhTgYFTi4X3xJDNeiDWxrLgy9xCjBAezkgiv09nTcUK8KYmV ValF+fFFpTmpxYcYpTlYlMR5jRe9jBUSSE8sSc1OTS1ILYLJMnFwSjUwqtn9LI1ubhXfYz0l JS4u8+YVs4fdjBfutlw6KqaRlXR2qxPr33Xz3PNtjZaKla0u/Bzwc0W5Bytf6vlL7gFafrNi d3zXzN4WlVp+4LfOl2U8Cxunm+zllrw7aU/nq3mf44KW31p9aLrAIavv1iynJhfF37y80ct5 nXXmLSY3hZD5XtMy3zp8U2Ipzkg01GIuKk4EAHWdnyX3AgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrGLMWRmVeSWpSXmKPExsVy+t/xu7pqK7PiDX7OtLG4screom/SRyaL d5+2M1k861nHaPGv4w+7A6vHrwVLWT0W73nJ5HHw3R6mAOYoPZui/NKSVIWM/OISW6VoQwsj PUNLCz0jE0s9Q2PzWCsjUyV9O5uU1JzMstQifbsEvYwPC3tZCt7qVEzf+p+1gXGhShcjJ4eE gInE0sYnTCC2kMBSRokrTaVdjBxAcRmJD5cEIEqEJf5c62LrYuQCKvnAKHFgZzMjSIJNwFbi yMyvrCD1IgJhEidW+oOEmQXcJbYsnsoMYgsD2RfvfwAbzyKgKtHR/h2slVfAVeLKjwnMEPPl JVZvOMAMMoZTwE3i6T95iFWNjBIzFr5mn8DIt4CRYRWjSGppcW56brGRXnFibnFpXrpecn7u JkZgGG479nPLDsaud8GHGAU4GJV4eF88yYwXYk0sK67MPcQowcGsJMLrdPZ0nBBvSmJlVWpR fnxRaU5q8SFGU6CjJjJLiSbnA2MkryTe0NTQ3MLS0NzY3NjMQkmct0PgYIyQQHpiSWp2ampB ahFMHxMHp1QDY+FN+ys/JVnZ/PeWPrvFYXNwy6serfeLvnKmhpvOWPIy6pqHaMnuWAbWuEks lzcXTNGZYHxLapnUNXnbpA7/FZuf8F2VZp36rZyv2fdze8VMj6qUD/bxPZ0WCvXsHSt38cu6 cRnO2vm4cwX/tMdf60QfN9XxGuie59/n4uar36G9W2HVlXkCSizFGYmGWsxFxYkA1ICtflkC AAA= X-CMS-MailID: 20200923014719eucas1p2f26000109e86a649796e902c30e58bf0 X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20200923014719eucas1p2f26000109e86a649796e902c30e58bf0 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20200923014719eucas1p2f26000109e86a649796e902c30e58bf0 References: <20200915193449.13310-1-l.wojciechow@partner.samsung.com> <20200923014713.16932-1-l.wojciechow@partner.samsung.com> Subject: [dpdk-stable] [PATCH v2 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 --- 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