From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 535AC45B94; Mon, 21 Oct 2024 19:48:41 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 6583640665; Mon, 21 Oct 2024 19:48:31 +0200 (CEST) Received: from frasgout.his.huawei.com (frasgout.his.huawei.com [185.176.79.56]) by mails.dpdk.org (Postfix) with ESMTP id 40E87402EA for ; Mon, 21 Oct 2024 19:48:26 +0200 (CEST) Received: from mail.maildlp.com (unknown [172.18.186.31]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4XXN5w39Wyz6K6pD; Tue, 22 Oct 2024 01:46:28 +0800 (CST) Received: from frapeml500007.china.huawei.com (unknown [7.182.85.172]) by mail.maildlp.com (Postfix) with ESMTPS id CEA4714022E; Tue, 22 Oct 2024 01:48:25 +0800 (CST) Received: from A2111108189.huawei.com (10.206.138.73) by frapeml500007.china.huawei.com (7.182.85.172) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Mon, 21 Oct 2024 19:48:25 +0200 From: Konstantin Ananyev To: CC: , , , , , , , Subject: [PATCH v6 4/7] ring: make dump function more verbose Date: Mon, 21 Oct 2024 18:47:42 +0100 Message-ID: <20241021174745.1843-5-konstantin.ananyev@huawei.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20241021174745.1843-1-konstantin.ananyev@huawei.com> References: <20241015130111.826-1-konstantin.v.ananyev@yandex.ru> <20241021174745.1843-1-konstantin.ananyev@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.206.138.73] X-ClientProxiedBy: frapeml100006.china.huawei.com (7.182.85.201) To frapeml500007.china.huawei.com (7.182.85.172) X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Eimear Morrissey The current rte_ring_dump function uses the generic rte_ring_headtail structure to access head/tail positions. This is incorrect for the RTS case where the head is stored in a different offset in the union of structs. Switching to a separate function for each sync type allows to dump correct head/tail values and extra metadata. Signed-off-by: Eimear Morrissey --- .mailmap | 1 + app/test/test_ring_stress_impl.h | 1 + lib/ring/rte_ring.c | 87 ++++++++++++++++++++++++++++++-- lib/ring/rte_ring.h | 15 ++++++ lib/ring/version.map | 7 +++ 5 files changed, 107 insertions(+), 4 deletions(-) diff --git a/.mailmap b/.mailmap index 5290420258..7d6fb51ca8 100644 --- a/.mailmap +++ b/.mailmap @@ -388,6 +388,7 @@ Eduard Serra Edward Makarov Edwin Brossette Eelco Chaudron +Eimear Morrissey Elad Nachman Elad Persiko Elena Agostini diff --git a/app/test/test_ring_stress_impl.h b/app/test/test_ring_stress_impl.h index ee5274aeef..f99a7ff675 100644 --- a/app/test/test_ring_stress_impl.h +++ b/app/test/test_ring_stress_impl.h @@ -380,6 +380,7 @@ test_mt1(int (*test)(void *)) } lcore_stat_dump(stdout, UINT32_MAX, &arg[mc].stats); + rte_ring_dump(stdout, r); mt1_fini(r, data); return rc; } diff --git a/lib/ring/rte_ring.c b/lib/ring/rte_ring.c index aebb6d6728..261f2a06db 100644 --- a/lib/ring/rte_ring.c +++ b/lib/ring/rte_ring.c @@ -364,20 +364,99 @@ rte_ring_free(struct rte_ring *r) rte_free(te); } +static const char * +ring_get_sync_type(const enum rte_ring_sync_type st) +{ + switch (st) { + case RTE_RING_SYNC_ST: + return "single thread"; + case RTE_RING_SYNC_MT: + return "multi thread"; + case RTE_RING_SYNC_MT_RTS: + return "multi thread - RTS"; + case RTE_RING_SYNC_MT_HTS: + return "multi thread - HTS"; + default: + return "unknown"; + } +} + +static void +ring_dump_ht_headtail(FILE *f, const char *prefix, + const struct rte_ring_headtail *ht) +{ + fprintf(f, "%ssync_type=%s\n", prefix, + ring_get_sync_type(ht->sync_type)); + fprintf(f, "%shead=%"PRIu32"\n", prefix, ht->head); + fprintf(f, "%stail=%"PRIu32"\n", prefix, ht->tail); +} + +static void +ring_dump_rts_headtail(FILE *f, const char *prefix, + const struct rte_ring_rts_headtail *rts) +{ + fprintf(f, "%ssync_type=%s\n", prefix, + ring_get_sync_type(rts->sync_type)); + fprintf(f, "%shead.pos=%"PRIu32"\n", prefix, rts->head.val.pos); + fprintf(f, "%shead.cnt=%"PRIu32"\n", prefix, rts->head.val.cnt); + fprintf(f, "%stail.pos=%"PRIu32"\n", prefix, rts->tail.val.pos); + fprintf(f, "%stail.cnt=%"PRIu32"\n", prefix, rts->tail.val.cnt); + fprintf(f, "%shtd_max=%"PRIu32"\n", prefix, rts->htd_max); +} + +static void +ring_dump_hts_headtail(FILE *f, const char *prefix, + const struct rte_ring_hts_headtail *hts) +{ + fprintf(f, "%ssync_type=%s\n", prefix, + ring_get_sync_type(hts->sync_type)); + fprintf(f, "%shead=%"PRIu32"\n", prefix, hts->ht.pos.head); + fprintf(f, "%stail=%"PRIu32"\n", prefix, hts->ht.pos.tail); +} + +void +rte_ring_headtail_dump(FILE *f, const char *prefix, + const struct rte_ring_headtail *r) +{ + if (f == NULL || r == NULL) + return; + + prefix = (prefix != NULL) ? prefix : ""; + + switch (r->sync_type) { + case RTE_RING_SYNC_ST: + case RTE_RING_SYNC_MT: + ring_dump_ht_headtail(f, prefix, r); + break; + case RTE_RING_SYNC_MT_RTS: + ring_dump_rts_headtail(f, prefix, + (const struct rte_ring_rts_headtail *)r); + break; + case RTE_RING_SYNC_MT_HTS: + ring_dump_hts_headtail(f, prefix, + (const struct rte_ring_hts_headtail *)r); + break; + default: + RING_LOG(ERR, "Invalid ring sync type detected"); + } +} + /* dump the status of the ring on the console */ void rte_ring_dump(FILE *f, const struct rte_ring *r) { + if (f == NULL || r == NULL) + return; + fprintf(f, "ring <%s>@%p\n", r->name, r); fprintf(f, " flags=%x\n", r->flags); fprintf(f, " size=%"PRIu32"\n", r->size); fprintf(f, " capacity=%"PRIu32"\n", r->capacity); - fprintf(f, " ct=%"PRIu32"\n", r->cons.tail); - fprintf(f, " ch=%"PRIu32"\n", r->cons.head); - fprintf(f, " pt=%"PRIu32"\n", r->prod.tail); - fprintf(f, " ph=%"PRIu32"\n", r->prod.head); fprintf(f, " used=%u\n", rte_ring_count(r)); fprintf(f, " avail=%u\n", rte_ring_free_count(r)); + + rte_ring_headtail_dump(f, " cons.", &(r->cons)); + rte_ring_headtail_dump(f, " prod.", &(r->prod)); } /* dump the status of all rings on the console */ diff --git a/lib/ring/rte_ring.h b/lib/ring/rte_ring.h index 11ca69c73d..33ac5e4423 100644 --- a/lib/ring/rte_ring.h +++ b/lib/ring/rte_ring.h @@ -204,6 +204,21 @@ void rte_ring_free(struct rte_ring *r); */ void rte_ring_dump(FILE *f, const struct rte_ring *r); +/** + * Dump the status of a headtail to a file. + * + * @param f + * A pointer to a file for output + * @param prefix + * A string to prefix each output line with + * @param r + * A pointer to a ring headtail structure. + */ +__rte_experimental +void +rte_ring_headtail_dump(FILE *f, const char *prefix, + const struct rte_ring_headtail *r); + /** * Enqueue several objects on the ring (multi-producers safe). * diff --git a/lib/ring/version.map b/lib/ring/version.map index 8da094a69a..61f7464f5a 100644 --- a/lib/ring/version.map +++ b/lib/ring/version.map @@ -14,3 +14,10 @@ DPDK_25 { local: *; }; + +EXPERIMENTAL { + global: + + # added in 24.11 + rte_ring_headtail_dump; +}; -- 2.35.3