diff options
author | Michal Mazur <mkm@semihalf.com> | 2017-11-26 19:28:55 +0100 |
---|---|---|
committer | Michal Mazur <mkm@semihalf.com> | 2017-12-18 18:21:00 +0100 |
commit | 945f7e8ebe39ffa80dfb38b950406a7dd4935f1f (patch) | |
tree | 815c85288b34ccb3058d8b2b46a65bff846f256d /src/plugins/odp/odp_packet.h | |
parent | 4c34d6c16947c5e1465319d9d44dbdaaa2f04c4e (diff) |
More optimizations for Tx and Rx loops
1) Parse multiple output packets in loop.
2) Remove checking for error flags, they are never set because
ODP parser is disabled.
3) Do not call vlib_buffer_advance if not necessary.
4) Remove lock in TX path. Queues are synchronized by ODP.
5) Optimize detection of packet type.
6) Create a wrapper for call to odp_packet_user_area.
Change-Id: Ib50c9be9a62d67824b58ef2cd443b7fc59471655
Signed-off-by: Michal Mazur <mkm@semihalf.com>
Diffstat (limited to 'src/plugins/odp/odp_packet.h')
-rwxr-xr-x | src/plugins/odp/odp_packet.h | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/src/plugins/odp/odp_packet.h b/src/plugins/odp/odp_packet.h index a80ab326..f3b478bc 100755 --- a/src/plugins/odp/odp_packet.h +++ b/src/plugins/odp/odp_packet.h @@ -39,7 +39,6 @@ typedef struct { CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); u8 *host_if_name; - volatile u32 *lockp; uword if_index; odp_pktio_t pktio; u32 hw_if_index; @@ -89,13 +88,41 @@ always_inline odp_packet_t odp_packet_from_vlib_buffer (vlib_buffer_t * b) { odp_packet_t packet; - packet = (odp_packet_t)(b->l2_priv_data); + packet = (odp_packet_t) (b->l2_priv_data); if (packet == NULL) - clib_error("ODP packet pointer was not set properly!\n"); + clib_error ("ODP packet pointer was not set properly!\n"); return packet; } +always_inline vlib_buffer_t * +vlib_buffer_from_odp_packet (odp_packet_t p) +{ + return (vlib_buffer_t *) odp_packet_user_area (p); +} + +always_inline void +odp_adjust_data_pointers (vlib_buffer_t * b0, odp_packet_t pkt) +{ + int diff; + + diff = ((uintptr_t) (b0->data + b0->current_data) - + (uintptr_t) odp_packet_data (pkt)); + if (diff > 0) + odp_packet_pull_head (pkt, diff); + else if (diff < 0) + odp_packet_push_head (pkt, -diff); + + diff = b0->current_length - odp_packet_len (pkt); + if (diff) + { + if (diff > 0) + odp_packet_push_tail (pkt, diff); + else + odp_packet_pull_tail (pkt, -diff); + } +} + /* * fd.io coding-style-patch-verification: ON * |