On Mon, Nov 9, 2026 at 6:25 PM Jerin Jacob <[email protected]> wrote:
> Lets get the performance  numbers for SLB vs DSW based on same test
> case so  that we can decide.
> Performance and scalability will be the aspect to decide the usage of
> YET ANOTHER SW driver.

Hi Pravin,

A few points on top of Stephen's review, plus some early numbers since
Jerin asked for SLB vs DSW data.

+1 to Stephen's two Errors in patch 2 (reorder slot reuse when RELEASE
returns credits before the slot drains, and the lost wakeup in
slb_reorder_drain()) and to the credit-threshold issue in patch 1.
Those look like the ones that can lose or strand events.

Additional comments:

1. slb_event.c, slb_event_enqueue_burst_generic(): the return value of
   rte_event_ring_enqueue_burst() is ignored on every path and the
   function always returns events_len. Correctness then depends
   entirely on credits guaranteeing ring space. If that ever fails
   (e.g. the credit-threshold or reorder issues above, or application
   misuse), events are silently dropped and their credits leak. At
   minimum, check the return value and report a short enqueue.
   Because the burst is sorted by destination queue before enqueue,
   a clean prefix count isn't possible after a partial failure, so
   this probably needs a space check up front or an explicit design
   statement that rings can never fill.

2. RTE_VERIFY(num_forward + num_release <= cur_pending) in the
   enqueue fast path aborts the whole process on application misuse
   (forwarding more events than were dequeued on that port). Please
   fail the enqueue and set rte_errno instead.

3. slb_configure(): max_inflight = RTE_MAX(nb_events_limit,
   nb_ports * SLB_PORT_MAX_CREDITS), so the device can hold more
   events than the application configured via nb_events_limit. If
   that is intended (to avoid credit-cache deadlock), please document
   it in slb.rst.

4. slb_queue_setup() ignores queue_conf->priority; priority comes only
   from the link priority, yet dev_info reports
   max_event_queue_priority_levels = 2. Either honour queue priority or
   report 1 and document that priority is per link.

Performance
-----------
Preliminary data from dpdk-test-eventdev perf_queue, series applied on
v26.11-rc2, release build, Xeon 6505P (2x12C), physical cores only,
turbo on, default device settings, worker_deq_depth 16, 1024 flows.
Mpps, 1 synthetic producer, workers on socket 0:

  stlist   driver   1w     2w     4w     8w
  p          slb       79.7   71.5   44.5   34.0
  p          dsw     50.1   46.3   45.1   41.9
  a          slb       54.3   65.3   57.0   43.9
  a          dsw     50.3   47.3   46.7   40.5
  a,a,a    slb      20.8    16.9   22.9   26.7
  a,a,a    dsw    20.8    18.4   20.1   18.2
  o          slb      61.7    29.5   36.6   27.4
  o          sw        7.7    10.0   11.7   13.7
  o,a       slb      36.0    19.5   28.3   28.9
  o,a       sw       3.8       5.7     7.5      7.2

(event_dsw does not support ordered queues, so ordered rows are
against event_sw.)

Observations:
- SLB is ahead at low worker counts but loses throughput faster as
  workers are added on single-stage parallel/atomic queues, which is
  consistent with all workers contending on one MP/MC ring per queue.
- Ordered queues are well ahead of event_sw (the only other SW PMD with
  ordered support), but SLB ordered throughput halves going from 1 to
  2 workers (61.7 -> 29.5 Mpps, reproduced), so the "close to
  parallel" claim only holds for a single worker (parallel: 79.7 ->
  71.5). This looks like the serialized reorder drain.
- With workers spanning both sockets (16/20 workers) all drivers drop
  sharply; SLB falls to 5-10 Mpps vs DSW 3-14 depending on stlist.
- Note that with multiple producers perf_queue creates a separate
  queue set per producer, which splits SLB's per-queue contention; SLB
  scales very well in that mode (4 producers, 8 workers, atomic:
  ~235 Mpps vs ~158 for DSW at worker_deq_depth 16), but that does not
  reflect a pipeline where all traffic shares one atomic queue.
- order_queue passes with up to 16 workers. In that test SLB slows down
  as workers are added: with 8 workers it sustained ~1.0 M events/s vs
  ~2.5 M events/s for event_sw (steady-state rate from the progress
  counter, 20M events); with 1-2 workers SLB was faster than event_sw
  (rough end-to-end timings, ~3.2 vs ~1.6-2.1 M events/s).

These are untuned runs. In the 1-producer table the SLB/DSW atomic and
a,a,a rows, DSW parallel and SLB ordered were run twice and agreed
within ~5%; the other rows are single runs. Treat them as indicative.
It would help if v2 included your own perf_queue/pipeline numbers with
the exact command lines, ideally including a shared-queue case and
workers on more than one socket.

Thanks,
Tirthendu

Reply via email to