diff options
author | 2017-12-19 12:11:47 +0100 | |
---|---|---|
committer | 2017-12-27 14:27:26 +0100 | |
commit | 7abe5825508fd48d6b010a3eaff346d715e17e24 (patch) | |
tree | 6f085896c6406a4a5b525b46134c236a987fe8f2 /src/plugins/odp/node.c | |
parent | 945f7e8ebe39ffa80dfb38b950406a7dd4935f1f (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-x | src/plugins/odp/node.c | 16 |
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); |