aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/odp/node.c
diff options
context:
space:
mode:
authorMichal Mazur <mkm@semihalf.com>2017-12-19 12:11:47 +0100
committerMichal Mazur <mkm@semihalf.com>2017-12-27 14:27:26 +0100
commit7abe5825508fd48d6b010a3eaff346d715e17e24 (patch)
tree6f085896c6406a4a5b525b46134c236a987fe8f2 /src/plugins/odp/node.c
parent945f7e8ebe39ffa80dfb38b950406a7dd4935f1f (diff)
Fix and improve Rx Scheduler mode
Fix support of atomic mode and add two new modes: parallel and ordered. Three modes of synchronization between threads are supported now: - parallel - no synchronization between events - ordered - relative sequence of events is restored in output queues - atomic - only a single thread may process events from a single queue Change-Id: I9399aa601f0927042ac0f7f1e5f265f4d47724b8 Signed-off-by: Michal Mazur <mkm@semihalf.com>
Diffstat (limited to 'src/plugins/odp/node.c')
-rwxr-xr-xsrc/plugins/odp/node.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/plugins/odp/node.c b/src/plugins/odp/node.c
index 8eb1b0cb..fea8bf6a 100755
--- a/src/plugins/odp/node.c
+++ b/src/plugins/odp/node.c
@@ -75,6 +75,8 @@ odp_packet_queue_mode (odp_packet_if_t * oif, odp_packet_t pkt_tbl[],
odp_event_t evt_tbl[req_pkts];
u64 sched_wait;
odp_queue_t rxq = ODP_QUEUE_INVALID;
+ odp_thrmask_t mask;
+
if (pktio == ODP_PKTIO_INVALID)
{
@@ -90,6 +92,12 @@ odp_packet_queue_mode (odp_packet_if_t * oif, odp_packet_t pkt_tbl[],
return 0;
}
}
+ else
+ {
+ odp_thrmask_zero (&mask);
+ odp_thrmask_set (&mask, odp_thread_id ());
+ odp_schedule_group_join (oif->sched_group, &mask);
+ }
while (req_pkts)
{
@@ -110,6 +118,11 @@ odp_packet_queue_mode (odp_packet_if_t * oif, odp_packet_t pkt_tbl[],
req_pkts -= i;
}
+ if (oif->m.rx_mode != APPL_MODE_PKT_QUEUE)
+ {
+ odp_schedule_group_leave (oif->sched_group, &mask);
+ }
+
/* convert events to packets, discarding any non-packet events */
for (i = 0; i < num_evts; i++)
{
@@ -215,8 +228,7 @@ odp_packet_device_input_fn (vlib_main_t * vm, vlib_node_runtime_t * node,
do
{
- if ((oif->m.rx_mode == (APPL_MODE_PKT_QUEUE)) ||
- (oif->m.rx_mode == (APPL_MODE_PKT_SCHED)))
+ if (oif->m.rx_mode != APPL_MODE_PKT_BURST)
{
n_left =
odp_packet_queue_mode (oif, pkt_tbl, queue_id, n_left_to_next);