SVM_FIFO_F_SHRINK = 1 << 2,
SVM_FIFO_F_COLLECT_CHUNKS = 1 << 3,
SVM_FIFO_F_LL_TRACKED = 1 << 4,
+ SVM_FIFO_F_SINGLE_THREAD_OWNED = 1 << 5,
} svm_fifo_flag_t;
typedef struct _svm_fifo
CLIB_CACHE_LINE_ALIGN_MARK (shared_first);
u32 size; /**< size of the fifo in bytes */
u32 nitems; /**< usable size (size-1) */
- u8 flags; /**< fifo flags */
svm_fifo_chunk_t *start_chunk;/**< first chunk in fifo chunk list */
svm_fifo_chunk_t *end_chunk; /**< end chunk in fifo chunk list */
svm_fifo_chunk_t *new_chunks; /**< chunks yet to be added to list */
- rb_tree_t chunk_lookup;
+ rb_tree_t chunk_lookup; /**< rbtree for chunk lookup */
+ u8 flags; /**< fifo flags */
+ u8 slice_index; /**< segment slice for fifo */
CLIB_CACHE_LINE_ALIGN_MARK (shared_second);
volatile u32 has_event; /**< non-zero if deq event exists */
/**
* Initialize fifo
*
+ * @param f fifo
* @param size size for fifo
*/
void svm_fifo_init (svm_fifo_t * f, u32 size);
+/**
+ * Initialize fifo chunks and rbtree
+ *
+ * @param f fifo
+ */
+void svm_fifo_init_chunks (svm_fifo_t * f);
/**
* Allocate a fifo chunk on heap
*
* @return number of out of order segments
*/
u32 svm_fifo_n_ooo_segments (svm_fifo_t * f);
-/*
+/**
* First out-of-order segment for fifo
*
* @param f fifo
* @return first out-of-order segment for fifo
*/
ooo_segment_t *svm_fifo_first_ooo_segment (svm_fifo_t * f);
+/**
+ * Check if fifo is sane. Debug only.
+ *
+ * @param f fifo
+ * @return 1 if sane, 0 otherwise
+ */
+u8 svm_fifo_is_sane (svm_fifo_t * f);
+/**
+ * Declare this fifo is used by only a single thread.
+ * In this special case, fifo-growth can be done in an efficient way without delay.
+ *
+ * @param f fifo
+ * @return 1 if the fifo is already owned by another thread, 0 otherwise
+ */
+u8 svm_fifo_set_single_thread_owned (svm_fifo_t * f);
format_function_t format_svm_fifo;
/**
{
u32 head, tail;
f_load_head_tail_prod (f, &head, &tail);
- return tail > head ? f->size - tail : f_free_count (f, head, tail);
+ return tail >= head ? f->size - tail : f_free_count (f, head, tail);
}
static inline u8 *