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 C11CDA04BC for ; Sat, 10 Oct 2020 00:03:06 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E697A1D621; Sat, 10 Oct 2020 00:02:56 +0200 (CEST) Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by dpdk.org (Postfix) with ESMTP id 897AB1D609 for ; Sat, 10 Oct 2020 00:02:53 +0200 (CEST) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20201009220243euoutp0153e0770691baf64ab2f9c29ad3ec82a5~8cgwFVyTI2276622766euoutp01D for ; Fri, 9 Oct 2020 22:02:43 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20201009220243euoutp0153e0770691baf64ab2f9c29ad3ec82a5~8cgwFVyTI2276622766euoutp01D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1602280963; bh=Ac7zUxbaUtkPUHeaPly+rcwUzr6TKwAmXEJAVMzD+lE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rn8bNyvX39iuov3zXGACyi0ZDtBbe3EeUQ1deeCcBYTUgl+/WCrwNB3kUfc6MtgJ5 5U340nLFV5vR90YFuB1ooPiDiCuPW1nljdth0TLio2M7zwm7GppWRXqNR5eW2MgQxS n1SvIGJ6kii5po4uTJDjNheDnWmgSB3ArCHr8gC0= Received: from eusmges1new.samsung.com (unknown [203.254.199.242]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20201009220237eucas1p1e87988b9a9423b238e5a50ed66f804eb~8cgqIwZ2g0993409934eucas1p1Z; Fri, 9 Oct 2020 22:02:37 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges1new.samsung.com (EUCPMTA) with SMTP id EE.77.06456.CFDD08F5; Fri, 9 Oct 2020 23:02:36 +0100 (BST) Received: from eusmtrp2.samsung.com (unknown [182.198.249.139]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20201009220236eucas1p192e34b3bbf00681ec90de296abd1a6b5~8cgp0paro1070410704eucas1p1X; Fri, 9 Oct 2020 22:02:36 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp2.samsung.com (KnoxPortal) with ESMTP id 20201009220236eusmtrp2e846ecb2be6b0c14836e3cd6d5a12621~8cgp0JXBb1642116421eusmtrp2e; Fri, 9 Oct 2020 22:02:36 +0000 (GMT) X-AuditID: cbfec7f2-809ff70000001938-06-5f80ddfc6234 Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 93.5F.06017.CFDD08F5; Fri, 9 Oct 2020 23:02:36 +0100 (BST) Received: from Padamandas.fritz.box (unknown [106.210.88.70]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20201009220235eusmtip12df4f3d8b0749d38d0a8b56d634319d3~8cgo_KVhq1990219902eusmtip1H; Fri, 9 Oct 2020 22:02:35 +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 00:01:53 +0200 Message-Id: <20201009220202.20834-7-l.wojciechow@partner.samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201009220202.20834-1-l.wojciechow@partner.samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrBIsWRmVeSWpSXmKPExsWy7djPc7p/7jbEG/yfZWVxY5W9Rd+kj0wW 7z5tZ7J41rOO0eJfxx92B1aPXwuWsnos3vOSyePguz1MAcxRXDYpqTmZZalF+nYJXBmXO88y FjzUrejdtZOxgXGSahcjJ4eEgInEwp6bjF2MXBxCAisYJV71nWKGcL4wSuw+uw/K+cwo8ezB dSaYlp6ZfewQieWMEh+Wt0P1f2KUuHjoPytIFZuArcSRmV/BbBGBMInm5r0sXYwcHMwCzhJP vrKBhIUFPCU2vnjNDmKzCKhK3Dz4BizOK+AqcX7VJlaIZfISqzccYAaxOQXcJFp3LWMB2SUh cJ1N4vWmZVBFLhIXu1dD2cISr45vYYewZST+75zPBNGwjVHi6u+fjBDOfkaJ670roKqsJQ7/ +80GcZ2mxPpd+hBhR4m5t6Yzg4QlBPgkbrwVBAkzA5mTtsGEeSU62oQgqvUknvZMZYRZ+2ft ExYI20Ni/40HbJDwucoosejpdMYJjPKzEJYtYGRcxSieWlqcm55abJiXWq5XnJhbXJqXrpec n7uJERj/p/8d/7SD8eulpEOMAhyMSjy8DckN8UKsiWXFlbmHGCU4mJVEeJ3Ono4T4k1JrKxK LcqPLyrNSS0+xCjNwaIkzmu86GWskEB6YklqdmpqQWoRTJaJg1OqgXG7UpfE33fC0i8kXd4Z 9MwuNrl0ZeKWwk3Xd8dZfiqKECkryTiatvXs/BuBmUaTPdwV/SdwJZ5/46zpr7N5a0LRxxDp OUvVMyquv0/+9/kzX+C0Wh7fApcIxgfbj2jez7RSvnZMhivnRJPqrCuzfyx02cDe+/XKieJH tocUHodIGTtd+53O46LEUpyRaKjFXFScCAD+uX48+wIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrBLMWRmVeSWpSXmKPExsVy+t/xu7p/7jbEGyzeqmxxY5W9Rd+kj0wW 7z5tZ7J41rOO0eJfxx92B1aPXwuWsnos3vOSyePguz1MAcxRejZF+aUlqQoZ+cUltkrRhhZG eoaWFnpGJpZ6hsbmsVZGpkr6djYpqTmZZalF+nYJehmXO88yFjzUrejdtZOxgXGSahcjJ4eE gIlEz8w+9i5GLg4hgaWMEgvOTGDsYuQASshIfLgkAFEjLPHnWhcbRM0HRon2TatZQRJsArYS R2Z+ZQWpFxEIkzix0h8kzCzgLrFl8VRmEFtYwFNi44vX7CA2i4CqxM2Db9hAbF4BV4nzqzax QsyXl1i94QBYPaeAm0TrrmUsELsaGSW2HHjJPIGRbwEjwypGkdTS4tz03GIjveLE3OLSvHS9 5PzcTYzAUNx27OeWHYxd74IPMQpwMCrx8GokNsQLsSaWFVfmHmKU4GBWEuF1Ons6Tog3JbGy KrUoP76oNCe1+BCjKdBVE5mlRJPzgXGSVxJvaGpobmFpaG5sbmxmoSTO2yFwMEZIID2xJDU7 NbUgtQimj4mDU6qBcVrHlIVXrxdv8KicuL7Mz8Z044/euYfPLpN3PdgU8Knqxy0t+8KWpmP5 mZ7up2V9Uy4Z2IeVLzqV52vJ5zfht5VKXoHoO9Grz884CF169lif78l10dtaJ0yulXju3zFV 9sSO7Gl93jq9Nimi7b1fvI2yfi953z7vQyyz3eUZ5a87QzpUu0snK7EUZyQaajEXFScCAEdP Eq1bAgAA X-CMS-MailID: 20201009220236eucas1p192e34b3bbf00681ec90de296abd1a6b5 X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20201009220236eucas1p192e34b3bbf00681ec90de296abd1a6b5 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20201009220236eucas1p192e34b3bbf00681ec90de296abd1a6b5 References: <20201008052323.11547-1-l.wojciechow@partner.samsung.com> <20201009220202.20834-1-l.wojciechow@partner.samsung.com> Subject: [dpdk-stable] [PATCH v6 06/15] 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