aboutsummaryrefslogtreecommitdiffstats
path: root/src/svm/fifo_segment.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/svm/fifo_segment.h')
-rw-r--r--src/svm/fifo_segment.h39
1 files changed, 26 insertions, 13 deletions
diff --git a/src/svm/fifo_segment.h b/src/svm/fifo_segment.h
index 7922274cecf..ff36f45c4f2 100644
--- a/src/svm/fifo_segment.h
+++ b/src/svm/fifo_segment.h
@@ -26,8 +26,9 @@ typedef enum
FIFO_SEGMENT_N_FTYPES
} fifo_segment_ftype_t;
-#define FIFO_SEGMENT_MIN_FIFO_SIZE 4096 /* 4kB min fifo size */
-#define FIFO_SEGMENT_MAX_FIFO_SIZE (2 << 30) /* 2GB max fifo size */
+#define FIFO_SEGMENT_MIN_LOG2_FIFO_SIZE 12 /**< 4kB min fifo size */
+#define FIFO_SEGMENT_MIN_FIFO_SIZE 4096 /**< 4kB min fifo size */
+#define FIFO_SEGMENT_MAX_FIFO_SIZE (2 << 30) /**< 2GB max fifo size */
#define FIFO_SEGMENT_ALLOC_BATCH_SIZE 32 /* Allocation quantum */
typedef enum fifo_segment_flags_
@@ -36,21 +37,30 @@ typedef enum fifo_segment_flags_
FIFO_SEGMENT_F_WILL_DELETE = 1 << 1,
} fifo_segment_flags_t;
-typedef struct
+typedef struct fifo_segment_slice_
{
svm_fifo_t *fifos; /**< Linked list of active RX fifos */
svm_fifo_t *free_fifos; /**< Freelists by fifo size */
svm_fifo_chunk_t **free_chunks; /**< Freelists by chunk size */
+ u32 n_fl_chunk_bytes; /**< Chunk bytes on freelist */
+} fifo_segment_slice_t;
+
+typedef struct
+{
+ fifo_segment_slice_t *slices; /** Fixed array of slices */
+ ssvm_shared_header_t *ssvm_sh; /**< Pointer to fs ssvm shared hdr */
+ uword n_free_bytes; /**< Segment free bytes */
u32 n_active_fifos; /**< Number of active fifos */
+ u32 max_log2_chunk_size; /**< Max log2(chunk size) for fs */
u8 flags; /**< Segment flags */
- u32 n_free_bytes; /**< Bytes usable for new allocs */
- u32 n_fl_chunk_bytes; /**< Chunk bytes on freelist */
+ u8 n_slices; /**< Number of slices */
} fifo_segment_header_t;
typedef struct
{
ssvm_private_t ssvm; /**< ssvm segment data */
fifo_segment_header_t *h; /**< fifo segment data */
+ u8 n_slices; /**< number of fifo segment slices */
} fifo_segment_t;
typedef struct
@@ -90,9 +100,10 @@ void fifo_segment_info (fifo_segment_t * seg, char **address, size_t * size);
* @param ftype fifo type @ref fifo_segment_ftype_t
* @return new fifo or 0 if alloc failed
*/
-svm_fifo_t *fifo_segment_alloc_fifo (fifo_segment_t * fs,
- u32 data_bytes,
- fifo_segment_ftype_t ftype);
+svm_fifo_t *fifo_segment_alloc_fifo_w_slice (fifo_segment_t * fs,
+ u32 slice_index,
+ u32 data_bytes,
+ fifo_segment_ftype_t ftype);
/**
* Free fifo allocated in fifo segment
@@ -111,7 +122,8 @@ void fifo_segment_free_fifo (fifo_segment_t * fs, svm_fifo_t * f);
* @param batch_size number of chunks to be allocated
* @return 0 on success, negative number otherwise
*/
-int fifo_segment_prealloc_fifo_hdrs (fifo_segment_t * fs, u32 batch_size);
+int fifo_segment_prealloc_fifo_hdrs (fifo_segment_t * fs, u32 slice_index,
+ u32 batch_size);
/**
* Try to preallocate fifo chunks on segment
@@ -124,8 +136,8 @@ int fifo_segment_prealloc_fifo_hdrs (fifo_segment_t * fs, u32 batch_size);
* @param batch_size number of chunks to be allocated
* @return 0 on success, negative number otherwise
*/
-int fifo_segment_prealloc_fifo_chunks (fifo_segment_t * fs, u32 chunk_size,
- u32 batch_size);
+int fifo_segment_prealloc_fifo_chunks (fifo_segment_t * fs, u32 slice_index,
+ u32 chunk_size, u32 batch_size);
/**
* Pre-allocates fifo pairs in fifo segment
*
@@ -192,9 +204,10 @@ void fifo_segment_update_free_bytes (fifo_segment_t * fs);
* @param fs fifo segment
* @return free bytes on chunk free lists
*/
-u32 fifo_segment_fl_chunk_bytes (fifo_segment_t * fs);
+uword fifo_segment_fl_chunk_bytes (fifo_segment_t * fs);
u8 fifo_segment_has_fifos (fifo_segment_t * fs);
-svm_fifo_t *fifo_segment_get_fifo_list (fifo_segment_t * fs);
+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);
/**