diff options
Diffstat (limited to 'vlib')
-rw-r--r-- | vlib/vlib/buffer.c | 6 | ||||
-rw-r--r-- | vlib/vlib/buffer.h | 18 | ||||
-rw-r--r-- | vlib/vlib/dpdk_buffer.c | 6 |
3 files changed, 16 insertions, 14 deletions
diff --git a/vlib/vlib/buffer.c b/vlib/vlib/buffer.c index b7ae0a6fa34..f727e67a55a 100644 --- a/vlib/vlib/buffer.c +++ b/vlib/vlib/buffer.c @@ -901,8 +901,8 @@ vlib_buffer_free_inline (vlib_main_t * vm, b0 = vlib_get_buffer (vm, bi0); b1 = vlib_get_buffer (vm, bi1); - free0 = b0->clone_count == 0; - free1 = b1->clone_count == 0; + free0 = (b0->flags & VLIB_BUFFER_RECYCLE) == 0; + free1 = (b1->flags & VLIB_BUFFER_RECYCLE) == 0; /* Must be before init which will over-write buffer flags. */ if (follow_buffer_next) @@ -986,7 +986,7 @@ vlib_buffer_free_inline (vlib_main_t * vm, b0 = vlib_get_buffer (vm, bi0); - free0 = b0->clone_count == 0; + free0 = (b0->flags & VLIB_BUFFER_RECYCLE) == 0; /* Must be before init which will over-write buffer flags. */ if (follow_buffer_next) diff --git a/vlib/vlib/buffer.h b/vlib/vlib/buffer.h index 52749572509..bc799bc6223 100644 --- a/vlib/vlib/buffer.h +++ b/vlib/vlib/buffer.h @@ -86,6 +86,7 @@ typedef struct { <br> VLIB_BUFFER_NEXT_PRESENT: this is a multi-chunk buffer. <br> VLIB_BUFFER_TOTAL_LENGTH_VALID: as it says <br> VLIB_BUFFER_REPL_FAIL: packet replication failure + <br> VLIB_BUFFER_RECYCLE: as it says <br> VLIB_BUFFER_FLAG_USER(n): user-defined bit N */ #define VLIB_BUFFER_IS_TRACED (1 << 0) @@ -94,6 +95,7 @@ typedef struct { #define VLIB_BUFFER_IS_RECYCLED (1 << 2) #define VLIB_BUFFER_TOTAL_LENGTH_VALID (1 << 3) #define VLIB_BUFFER_REPL_FAIL (1 << 4) +#define VLIB_BUFFER_RECYCLE (1 << 5) /* User defined buffer flags. */ #define LOG2_VLIB_BUFFER_FLAG_USER(n) (32 - (n)) @@ -112,14 +114,6 @@ typedef struct { Only valid if VLIB_BUFFER_NEXT_PRESENT flag is set. */ - u32 clone_count; /**< Specifies whether this buffer should be - reinitialized when freed. It will be reinitialized - if the value is 0. This field can be used - as a counter or for other state during packet - replication. The buffer free function does not - modify this value. - */ - vlib_error_t error; /**< Error code for buffers to be enqueued to error handler. */ @@ -127,6 +121,11 @@ typedef struct { visit enabled feature nodes */ + u32 dont_waste_me; /**< Available space in the (precious) + first 32 octets of buffer metadata + Before allocating any of it, discussion required! + */ + u32 opaque[8]; /**< Opaque data used by sub-graphs for their own purposes. See .../vnet/vnet/buffer.h */ @@ -135,7 +134,8 @@ typedef struct { u32 trace_index; /**< Specifies index into trace buffer if VLIB_PACKET_IS_TRACED flag is set. */ - u32 opaque2[15]; /**< More opaque data, currently unused */ + u32 recycle_count; /**< Used by L2 path recycle code */ + u32 opaque2[14]; /**< More opaque data, currently unused */ /***** end of second cache line */ CLIB_CACHE_LINE_ALIGN_MARK(cacheline2); diff --git a/vlib/vlib/dpdk_buffer.c b/vlib/vlib/dpdk_buffer.c index ce0f32649aa..c0094938479 100644 --- a/vlib/vlib/dpdk_buffer.c +++ b/vlib/vlib/dpdk_buffer.c @@ -708,7 +708,9 @@ vlib_buffer_free_inline (vlib_main_t * vm, { int j; - add_buffer_to_free_list (vm, fl, buffers[i], b->clone_count == 0); + add_buffer_to_free_list + (vm, fl, buffers[i], + (b->flags & VLIB_BUFFER_RECYCLE) == 0); for (j = 0; j < vec_len (bm->announce_list); j++) { @@ -721,7 +723,7 @@ vlib_buffer_free_inline (vlib_main_t * vm, } else { - if (PREDICT_TRUE (b->clone_count == 0)) + if (PREDICT_TRUE ((b->flags & VLIB_BUFFER_RECYCLE) == 0)) { mb = rte_mbuf_from_vlib_buffer(b); ASSERT(rte_mbuf_refcnt_read(mb) == 1); |