All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pravin Pathak <pravinpathakdev@gmail.com>
To: dev@dpdk.org
Cc: jerinj@marvell.com, mike.ximing.chen@intel.com,
	bruce.richardson@intel.com, thomas@monjalon.net,
	david.marchand@redhat.com, nipun.gupta@amd.com,
	chenbox@nvidia.com, tirthendu.sarkar@intel.com,
	Pravin Pathak <pravin.pathak.dev@gmail.com>
Subject: [PATCH v1 5/8] event/slb: add extended statistics and diagnostics
Date: Fri,  6 Nov 2026 20:30:07 -0500	[thread overview]
Message-ID: <20261107013011.2443138-6-pravinpathakdev@gmail.com> (raw)
In-Reply-To: <20261107013011.2443138-1-pravinpathakdev@gmail.com>

From: Pravin Pathak <pravin.pathak.dev@gmail.com>

Implement the eventdev extended statistics (xstats) interface and
enhance PMD diagnostics in the dump callback.

Device and per-port statistics are exposed through xstats callbacks,
including enqueue/dequeue counts, credit loan counts, and migration
tallies. The slb_dump callback is extended to display detailed per-port
and per-queue internal state, atomic migration status, and queue depth.

Signed-off-by: Pravin Pathak <pravin.pathak.dev@gmail.com>
---
 drivers/event/slb/meson.build  |   5 +
 drivers/event/slb/slb_evdev.c  |  94 ++++++++-
 drivers/event/slb/slb_evdev.h  |  11 ++
 drivers/event/slb/slb_xstats.c | 347 +++++++++++++++++++++++++++++++++
 4 files changed, 450 insertions(+), 7 deletions(-)
 create mode 100644 drivers/event/slb/slb_xstats.c

diff --git a/drivers/event/slb/meson.build b/drivers/event/slb/meson.build
index 9a1dff524f..d698a58f16 100644
--- a/drivers/event/slb/meson.build
+++ b/drivers/event/slb/meson.build
@@ -10,6 +10,11 @@ endif
 sources = files(
         'slb_evdev.c',
         'slb_event.c',
+        'slb_xstats.c',
 )
 
 deps += ['bus_vdev', 'ring']
+
+if cc.has_argument('-Wno-format-nonliteral')
+    cflags += '-Wno-format-nonliteral'
+endif
diff --git a/drivers/event/slb/slb_evdev.c b/drivers/event/slb/slb_evdev.c
index 1916b7faa4..04a2aba165 100644
--- a/drivers/event/slb/slb_evdev.c
+++ b/drivers/event/slb/slb_evdev.c
@@ -606,6 +606,8 @@ slb_dump(struct rte_eventdev *dev, FILE *f)
 {
 	struct slb_evdev *slb = slb_pmd_priv(dev);
 	int32_t pool_on_loan, pool_avail;
+	uint64_t total_mig_in = 0, total_mig_out = 0;
+	int i;
 
 	if (dev == NULL || f == NULL)
 		return;
@@ -617,20 +619,41 @@ slb_dump(struct rte_eventdev *dev, FILE *f)
 	fprintf(f, "\n[SLB EVENTDEV DEBUG STATS]\n");
 	fprintf(f, "  Device ID: %u, Driver: %s\n", dev->data->dev_id,
 		SLB_PMD_NAME);
-	fprintf(f, "  Credit Pool: %d on_loan / %d max_inflight (%d avail)\n",
+	fprintf(f, "  Credit Pool: %d on_loan / %d max_inflight (%d available)\n",
 		pool_on_loan, slb->max_inflight, pool_avail);
 
+	fprintf(f, "\n  PORT FLOW MIGRATION COUNTERS:\n");
+	for (i = 0; i < slb->num_ports; i++) {
+		struct slb_port *p = &slb->ports[i];
+
+		total_mig_in += p->migrations_in;
+		total_mig_out += p->migrations_out;
+		fprintf(f,
+			"    Port %2u: Migrated-In: %6" PRIu64
+			" | Migrated-Out: %6" PRIu64 " | Net: %+5" PRId64 "\n",
+			i, p->migrations_in, p->migrations_out,
+			(int64_t)p->migrations_in - (int64_t)p->migrations_out);
+	}
+	fprintf(f, "    Total Flow Migrations: IN=%" PRIu64 ", OUT=%" PRIu64 "\n",
+		total_mig_in, total_mig_out);
+
 	fprintf(f, "\n  PORT STATISTICS & QUEUE LINKAGES:\n");
-	for (int i = 0; i < slb->num_ports; i++) {
+	for (i = 0; i < slb->num_ports; i++) {
 		struct slb_port *p = &slb->ports[i];
 		uint64_t aq = rte_atomic_load_explicit(&p->active_queues,
 						       rte_memory_order_acquire);
-		fprintf(f, "    Port %2u (credits=%3d, active=0x%08" PRIx64 "): ",
-			i, p->inflight_credits, aq);
 		int linked_count = 0;
+
+		fprintf(f,
+			"    Port %2u (credits=%3d, active=0x%08" PRIx64
+			", loaded=%d, mig_in=%" PRIu64 ", mig_out=%" PRIu64 "): ",
+			i, p->inflight_credits, aq, p->is_loaded,
+			p->migrations_in, p->migrations_out);
+
 		if (p->is_single_linked) {
 			if (p->single_linked_q) {
 				int qid = p->single_linked_q - slb->queues;
+
 				fprintf(f, "Q%d (single-link)", qid);
 				linked_count++;
 			}
@@ -638,6 +661,7 @@ slb_dump(struct rte_eventdev *dev, FILE *f)
 			for (int pr = 0; pr < SLB_MAX_PRIORITIES; pr++) {
 				for (int s = 0; s < p->num_q[pr]; s++) {
 					int qid = p->q_entries[pr][s].queue_id;
+
 					if (linked_count > 0)
 						fprintf(f, ", ");
 					fprintf(f, "Q%d(p%d)", qid, pr);
@@ -648,16 +672,69 @@ slb_dump(struct rte_eventdev *dev, FILE *f)
 		if (linked_count == 0)
 			fprintf(f, "(no queues linked)");
 		fprintf(f, "\n");
+		fprintf(f,
+			"            stats: enq_calls=%" PRIu64
+			", new_enq=%" PRIu64 ", fwd_enq=%" PRIu64
+			", rel_enq=%" PRIu64 ", deq_calls=%" PRIu64
+			", deq=%" PRIu64 "\n",
+			p->enqueue_calls, p->new_enqueued,
+			p->forward_enqueued, p->release_enqueued,
+			p->dequeue_calls, p->dequeued);
 	}
 
 	fprintf(f, "\n  ALL QUEUES STATUS:\n");
-	for (int i = 0; i < slb->num_queues; i++) {
+	for (i = 0; i < slb->num_queues; i++) {
 		struct slb_queue *q = &slb->queues[i];
 		uint32_t count = rte_event_ring_count(q->q_ring);
 		uint32_t ring_size = rte_event_ring_get_capacity(q->q_ring);
-		fprintf(f, "    Queue %2u: %6u/%6u events, serving_ports=0x%016" PRIx64 ", sched=%u, single=%d\n",
+
+		fprintf(f,
+			"    Queue %2u: %6u/%6u events, serving_ports=0x%016" PRIx64
+			" (count=%u), sched_type=%u, single_link=%d\n",
 			i, count, ring_size, q->serving_ports_mask,
-			q->schedule_type, q->is_single_link);
+			q->num_serving_ports, q->schedule_type,
+			q->is_single_link);
+		if (q->schedule_type == RTE_SCHED_TYPE_ATOMIC) {
+			if (q->atomic_state) {
+				fprintf(f,
+					"      Atomic State: total_migrations=%" PRIu64
+					", hold_count=%u\n",
+					q->atomic_state->migrations_count,
+					q->atomic_state->hold_count);
+				if (q->atomic_state->migration.in_progress) {
+					fprintf(f,
+						"      MIGRATION IN PROGRESS: from port %u, flow_idx=%u\n",
+						q->atomic_state->migration.port_id,
+						q->atomic_state->migration.flow_idx);
+				}
+				for (int j = 0; j < slb->num_ports; j++) {
+					if (q->per_port_rings[j]) {
+						struct slb_atomic_port_stats *ps =
+							&q->atomic_state->port_stats[j];
+
+						fprintf(f,
+							"      Per-port ring %d: %u events"
+							" (load_counter=%u, flows=%u,"
+							" enq=%" PRIu64 ", ret=%" PRIu64 ")\n",
+							j,
+							rte_event_ring_count(q->per_port_rings[j]),
+							ps->load_counter,
+							ps->flow_count,
+							ps->q_enqueued,
+							ps->q_returned);
+					}
+				}
+			}
+		} else if (q->schedule_type == RTE_SCHED_TYPE_ORDERED) {
+			fprintf(f, "      Ordered reorder_drain_idx=%u\n",
+				q->reorder_drain_idx);
+		}
+		if (count > 0 && q->serving_ports_mask == 0)
+			fprintf(f,
+				"      ^^^ PROBLEM: Queue has %u events but serving_ports_mask=0!\n",
+				count);
+		if (count == 0 && q->serving_ports_mask == 0)
+			fprintf(f, "      (unused queue)\n");
 	}
 	fprintf(f, "[END DEBUG]\n\n");
 	fflush(f);
@@ -678,6 +755,9 @@ static struct eventdev_ops slb_evdev_ops = {
 	.dev_stop = slb_stop,
 	.dev_close = slb_close,
 	.dump = slb_dump,
+	.xstats_get = slb_xstats_get,
+	.xstats_get_names = slb_xstats_get_names,
+	.xstats_get_by_name = slb_xstats_get_by_name,
 };
 
 static int
diff --git a/drivers/event/slb/slb_evdev.h b/drivers/event/slb/slb_evdev.h
index b1a6de8606..17f3154efa 100644
--- a/drivers/event/slb/slb_evdev.h
+++ b/drivers/event/slb/slb_evdev.h
@@ -231,6 +231,17 @@ void slb_reorder_drain(struct slb_evdev *slb, struct slb_queue *queue);
 
 void slb_dump(struct rte_eventdev *dev, FILE *f);
 
+int slb_xstats_get_names(const struct rte_eventdev *dev,
+			 enum rte_event_dev_xstats_mode mode,
+			 uint8_t queue_port_id,
+			 struct rte_event_dev_xstats_name *xstats_names,
+			 uint64_t *ids, unsigned int capacity);
+int slb_xstats_get(const struct rte_eventdev *dev,
+		   enum rte_event_dev_xstats_mode mode, uint8_t queue_port_id,
+		   const uint64_t ids[], uint64_t values[], unsigned int n);
+uint64_t slb_xstats_get_by_name(const struct rte_eventdev *dev,
+				const char *name, uint64_t *id);
+
 static inline struct slb_evdev *
 slb_pmd_priv(const struct rte_eventdev *eventdev)
 {
diff --git a/drivers/event/slb/slb_xstats.c b/drivers/event/slb/slb_xstats.c
new file mode 100644
index 0000000000..fdb7dd6cc5
--- /dev/null
+++ b/drivers/event/slb/slb_xstats.c
@@ -0,0 +1,347 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2026 Pravin Pathak <pravin.pathak.dev@gmail.com>
+ */
+
+#include "slb_evdev.h"
+
+#include <limits.h>
+#include <stdbool.h>
+#include <string.h>
+
+#include <rte_debug.h>
+#include <rte_string_fns.h>
+
+/* The high bits in the xstats id is used to store an additional
+ * parameter (beyond the queue or port id already in the xstats
+ * interface).
+ */
+#define SLB_XSTATS_ID_PARAM_BITS (8)
+#define SLB_XSTATS_ID_STAT_BITS \
+	(sizeof(uint64_t) * CHAR_BIT - SLB_XSTATS_ID_PARAM_BITS)
+#define SLB_XSTATS_ID_STAT_MASK ((UINT64_C(1) << SLB_XSTATS_ID_STAT_BITS) - 1)
+
+#define SLB_XSTATS_ID_GET_PARAM(id) \
+	((id) >> SLB_XSTATS_ID_STAT_BITS)
+
+#define SLB_XSTATS_ID_GET_STAT(id) \
+	((id) & SLB_XSTATS_ID_STAT_MASK)
+
+#define SLB_XSTATS_ID_CREATE(id, param_value) \
+	((((uint64_t)(param_value)) << SLB_XSTATS_ID_STAT_BITS) | (id))
+
+typedef uint64_t (*slb_xstats_dev_get_value_fn)(struct slb_evdev *slb);
+
+struct slb_xstat_dev {
+	const char *name;
+	slb_xstats_dev_get_value_fn get_value_fn;
+};
+
+typedef uint64_t (*slb_xstats_port_get_value_fn)(struct slb_evdev *slb,
+						 uint8_t port_id,
+						 uint8_t queue_id);
+
+struct slb_xstats_port {
+	const char *name_fmt;
+	slb_xstats_port_get_value_fn get_value_fn;
+	bool per_queue;
+};
+
+static uint64_t
+slb_xstats_dev_credits_on_loan(struct slb_evdev *slb)
+{
+	return rte_atomic_load_explicit(&slb->credits_on_loan,
+					rte_memory_order_relaxed);
+}
+
+static struct slb_xstat_dev slb_dev_xstats[] = {
+	{ "dev_credits_on_loan", slb_xstats_dev_credits_on_loan }
+};
+
+#define SLB_GEN_PORT_ACCESS_FN(_variable) \
+	static uint64_t \
+	slb_xstats_port_get_ ## _variable(struct slb_evdev *slb, \
+					  uint8_t port_id, \
+					  uint8_t queue_id __rte_unused) \
+	{ \
+		return slb->ports[port_id]._variable; \
+	}
+
+SLB_GEN_PORT_ACCESS_FN(new_enqueued)
+SLB_GEN_PORT_ACCESS_FN(forward_enqueued)
+SLB_GEN_PORT_ACCESS_FN(release_enqueued)
+
+static uint64_t
+slb_xstats_port_get_queue_enqueued(struct slb_evdev *slb, uint8_t port_id,
+				   uint8_t queue_id)
+{
+	return slb->ports[port_id].queue_enqueued[queue_id];
+}
+
+SLB_GEN_PORT_ACCESS_FN(dequeued)
+
+static uint64_t
+slb_xstats_port_get_queue_dequeued(struct slb_evdev *slb, uint8_t port_id,
+				   uint8_t queue_id)
+{
+	return slb->ports[port_id].queue_dequeued[queue_id];
+}
+
+SLB_GEN_PORT_ACCESS_FN(inflight_credits)
+SLB_GEN_PORT_ACCESS_FN(pending_releases)
+SLB_GEN_PORT_ACCESS_FN(migrations_in)
+SLB_GEN_PORT_ACCESS_FN(migrations_out)
+
+static struct slb_xstats_port slb_port_xstats[] = {
+	{ "port_%u_new_enqueued", slb_xstats_port_get_new_enqueued,
+	  false },
+	{ "port_%u_forward_enqueued", slb_xstats_port_get_forward_enqueued,
+	  false },
+	{ "port_%u_release_enqueued", slb_xstats_port_get_release_enqueued,
+	  false },
+	{ "port_%u_queue_%u_enqueued", slb_xstats_port_get_queue_enqueued,
+	  true },
+	{ "port_%u_dequeued", slb_xstats_port_get_dequeued,
+	  false },
+	{ "port_%u_queue_%u_dequeued", slb_xstats_port_get_queue_dequeued,
+	  true },
+	{ "port_%u_inflight_credits", slb_xstats_port_get_inflight_credits,
+	  false },
+	{ "port_%u_pending_releases", slb_xstats_port_get_pending_releases,
+	  false },
+	{ "port_%u_migrations_in", slb_xstats_port_get_migrations_in,
+	  false },
+	{ "port_%u_migrations_out", slb_xstats_port_get_migrations_out,
+	  false },
+};
+
+typedef void (*slb_xstats_foreach_fn)(const char *xstats_name,
+				      enum rte_event_dev_xstats_mode mode,
+				      uint8_t queue_port_id,
+				      uint64_t xstats_id,
+				      void *data);
+
+static void
+slb_xstats_dev_foreach(slb_xstats_foreach_fn fn, void *fn_data)
+{
+	unsigned int i;
+
+	for (i = 0; i < RTE_DIM(slb_dev_xstats); i++)
+		fn(slb_dev_xstats[i].name, RTE_EVENT_DEV_XSTATS_DEVICE, 0,
+		   i, fn_data);
+}
+
+static void
+slb_xstats_port_foreach(struct slb_evdev *slb, uint8_t port_id,
+			slb_xstats_foreach_fn fn, void *fn_data)
+{
+	uint8_t queue_id;
+	unsigned int stat_idx;
+
+	for (stat_idx = 0, queue_id = 0;
+	     stat_idx < RTE_DIM(slb_port_xstats);) {
+		struct slb_xstats_port *xstat = &slb_port_xstats[stat_idx];
+		char xstats_name[RTE_EVENT_DEV_XSTATS_NAME_SIZE];
+		uint64_t xstats_id;
+
+		if (xstat->per_queue) {
+			xstats_id = SLB_XSTATS_ID_CREATE(stat_idx, queue_id);
+			snprintf(xstats_name, sizeof(xstats_name),
+				 slb_port_xstats[stat_idx].name_fmt, port_id,
+				 queue_id);
+			queue_id++;
+		} else {
+			xstats_id = stat_idx;
+			snprintf(xstats_name, sizeof(xstats_name),
+				 slb_port_xstats[stat_idx].name_fmt, port_id);
+		}
+
+		fn(xstats_name, RTE_EVENT_DEV_XSTATS_PORT, port_id,
+		   xstats_id, fn_data);
+
+		if (!(xstat->per_queue && queue_id < slb->num_queues)) {
+			stat_idx++;
+			queue_id = 0;
+		}
+	}
+}
+
+struct store_ctx {
+	struct rte_event_dev_xstats_name *names;
+	uint64_t *ids;
+	unsigned int count;
+	unsigned int capacity;
+};
+
+static void
+slb_xstats_store_stat(const char *xstats_name,
+		      enum rte_event_dev_xstats_mode mode,
+		      uint8_t queue_port_id, uint64_t xstats_id,
+		      void *data)
+{
+	struct store_ctx *ctx = data;
+
+	RTE_SET_USED(mode);
+	RTE_SET_USED(queue_port_id);
+
+	if (ctx->count < ctx->capacity) {
+		if (ctx->names != NULL)
+			strlcpy(ctx->names[ctx->count].name, xstats_name,
+				RTE_EVENT_DEV_XSTATS_NAME_SIZE);
+		if (ctx->ids != NULL)
+			ctx->ids[ctx->count] = xstats_id;
+	}
+
+	ctx->count++;
+}
+
+int
+slb_xstats_get_names(const struct rte_eventdev *dev,
+		     enum rte_event_dev_xstats_mode mode,
+		     uint8_t queue_port_id,
+		     struct rte_event_dev_xstats_name *xstats_names,
+		     uint64_t *ids, unsigned int capacity)
+{
+	struct slb_evdev *slb = slb_pmd_priv(dev);
+	struct store_ctx ctx = {
+		.names = xstats_names,
+		.ids = ids,
+		.capacity = capacity
+	};
+
+	switch (mode) {
+	case RTE_EVENT_DEV_XSTATS_DEVICE:
+		slb_xstats_dev_foreach(slb_xstats_store_stat, &ctx);
+		return ctx.count;
+	case RTE_EVENT_DEV_XSTATS_PORT:
+		if (queue_port_id >= slb->num_ports)
+			return -EINVAL;
+		slb_xstats_port_foreach(slb, queue_port_id,
+					slb_xstats_store_stat, &ctx);
+		return ctx.count;
+	case RTE_EVENT_DEV_XSTATS_QUEUE:
+		return 0;
+	default:
+		return -EINVAL;
+	}
+}
+
+static int
+slb_xstats_dev_get(const struct rte_eventdev *dev,
+		   const uint64_t ids[], uint64_t values[], unsigned int n)
+{
+	struct slb_evdev *slb = slb_pmd_priv(dev);
+	unsigned int i;
+
+	for (i = 0; i < n; i++) {
+		uint64_t id = ids[i];
+		struct slb_xstat_dev *xstat;
+
+		if (id >= RTE_DIM(slb_dev_xstats))
+			return -EINVAL;
+
+		xstat = &slb_dev_xstats[id];
+		values[i] = xstat->get_value_fn(slb);
+	}
+	return n;
+}
+
+static int
+slb_xstats_port_get(const struct rte_eventdev *dev, uint8_t port_id,
+		    const uint64_t ids[], uint64_t values[], unsigned int n)
+{
+	struct slb_evdev *slb = slb_pmd_priv(dev);
+	unsigned int i;
+
+	for (i = 0; i < n; i++) {
+		uint64_t id = ids[i];
+		unsigned int stat_idx = SLB_XSTATS_ID_GET_STAT(id);
+		struct slb_xstats_port *xstat;
+		uint8_t queue_id = 0;
+
+		if (stat_idx >= RTE_DIM(slb_port_xstats))
+			return -EINVAL;
+
+		xstat = &slb_port_xstats[stat_idx];
+
+		if (xstat->per_queue) {
+			queue_id = SLB_XSTATS_ID_GET_PARAM(id);
+			if (queue_id >= slb->num_queues)
+				return -EINVAL;
+		}
+
+		values[i] = xstat->get_value_fn(slb, port_id, queue_id);
+	}
+	return n;
+}
+
+int
+slb_xstats_get(const struct rte_eventdev *dev,
+	       enum rte_event_dev_xstats_mode mode, uint8_t queue_port_id,
+	       const uint64_t ids[], uint64_t values[], unsigned int n)
+{
+	struct slb_evdev *slb = slb_pmd_priv(dev);
+
+	switch (mode) {
+	case RTE_EVENT_DEV_XSTATS_DEVICE:
+		return slb_xstats_dev_get(dev, ids, values, n);
+	case RTE_EVENT_DEV_XSTATS_PORT:
+		if (queue_port_id >= slb->num_ports)
+			return -EINVAL;
+		return slb_xstats_port_get(dev, queue_port_id, ids, values, n);
+	case RTE_EVENT_DEV_XSTATS_QUEUE:
+		return 0;
+	default:
+		return -EINVAL;
+	}
+}
+
+struct find_ctx {
+	const struct rte_eventdev *dev;
+	const char *name;
+	uint64_t *id;
+	uint64_t value;
+};
+
+static void
+slb_xstats_find_stat(const char *xstats_name,
+		     enum rte_event_dev_xstats_mode mode,
+		     uint8_t queue_port_id, uint64_t xstats_id,
+		     void *data)
+{
+	struct find_ctx *ctx = data;
+
+	if (strcmp(ctx->name, xstats_name) == 0) {
+		if (ctx->id != NULL)
+			*ctx->id = xstats_id;
+		slb_xstats_get(ctx->dev, mode, queue_port_id, &xstats_id,
+			       &ctx->value, 1);
+	}
+}
+
+uint64_t
+slb_xstats_get_by_name(const struct rte_eventdev *dev, const char *name,
+		       uint64_t *id)
+{
+	struct slb_evdev *slb = slb_pmd_priv(dev);
+	struct find_ctx ctx = {
+		.dev = dev,
+		.name = name,
+		.id = id,
+		.value = -EINVAL
+	};
+	uint16_t port_id;
+
+	if (id != NULL)
+		*id = (uint64_t)-1;
+
+	if (name == NULL)
+		return -EINVAL;
+
+	slb_xstats_dev_foreach(slb_xstats_find_stat, &ctx);
+
+	for (port_id = 0; port_id < slb->num_ports; port_id++)
+		slb_xstats_port_foreach(slb, port_id, slb_xstats_find_stat,
+					&ctx);
+
+	return ctx.value;
+}
-- 
2.53.0


  parent reply	other threads:[~2026-11-07  1:31 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-07  1:30 [PATCH v1 0/8] event/slb: introducing software load balancer eventdev PMD Pravin Pathak
2026-11-07  1:30 ` [PATCH v1 1/8] event/slb: introduce software load balancer PMD Pravin Pathak
2026-11-07  1:30 ` [PATCH v1 2/8] event/slb: add support for ordered queues Pravin Pathak
2026-11-07  1:30 ` [PATCH v1 3/8] event/slb: add support for atomic queues Pravin Pathak
2026-11-07  1:30 ` [PATCH v1 4/8] event/slb: add dynamic flow migration " Pravin Pathak
2026-11-07  1:30 ` Pravin Pathak [this message]
2026-11-07  1:30 ` [PATCH v1 6/8] event/slb: add self-test and documentation Pravin Pathak
2026-11-07  1:30 ` [PATCH v1 7/8] event/slb: update resets and credit defaults Pravin Pathak
2026-11-07  1:30 ` [PATCH v1 8/8] event/slb: improve port linking, config checks and atomic refill Pravin Pathak
2026-11-07  7:29 ` [PATCH v1 0/8] event/slb: introducing software load balancer eventdev PMD Jerin Jacob
2026-11-08 17:10   ` Stephen Hemminger
2026-11-09  2:30   ` Pravin Pathak
2026-11-09 12:55     ` Jerin Jacob
2026-11-11 14:22       ` Sarkar, Tirthendu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261107013011.2443138-6-pravinpathakdev@gmail.com \
    --to=pravinpathakdev@gmail.com \
    --cc=bruce.richardson@intel.com \
    --cc=chenbox@nvidia.com \
    --cc=david.marchand@redhat.com \
    --cc=dev@dpdk.org \
    --cc=jerinj@marvell.com \
    --cc=mike.ximing.chen@intel.com \
    --cc=nipun.gupta@amd.com \
    --cc=pravin.pathak.dev@gmail.com \
    --cc=thomas@monjalon.net \
    --cc=tirthendu.sarkar@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.