[PATCH v11 4/7] ring: make dump function more verbose
Konstantin Ananyev
konstantin.ananyev at huawei.com
Fri Dec 6 19:35:57 CET 2024
From: Eimear Morrissey <eimear.morrissey at huawei.com>
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 <eimear.morrissey at huawei.com>
Acked-by: Morten Brørup <mb at smartsharesystems.com>
Acked-by: Stephen Hemminger <stephen at networkplumber.org>
Signed-off-by: Konstantin Ananyev <konstantin.ananyev at huawei.com>
---
.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 818798273f..b90ff0444c 100644
--- a/.mailmap
+++ b/.mailmap
@@ -390,6 +390,7 @@ Eduard Serra <eserra at vmware.com>
Edward Makarov <makarov at kraftway.ru>
Edwin Brossette <edwin.brossette at 6wind.com>
Eelco Chaudron <echaudro at redhat.com>
+Eimear Morrissey <eimear.morrissey at huawei.com>
Elad Nachman <eladv6 at gmail.com>
Elad Persiko <eladpe at mellanox.com>
Elena Agostini <eagostini at nvidia.com>
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..a7d9d6b037 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 "ST";
+ case RTE_RING_SYNC_MT:
+ return "MT";
+ case RTE_RING_SYNC_MT_RTS:
+ return "MT_RTS";
+ case RTE_RING_SYNC_MT_HTS:
+ return "MT_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..dfe3c1914a 100644
--- a/lib/ring/version.map
+++ b/lib/ring/version.map
@@ -14,3 +14,10 @@ DPDK_25 {
local: *;
};
+
+EXPERIMENTAL {
+ global:
+
+ # added in 25.03
+ rte_ring_headtail_dump;
+};
--
2.35.3
More information about the dev
mailing list