From 7e18fa1bf263822c46d7431a911b41d6377d5f69 Mon Sep 17 00:00:00 2001 From: Konstantin Ananyev Date: Thu, 27 Jul 2017 12:00:57 +0100 Subject: - Introduce tle_tcp_stream_readv() and tle_tcp_stream_writev(). - Introduce flags for tle_ctx_param. - Introduce TLE_CTX_FLAG_ST - indicates that given ctx will be used by single thread only. - Introduce new parameters for tcp context: timewait - allows user to configure max timeout in TCP_TIMEWAIT state. icw - allows user to specify desired initial congestion window for new connections. -Few optimisations: cache tx.ol_flags inside tle destination. calcualte and cache inside ctx cycles_to_ms shift value. reorder restoring SYN opts and filling TCB a bit. Change-Id: Ie05087783b3b7f1e4ce99d3555bc5bd098f83fe0 Signed-off-by: Konstantin Ananyev Signed-off-by: Mohammad Abdul Awal --- lib/libtle_misc/tle_dpdk_wrapper.h | 113 ++++++++++++++++++++++++++++++++++++- 1 file changed, 112 insertions(+), 1 deletion(-) (limited to 'lib/libtle_misc/tle_dpdk_wrapper.h') diff --git a/lib/libtle_misc/tle_dpdk_wrapper.h b/lib/libtle_misc/tle_dpdk_wrapper.h index 6757663..3736964 100644 --- a/lib/libtle_misc/tle_dpdk_wrapper.h +++ b/lib/libtle_misc/tle_dpdk_wrapper.h @@ -56,6 +56,18 @@ _rte_ring_enqueue_burst(struct rte_ring *r, void * const *obj_table, uint32_t n) return rte_ring_enqueue_burst(r, (void * const *)obj_table, n, NULL); } +static inline uint32_t +_rte_ring_enqueue_bulk(struct rte_ring *r, void * const *obj_table, uint32_t n) +{ + uint32_t rc; + + rc = rte_ring_enqueue_bulk(r, (void * const *)obj_table, n, NULL); + if (rc == n) + return 0; + else + return -ENOSPC; +} + static inline uint32_t _rte_ring_dequeue_burst(struct rte_ring *r, void **obj_table, uint32_t n) { @@ -80,6 +92,17 @@ _rte_ring_get_data(struct rte_ring *r) return (void **)(&r[1]); } +static inline void +_rte_ring_dequeue_ptrs(struct rte_ring *r, void **obj_table, uint32_t num) +{ + uint32_t tail; + void **data; + + tail = r->cons.tail; + data = _rte_ring_get_data(r); + DEQUEUE_PTRS(r, data, tail, obj_table, num, void *); +} + #else static inline uint32_t @@ -108,6 +131,13 @@ _rte_ring_enqueue_burst(struct rte_ring *r, void * const *obj_table, uint32_t n) return rte_ring_enqueue_burst(r, (void * const *)obj_table, n); } +static inline uint32_t +_rte_ring_enqueue_bulk(struct rte_ring *r, void * const *obj_table, + uint32_t n) +{ + return rte_ring_enqueue_bulk(r, (void * const *)obj_table, n); +} + static inline uint32_t _rte_ring_dequeue_burst(struct rte_ring *r, void **obj_table, uint32_t n) { @@ -132,10 +162,91 @@ _rte_ring_get_data(struct rte_ring *r) return (void **)r->ring; } -#endif +static inline void +_rte_ring_dequeue_ptrs(struct rte_ring *r, void **obj_table, uint32_t num) +{ + uint32_t i, n; + uint32_t mask, cons_head; + + n = num; + cons_head = r->cons.tail; + mask = _rte_ring_get_mask(r); + + DEQUEUE_PTRS(); +} + +#endif /* RTE_VERSION >= RTE_VERSION_NUM(17, 5, 0, 0) */ + +/* + * Serialized variation of DPDK rte_ring dequeue mechanism. + * At any given moment, only one consumer is allowed to dequeue + * objects from the ring. + */ + +static inline __attribute__((always_inline)) uint32_t +_rte_ring_mcs_dequeue_start(struct rte_ring *r, uint32_t num) +{ + uint32_t n, end, head, tail; + int32_t rc; + + rc = 0; + do { + head = r->cons.head; + tail = r->cons.tail; + end = r->prod.tail; + + if (head != tail) { + rte_pause(); + continue; + } + + n = end - head; + n = RTE_MIN(num, n); + if (n == 0) + return 0; + + rc = rte_atomic32_cmpset(&r->cons.head, head, head + n); + } while (rc == 0); + + return n; +} + +static inline __attribute__((always_inline)) void +_rte_ring_mcs_dequeue_finish(struct rte_ring *r, uint32_t num) +{ + uint32_t n, head, tail; + + head = r->cons.head; + rte_smp_rmb(); + tail = r->cons.tail; + n = head - tail; + RTE_ASSERT(n >= num); + RTE_SET_USED(n); + head = tail + num; + r->cons.head = head; + r->cons.tail = head; +} + +static inline __attribute__((always_inline)) void +_rte_ring_mcs_dequeue_abort(struct rte_ring *r) +{ + r->cons.head = r->cons.tail; +} + +static inline uint32_t +_rte_ring_mcs_dequeue_burst(struct rte_ring *r, void **obj_table, uint32_t num) +{ + uint32_t n; + + n = _rte_ring_mcs_dequeue_start(r, num); + _rte_ring_dequeue_ptrs(r, obj_table, n); + _rte_ring_mcs_dequeue_finish(r, n); + return n; +} #ifdef __cplusplus } #endif + #endif /* TLE_DPDK_WRAPPER_H_ */ -- cgit 1.2.3-korg