This adds a fast case when trying to map a buffer within the first segment, which is always the case for non jumbo frames in the current linux-generic implementation.
This shows a sligh performance gain (mesure with pktio_perf). Before: Maximum packet rate: 1108398 PPS (388 Mbps) Maximum packet rate: 1116210 PPS (391 Mbps) Maximum packet rate: 1207031 PPS (423 Mbps) Maximum packet rate: 1121093 PPS (393 Mbps) Maximum packet rate: 1194335 PPS (419 Mbps) After: Maximum packet rate: 1331054 PPS (467 Mbps) Maximum packet rate: 1172851 PPS (411 Mbps) Maximum packet rate: 1156250 PPS (405 Mbps) Maximum packet rate: 1228515 PPS (431 Mbps) Maximum packet rate: 1314453 PPS (461 Mbps) Signed-off-by: Nicolas Morey-Chaisemartin <[email protected]> --- platform/linux-generic/include/odp_buffer_inlines.h | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/platform/linux-generic/include/odp_buffer_inlines.h b/platform/linux-generic/include/odp_buffer_inlines.h index 74af38b..7e3633d 100644 --- a/platform/linux-generic/include/odp_buffer_inlines.h +++ b/platform/linux-generic/include/odp_buffer_inlines.h @@ -122,9 +122,16 @@ static inline void *buffer_map(odp_buffer_hdr_t *buf, uint32_t *seglen, uint32_t limit) { - int seg_index = offset / buf->segsize; - int seg_offset = offset % buf->segsize; + int seg_index; + int seg_offset; + if (odp_likely(offset < buf->segsize)) { + seg_index = 0; + seg_offset = offset; + } else { + seg_index = offset / buf->segsize; + seg_offset = offset % buf->segsize; + } if (seglen != NULL) { uint32_t buf_left = limit - offset; *seglen = seg_offset + buf_left <= buf->segsize ? -- 2.4.5.3.g4915f6f _______________________________________________ lng-odp mailing list [email protected] https://lists.linaro.org/mailman/listinfo/lng-odp
