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 88773A04C0 for ; Sat, 26 Sep 2020 00:42:37 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1102B1E9FD; Sat, 26 Sep 2020 00:42:28 +0200 (CEST) Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by dpdk.org (Postfix) with ESMTP id E2EB41D59C for ; Sat, 26 Sep 2020 00:42:19 +0200 (CEST) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20200925224218euoutp0276cf777c330c0a0de9df0cda2e7f7728~4KBUZyofP1843518435euoutp02p for ; Fri, 25 Sep 2020 22:42:18 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20200925224218euoutp0276cf777c330c0a0de9df0cda2e7f7728~4KBUZyofP1843518435euoutp02p DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1601073738; bh=F2MlnKN/Nod7IV1TW08UZJ2Os/OjS7XiqwUPYcL+iys=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GASBDG4ARJ8ECUNuenARGH35US1DEgzbINCIpBTKuv/jVlvdWwjKgmYbEj2OkAL42 BO0NO+RoF3TpcRFO1pYQKPjSoJYsgcXs+DJwjecJbBDZ+tqAH1wF6tIE5nx3s/MLaH 4k3aKkuVDg0/N4f7L8BSsDn0vdYOLRqrEYw3soNM= Received: from eusmges2new.samsung.com (unknown [203.254.199.244]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20200925224218eucas1p10706261cd46240a450963edad1c68448~4KBULKtQA3102531025eucas1p1p; Fri, 25 Sep 2020 22:42:18 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges2new.samsung.com (EUCPMTA) with SMTP id 44.DF.05997.A427E6F5; Fri, 25 Sep 2020 23:42:18 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20200925224217eucas1p1bb5f73109b4aeed8f2badf311fa8dfb5~4KBTcyk2c2913529135eucas1p1p; Fri, 25 Sep 2020 22:42:17 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20200925224217eusmtrp110da659902a56416eb7bae462229d3a7~4KBTcLuif1720917209eusmtrp18; Fri, 25 Sep 2020 22:42:17 +0000 (GMT) X-AuditID: cbfec7f4-65dff7000000176d-6e-5f6e724abaeb Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 0E.3C.06314.9427E6F5; Fri, 25 Sep 2020 23:42:17 +0100 (BST) Received: from localhost.localdomain (unknown [106.210.88.70]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20200925224216eusmtip29d97d79f3d886c65d0649b1cee6390bb~4KBS3gUV21081510815eusmtip2z; Fri, 25 Sep 2020 22:42:16 +0000 (GMT) From: Lukasz Wojciechowski To: David Hunt , Bruce Richardson Cc: dev@dpdk.org, l.wojciechow@partner.samsung.com, stable@dpdk.org Date: Sat, 26 Sep 2020 00:42:03 +0200 Message-Id: <20200925224209.12173-3-l.wojciechow@partner.samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200925224209.12173-1-l.wojciechow@partner.samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrCIsWRmVeSWpSXmKPExsWy7djP87peRXnxBp+fiFjcWGVv0TfpI5PF u0/bmSye9axjtPjX8YfdgdXj14KlrB6L97xk8jj4bg9TAHMUl01Kak5mWWqRvl0CV8b5aTfY C2bpVnTsecbcwHhSpYuRg0NCwERi+gL9LkYuDiGBFYwSs9uusUE4Xxglvl87xgLhfGaUOP18 IVMXIztYx6VwiPByRonXtxYj1HT0LwTq5uRgE7CVODLzKyuILSIQJtHcvJcFZBuzgLPEk69g JcIC7hJdM56zgNgsAqoSz2ZsYAexeQVcJa71/AKzJQTkJVZvOMAMYnMKuEl82zeXGWSXhMB1 NonTU/ewQRS5SDyYv4sRwhaWeHV8C1SzjMTpyT0sEA3bGCWu/v7JCOHsZ5S43rsCqspa4vC/ 32wQ12lKrN+lDxF2lDj05wUzJIj4JG68FQQJMwOZk7ZNhwrzSnS0CUFU60k87ZnKCLP2z9on LBAlHhKzmmIgwXOVUWJaSzfzBEb5WQi7FjAyrmIUTy0tzk1PLTbKSy3XK07MLS7NS9dLzs/d xAiM+9P/jn/ZwbjrT9IhRgEORiUeXoWnufFCrIllxZW5hxglOJiVRHidzp6OE+JNSaysSi3K jy8qzUktPsQozcGiJM5rvOhlrJBAemJJanZqakFqEUyWiYNTqoExI9zz0nnbS6KrjwV9Tghn 7Bc4lPJ8y0YPa0WTXVEcck5eKckzexlmvfqycdXuHp/W0K+Sbdc+uKs8WntZ/Po51cqFzLOd En3NP+SEB7G+czxf6vmpp/hfyq2vu9o6P4ecnHB7c91mVQ37fyeeFE/X5vK9fsapa3rCmpVu Dtd4Ngls3MxpYxSkxFKckWioxVxUnAgAzAyp9fcCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrCLMWRmVeSWpSXmKPExsVy+t/xe7qeRXnxBs/nylrcWGVv0TfpI5PF u0/bmSye9axjtPjX8YfdgdXj14KlrB6L97xk8jj4bg9TAHOUnk1RfmlJqkJGfnGJrVK0oYWR nqGlhZ6RiaWeobF5rJWRqZK+nU1Kak5mWWqRvl2CXsb5aTfYC2bpVnTsecbcwHhSpYuRnUNC wETiUngXIyeHkMBSRonbU7y7GDmAojISHy4JgIQlBIQl/lzrYoMo+cgocbXNBcRmE7CVODLz KytIuYhAmMSJlf4gYWYBd4kti6cyg9jCQHbXjOcsIDaLgKrEsxkb2EFsXgFXiWs9v9ghxstL rN5wAKyeU8BN4tu+uUA2F9CqRkaJnjd9rBMY+RYwMqxiFEktLc5Nzy021CtOzC0uzUvXS87P 3cQIDMFtx35u3sF4aWPwIUYBDkYlHt4Tj3LjhVgTy4orcw8xSnAwK4nwOp09HSfEm5JYWZVa lB9fVJqTWnyI0RToqonMUqLJ+cD4yCuJNzQ1NLewNDQ3Njc2s1AS5+0QOBgjJJCeWJKanZpa kFoE08fEwSnVwNhQ+ENn1y2/9K0sMjv8vm85xD3x1JG+8uWTuwoZ/V6b/W1mmCiWJ1oTMuPj sZSr/evuzJitc/AvR5qc/y2BHxrFjxK5bm2P+jrN1TE/4/4sgeO3nP0eNR01LvMvDXn3O8bq /do9j36w1zu5Xmp7vGXtq8j4lJmmLjsz5P7vFTDYdLmHKy/J7JQSS3FGoqEWc1FxIgDIg+b9 VwIAAA== X-CMS-MailID: 20200925224217eucas1p1bb5f73109b4aeed8f2badf311fa8dfb5 X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20200925224217eucas1p1bb5f73109b4aeed8f2badf311fa8dfb5 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20200925224217eucas1p1bb5f73109b4aeed8f2badf311fa8dfb5 References: <20200923132541.21417-1-l.wojciechow@partner.samsung.com> <20200925224209.12173-1-l.wojciechow@partner.samsung.com> Subject: [dpdk-stable] [PATCH v4 2/8] 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 | 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