X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fsvm%2Ffifo_segment.h;h=ec184207269569d1ed825916f91616a0e88debd4;hb=6450a179f4b760561f533396818f4b765bf1a7b8;hp=268b48b39f645a04e3d730b77016a8ab7ea1c632;hpb=0bc78d80363efc22d07171473933d1b0016440e4;p=vpp.git diff --git a/src/svm/fifo_segment.h b/src/svm/fifo_segment.h index 268b48b39f6..ec184207269 100644 --- a/src/svm/fifo_segment.h +++ b/src/svm/fifo_segment.h @@ -20,6 +20,8 @@ #include #include +#define FIFO_SEGMENT_ALLOC_OVERHEAD (2 * clib_mem_get_page_size ()) + typedef enum { FIFO_SEGMENT_FTYPE_NONE = -1, @@ -38,6 +40,7 @@ typedef enum fifo_segment_flags_ FIFO_SEGMENT_F_IS_PREALLOCATED = 1 << 0, FIFO_SEGMENT_F_WILL_DELETE = 1 << 1, FIFO_SEGMENT_F_MEM_LIMIT = 1 << 2, + FIFO_SEGMENT_F_CUSTOM_USE = 1 << 3, } fifo_segment_flags_t; #define foreach_segment_mem_status \ @@ -68,10 +71,15 @@ typedef struct { ssvm_private_t ssvm; /**< ssvm segment data */ fifo_segment_header_t *h; /**< fifo segment data */ - uword max_byte_index; - u8 n_slices; /**< number of fifo segment slices */ fifo_slice_private_t *slices; /**< private slice information */ svm_msg_q_t *mqs; /**< private vec of attached mqs */ + uword max_byte_index; /**< max byte index for segment */ + u32 sm_index; /**< owner segment manager index */ + u32 fs_index; /**< fs index in sm pool */ + u8 n_slices; /**< number of fifo segment slices */ + u8 flags; /**< private fifo segment flags */ + u8 high_watermark; /**< memory pressure watermark high */ + u8 low_watermark; /**< memory pressure watermark low */ } fifo_segment_t; typedef struct @@ -90,7 +98,7 @@ typedef struct u32 *new_segment_indices; /**< return vec of new seg indices */ } fifo_segment_create_args_t; -#define fifo_segment_flags(_fs) _fs->h->flags +#define fifo_segment_flags(_fs) _fs->flags int fifo_segment_init (fifo_segment_t * fs); int fifo_segment_create (fifo_segment_main_t * sm, @@ -101,6 +109,8 @@ void fifo_segment_delete (fifo_segment_main_t * sm, fifo_segment_t * fs); void fifo_segment_cleanup (fifo_segment_t *fs); fifo_segment_t *fifo_segment_get_segment (fifo_segment_main_t * sm, u32 fs_index); +fifo_segment_t *fifo_segment_get_segment_if_valid (fifo_segment_main_t *sm, + u32 segment_index); u32 fifo_segment_index (fifo_segment_main_t * sm, fifo_segment_t * fs); void fifo_segment_info (fifo_segment_t * seg, char **address, size_t * size); @@ -130,6 +140,7 @@ svm_fifo_t *fifo_segment_alloc_fifo_w_slice (fifo_segment_t * fs, fifo_segment_ftype_t ftype); svm_fifo_t *fifo_segment_alloc_fifo_w_offset (fifo_segment_t *fs, uword offset); +svm_fifo_t *fifo_segment_duplicate_fifo (fifo_segment_t *fs, svm_fifo_t *f); /** * Free fifo allocated in fifo segment @@ -139,6 +150,14 @@ svm_fifo_t *fifo_segment_alloc_fifo_w_offset (fifo_segment_t *fs, */ void fifo_segment_free_fifo (fifo_segment_t * fs, svm_fifo_t * f); +/** + * Free fifo allocated by external applications + * + * @params fs fifo segment for fifo + * @param f fifo to be freed + */ +void fifo_segment_free_client_fifo (fifo_segment_t *fs, svm_fifo_t *f); + void fifo_segment_detach_fifo (fifo_segment_t *fs, svm_fifo_t **f); void fifo_segment_attach_fifo (fifo_segment_t *fs, svm_fifo_t **f, u32 slice_index); @@ -166,6 +185,15 @@ svm_msg_q_t *fifo_segment_msg_q_alloc (fifo_segment_t *fs, u32 mq_index, svm_msg_q_t *fifo_segment_msg_q_attach (fifo_segment_t *fs, uword offset, u32 mq_index); +/** + * Discover mqs on mq only segment + * + * @param fs fifo segment for mq + * @param fds array of fds is mqs use eventfds + * @param n_fds number of fds + */ +void fifo_segment_msg_qs_discover (fifo_segment_t *fs, int *fds, u32 n_fds); + /** * Message queue offset on segment * @@ -241,21 +269,6 @@ svm_fifo_chunk_t *fsh_alloc_chunk (fifo_segment_header_t * fsh, void fsh_collect_chunks (fifo_segment_header_t * fsh, u32 slice_index, svm_fifo_chunk_t * c); -/** - * Fifo segment has reached mem limit - * - * @param fsh fifo segment header - * @return 1 (if reached) or 0 (otherwise) - */ -u8 fsh_has_reached_mem_limit (fifo_segment_header_t * fsh); - -/** - * Fifo segment reset mem limit flag - * - * @param fs fifo segment - */ -void fsh_reset_mem_limit (fifo_segment_header_t * fsh); - /** * Fifo segment reset mem limit flag * @@ -310,6 +323,14 @@ svm_fifo_t *fifo_segment_get_slice_fifo_list (fifo_segment_t * fs, u32 slice_index); u32 fifo_segment_num_fifos (fifo_segment_t * fs); u32 fifo_segment_num_free_fifos (fifo_segment_t * fs); + +svm_fifo_chunk_t *fifo_segment_alloc_chunk_w_slice (fifo_segment_t *fs, + u32 slice_index, + u32 chunk_size); +void fifo_segment_collect_chunk (fifo_segment_t *fs, u32 slice_index, + svm_fifo_chunk_t *c); +uword fifo_segment_chunk_offset (fifo_segment_t *fs, svm_fifo_chunk_t *c); + /** * Find number of free chunks of given size * @@ -320,8 +341,6 @@ u32 fifo_segment_num_free_fifos (fifo_segment_t * fs); u32 fifo_segment_num_free_chunks (fifo_segment_t * fs, u32 size); u8 fifo_segment_get_mem_usage (fifo_segment_t * fs); -fifo_segment_mem_status_t fifo_segment_determine_status - (fifo_segment_header_t * fsh, u8 usage); fifo_segment_mem_status_t fifo_segment_get_mem_status (fifo_segment_t * fs); void fifo_segment_main_init (fifo_segment_main_t * sm, u64 baseva,