2 * Copyright (c) 2020 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
16 #ifndef SRC_SVM_FIFO_TYPES_H_
17 #define SRC_SVM_FIFO_TYPES_H_
20 #include <vppinfra/clib.h>
21 #include <vppinfra/rbtree.h>
22 #include <vppinfra/lock.h>
24 #define FS_MIN_LOG2_CHUNK_SZ 12 /**< also min fifo size */
25 #define FS_MAX_LOG2_CHUNK_SZ 22 /**< 4MB max chunk size */
26 #define FS_CHUNK_VEC_LEN 11 /**< number of chunk sizes */
28 STATIC_ASSERT ((FS_MAX_LOG2_CHUNK_SZ - FS_MIN_LOG2_CHUNK_SZ) ==
30 "update chunk sizes");
32 #define SVM_FIFO_TRACE (0)
33 #define SVM_FIFO_MAX_EVT_SUBSCRIBERS 7
35 typedef struct fifo_segment_header_ fifo_segment_header_t;
36 typedef struct svm_fifo_chunk_ svm_fifo_chunk_t;
37 typedef svm_fifo_chunk_t *svm_fifo_chunk_ptr_t;
39 struct svm_fifo_chunk_
41 u32 start_byte; /**< chunk start byte */
42 u32 length; /**< length of chunk in bytes */
43 svm_fifo_chunk_ptr_t next; /**< pointer to next chunk in linked-lists */
44 rb_node_index_t enq_rb_index; /**< enq node index if chunk in rbtree */
45 rb_node_index_t deq_rb_index; /**< deq node index if chunk in rbtree */
46 u8 data[0]; /**< start of chunk data */
51 u32 next; /**< Next linked-list element pool index */
52 u32 prev; /**< Previous linked-list element pool index */
53 u32 start; /**< Start of segment, normalized*/
54 u32 length; /**< Length of segment */
62 } svm_fifo_trace_elem_t;
64 typedef struct svm_fifo_shr_
66 CLIB_CACHE_LINE_ALIGN_MARK (shared);
67 svm_fifo_chunk_ptr_t start_chunk; /**< first chunk in fifo chunk list */
68 svm_fifo_chunk_ptr_t end_chunk; /**< end chunk in fifo chunk list */
69 volatile u32 has_event; /**< non-zero if deq event exists */
70 u32 min_alloc; /**< min chunk alloc if space available */
71 u32 size; /**< size of the fifo in bytes */
72 u32 master_session_index; /**< session layer session index */
73 u32 client_session_index; /**< app session index */
74 u8 slice_index; /**< segment slice for fifo */
75 struct svm_fifo_shr_ *next; /**< next in freelist/active chain */
77 CLIB_CACHE_LINE_ALIGN_MARK (consumer);
78 svm_fifo_chunk_ptr_t head_chunk; /**< tracks chunk where head lands */
79 u32 head; /**< fifo head position/byte */
80 volatile u32 want_deq_ntf; /**< producer wants nudge */
81 volatile u32 has_deq_ntf;
83 CLIB_CACHE_LINE_ALIGN_MARK (producer);
84 u32 tail; /**< fifo tail position/byte */
85 svm_fifo_chunk_ptr_t tail_chunk; /**< tracks chunk where tail lands */
86 volatile u8 n_subscribers; /**< Number of subscribers for io events */
87 u8 subscribers[SVM_FIFO_MAX_EVT_SUBSCRIBERS];
90 typedef struct _svm_fifo
92 CLIB_CACHE_LINE_ALIGN_MARK (cacheline);
93 svm_fifo_shared_t *shr; /**< shared fifo in fifo segment memory */
94 fifo_segment_header_t *fs_hdr; /**< fifo segment header for fifo */
95 rb_tree_t ooo_enq_lookup; /**< rbtree for ooo enq chunk lookup */
96 rb_tree_t ooo_deq_lookup; /**< rbtree for ooo deq chunk lookup */
97 svm_fifo_chunk_t *ooo_deq; /**< last chunk used for ooo dequeue */
98 svm_fifo_chunk_t *ooo_enq; /**< last chunk used for ooo enqueue */
99 ooo_segment_t *ooo_segments; /**< Pool of ooo segments */
100 u32 ooos_list_head; /**< Head of out-of-order linked-list */
101 u32 ooos_newest; /**< Last segment to have been updated */
103 u8 flags; /**< fifo flags */
104 u8 master_thread_index; /**< session layer thread index */
105 u8 client_thread_index; /**< app worker index */
106 i8 refcnt; /**< reference count */
107 u32 segment_manager; /**< session layer segment manager index */
108 u32 segment_index; /**< segment index in segment manager */
110 struct _svm_fifo *next; /**< prev in active chain */
111 struct _svm_fifo *prev; /**< prev in active chain */
114 svm_fifo_trace_elem_t *trace;
118 typedef struct fifo_segment_slice_
121 free_chunks[FS_CHUNK_VEC_LEN]; /**< Free chunks by size */
122 svm_fifo_shared_t *free_fifos; /**< Freelists of fifo shared hdrs */
123 uword n_fl_chunk_bytes; /**< Chunk bytes on freelist */
124 uword virtual_mem; /**< Slice sum of all fifo sizes */
125 u32 num_chunks[FS_CHUNK_VEC_LEN]; /**< Allocated chunks by chunk size */
127 CLIB_CACHE_LINE_ALIGN_MARK (lock);
129 } fifo_segment_slice_t;
131 typedef struct fifo_slice_private_
133 clib_mem_bulk_handle_t fifos; /**< Bulk fifo allocator */
134 uword virtual_mem; /**< Slice sum of all fifo sizes */
135 svm_fifo_t *active_fifos; /**< Linked list of active RX fifos */
136 } fifo_slice_private_t;
138 struct fifo_segment_header_
140 uword n_cached_bytes; /**< Cached bytes */
141 u32 n_active_fifos; /**< Number of active fifos */
142 u32 n_reserved_bytes; /**< Bytes not to be allocated */
143 u32 max_log2_fifo_size; /**< Max log2(chunk size) for fs */
144 u8 flags; /**< Segment flags */
145 u8 n_slices; /**< Number of slices */
146 u8 high_watermark; /**< Memory pressure watermark high */
147 u8 low_watermark; /**< Memory pressure watermark low */
148 u8 pct_first_alloc; /**< Pct of fifo size to alloc */
149 CLIB_CACHE_LINE_ALIGN_MARK (allocator);
151 uword max_byte_index;
152 CLIB_CACHE_LINE_ALIGN_MARK (slice);
153 fifo_segment_slice_t slices[0]; /** Fixed array of slices */
156 void fsh_virtual_mem_update (fifo_segment_header_t * fsh, u32 slice_index,
159 always_inline svm_fifo_chunk_t *
160 fs_chunk_ptr (fifo_segment_header_t *fsh, svm_fifo_chunk_ptr_t cp)
162 return cp ? (svm_fifo_chunk_t *) ((u8 *) fsh + pointer_to_uword (cp)) : 0;
165 always_inline svm_fifo_chunk_ptr_t
166 fs_chunk_sptr (fifo_segment_header_t *fsh, svm_fifo_chunk_t *c)
168 return c ? (svm_fifo_chunk_ptr_t) ((u8 *) c - (u8 *) fsh) : 0;
171 #endif /* SRC_SVM_FIFO_TYPES_H_ */
174 * fd.io coding-style-patch-verification: ON
177 * eval: (c-set-style "gnu")