Skip to content

Commit

Permalink
examples/packet_ordering: fix Rx with reorder mode disabled
Browse files Browse the repository at this point in the history
[ upstream commit 7ba49dc729937ea97642a615e9b08f33919b94f4 ]

The packet_ordering example works in two modes (opt via --disable-reorder):
  - When reorder is enabled: rx_thread - N*worker_thread - send_thread
  - When reorder is disabled: rx_thread - N*worker_thread - tx_thread
N parallel worker_thread(s) generate out-of-order packets.

When reorder is enabled, send_thread uses sequence number generated in
rx_thread (L459) to enforce packet ordering. Otherwise rx_thread just
sends any packet it receives.

rx_thread writes sequence number into a dynamic field, which is only
registered by calling rte_reorder_create() (Line 741) when reorder is
enabled. However, rx_thread marks sequence number onto each packet no
matter whether reorder is enabled, overwriting the leading bytes in packet
mbufs when reorder is disabled, resulting in segfaults when PMD tries to
DMA packets.

`if (!disable_reorder_flag) {...}` is added in rx_thread to fix the bug.
The test is inlined by the compiler to prevent any performance loss.

Signed-off-by: Qian Hao <qi_an_hao@126.com>
Acked-by: Volodymyr Fialko <vfialko@marvell.com>
  • Loading branch information
QH2333 authored and bluca committed Mar 13, 2024
1 parent bf8ce81 commit 8b64218
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 7 deletions.
1 change: 1 addition & 0 deletions .mailmap
Original file line number Diff line number Diff line change
Expand Up @@ -1088,6 +1088,7 @@ Przemyslaw Czesnowicz <przemyslaw.czesnowicz@intel.com>
Przemyslaw Patynowski <przemyslawx.patynowski@intel.com>
Przemyslaw Zegan <przemyslawx.zegan@intel.com>
Pu Xu <583493798@qq.com>
Qian Hao <qi_an_hao@126.com>
Qian Xu <qian.q.xu@intel.com>
Qiao Liu <qiao.liu@intel.com>
Qi Fu <qi.fu@intel.com>
Expand Down
32 changes: 25 additions & 7 deletions examples/packet_ordering/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <stdlib.h>
#include <signal.h>
#include <getopt.h>
#include <stdbool.h>

#include <rte_eal.h>
#include <rte_common.h>
Expand Down Expand Up @@ -427,8 +428,8 @@ int_handler(int sig_num)
* The mbufs are then passed to the worker threads via the rx_to_workers
* ring.
*/
static int
rx_thread(struct rte_ring *ring_out)
static __rte_always_inline int
rx_thread(struct rte_ring *ring_out, bool disable_reorder_flag)
{
uint32_t seqn = 0;
uint16_t i, ret = 0;
Expand All @@ -454,9 +455,11 @@ rx_thread(struct rte_ring *ring_out)
}
app_stats.rx.rx_pkts += nb_rx_pkts;

/* mark sequence number */
for (i = 0; i < nb_rx_pkts; )
*rte_reorder_seqn(pkts[i++]) = seqn++;
/* mark sequence number if reorder is enabled */
if (!disable_reorder_flag) {
for (i = 0; i < nb_rx_pkts;)
*rte_reorder_seqn(pkts[i++]) = seqn++;
}

/* enqueue to rx_to_workers ring */
ret = rte_ring_enqueue_burst(ring_out,
Expand All @@ -473,6 +476,18 @@ rx_thread(struct rte_ring *ring_out)
return 0;
}

static __rte_noinline int
rx_thread_reorder(struct rte_ring *ring_out)
{
return rx_thread(ring_out, false);
}

static __rte_noinline int
rx_thread_reorder_disabled(struct rte_ring *ring_out)
{
return rx_thread(ring_out, true);
}

/**
* This thread takes bursts of packets from the rx_to_workers ring and
* Changes the input port value to output port value. And feds it to
Expand Down Expand Up @@ -772,8 +787,11 @@ main(int argc, char **argv)
(void *)&send_args, last_lcore_id);
}

/* Start rx_thread() on the main core */
rx_thread(rx_to_workers);
/* Start rx_thread_xxx() on the main core */
if (disable_reorder)
rx_thread_reorder_disabled(rx_to_workers);
else
rx_thread_reorder(rx_to_workers);

RTE_LCORE_FOREACH_WORKER(lcore_id) {
if (rte_eal_wait_lcore(lcore_id) < 0)
Expand Down

0 comments on commit 8b64218

Please sign in to comment.