@@ -388,6 +388,7 @@ Eduard Serra <eserra@vmware.com>
Edward Makarov <makarov@kraftway.ru>
Edwin Brossette <edwin.brossette@6wind.com>
Eelco Chaudron <echaudro@redhat.com>
+Eimear Morrissey <eimear.morrissey@huawei.com>
Elad Nachman <eladv6@gmail.com>
Elad Persiko <eladpe@mellanox.com>
Elena Agostini <eagostini@nvidia.com>
@@ -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;
}
@@ -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 */
@@ -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).
*
@@ -14,3 +14,10 @@ DPDK_25 {
local: *;
};
+
+EXPERIMENTAL {
+ global:
+
+ # added in 24.11
+ rte_ring_headtail_dump;
+};