diff options
author | Konstantin Ananyev <konstantin.ananyev@intel.com> | 2017-07-27 12:00:57 +0100 |
---|---|---|
committer | Konstantin Ananyev <konstantin.ananyev@intel.com> | 2017-07-27 20:24:53 +0100 |
commit | 7e18fa1bf263822c46d7431a911b41d6377d5f69 (patch) | |
tree | ddf5ce05545419d6d77bb9d8b3c48fc90d221a7a /lib/libtle_misc | |
parent | e151ee29d02d7802fab9e32b50ced54fd8d64160 (diff) |
- 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 <konstantin.ananyev@intel.com>
Signed-off-by: Mohammad Abdul Awal <mohammad.abdul.awal@intel.com>
Diffstat (limited to 'lib/libtle_misc')
-rw-r--r-- | lib/libtle_misc/tle_dpdk_wrapper.h | 113 |
1 files changed, 112 insertions, 1 deletions
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 @@ -57,6 +57,18 @@ _rte_ring_enqueue_burst(struct rte_ring *r, void * const *obj_table, uint32_t n) } 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) { return rte_ring_dequeue_burst(r, (void **)obj_table, n, NULL); @@ -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 @@ -109,6 +132,13 @@ _rte_ring_enqueue_burst(struct rte_ring *r, void * const *obj_table, uint32_t 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) { return rte_ring_dequeue_burst(r, (void **)obj_table, 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_ */ |