Line data Source code
1 : /* 2 : * Copyright (c) 2017-2019 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: 6 : * 7 : * http://www.apache.org/licenses/LICENSE-2.0 8 : * 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. 14 : */ 15 : #ifndef SRC_VNET_SESSION_SEGMENT_MANAGER_H_ 16 : #define SRC_VNET_SESSION_SEGMENT_MANAGER_H_ 17 : 18 : #include <svm/message_queue.h> 19 : #include <vppinfra/lock.h> 20 : #include <vppinfra/valloc.h> 21 : #include <svm/fifo_segment.h> 22 : #include <vnet/session/session_types.h> 23 : 24 : typedef struct _segment_manager_props 25 : { 26 : u32 rx_fifo_size; /**< receive fifo size */ 27 : u32 tx_fifo_size; /**< transmit fifo size */ 28 : u32 evt_q_size; /**< event queue length */ 29 : u32 prealloc_fifos; /**< preallocated fifo pairs */ 30 : u32 prealloc_fifo_hdrs; /**< preallocated fifo hdrs */ 31 : uword segment_size; /**< first segment size */ 32 : uword add_segment_size; /**< additional segment size */ 33 : u8 add_segment:1; /**< can add new segments flag */ 34 : u8 use_mq_eventfd:1; /**< use eventfds for mqs flag */ 35 : u8 reserved:6; /**< reserved flags */ 36 : u8 n_slices; /**< number of fs slices/threads */ 37 : ssvm_segment_type_t segment_type; /**< seg type: if set to SSVM_N_TYPES, 38 : private segments are used */ 39 : u32 max_fifo_size; /**< max fifo size */ 40 : u8 high_watermark; /**< memory usage high watermark % */ 41 : u8 low_watermark; /**< memory usage low watermark % */ 42 : u8 pct_first_alloc; /**< pct of fifo size to alloc */ 43 : u8 huge_page; /**< use hugepage */ 44 : } segment_manager_props_t; 45 : 46 : typedef enum seg_manager_flag_ 47 : { 48 : SEG_MANAGER_F_DETACHED = 1 << 0, 49 : SEG_MANAGER_F_DETACHED_LISTENER = 1 << 1, 50 : } seg_manager_flag_t; 51 : 52 : typedef struct _segment_manager 53 : { 54 : /** Pool of segments allocated by this manager */ 55 : fifo_segment_t *segments; 56 : 57 : /** rwlock that protects the segments pool */ 58 : clib_rwlock_t segments_rwlock; 59 : 60 : /** Owner app worker index */ 61 : u32 app_wrk_index; 62 : 63 : /** 64 : * First segment should not be deleted unless segment manger is deleted. 65 : * This also indicates that the segment manager is the first to have been 66 : * allocated for the app. 67 : */ 68 : u8 first_is_protected; 69 : 70 : /** 71 : * App event queue allocated in first segment 72 : */ 73 : svm_msg_q_t *event_queue; 74 : 75 : u8 flags; 76 : 77 : u32 max_fifo_size; 78 : u8 high_watermark; 79 : u8 low_watermark; 80 : } segment_manager_t; 81 : 82 : #define SEGMENT_MANAGER_INVALID_APP_INDEX ((u32) ~0) 83 : 84 : segment_manager_t *segment_manager_alloc (void); 85 : int segment_manager_init (segment_manager_t * sm); 86 : int segment_manager_init_first (segment_manager_t * sm); 87 : 88 : /** 89 : * Cleanup segment manager 90 : * 91 : * @param sm segment manager to be freed 92 : */ 93 : void segment_manager_free (segment_manager_t * sm); 94 : void segment_manager_free_safe (segment_manager_t *sm); 95 : 96 : /** 97 : * Initiate segment manager cleanup 98 : * 99 : * @param sm segment manager to be freed 100 : */ 101 : void segment_manager_init_free (segment_manager_t * sm); 102 : segment_manager_t *segment_manager_get (u32 index); 103 : segment_manager_t *segment_manager_get_if_valid (u32 index); 104 : u32 segment_manager_index (segment_manager_t * sm); 105 : 106 : /** 107 : * Add segment without lock 108 : * 109 : * @param sm Segment manager 110 : * @param segment_size Size of segment to be added 111 : * @param notify_app Flag set if app notification requested 112 : */ 113 : int segment_manager_add_segment (segment_manager_t *sm, uword segment_size, 114 : u8 notify_app); 115 : 116 : /** 117 : * Add segment with lock 118 : * 119 : * @param sm Segment manager 120 : * @param segment_size Size of segment to be added 121 : * @param flags Flags to be set on segment 122 : */ 123 : int segment_manager_add_segment2 (segment_manager_t *sm, uword segment_size, 124 : u8 flags); 125 : void segment_manager_del_segment (segment_manager_t * sm, 126 : fifo_segment_t * fs); 127 : void segment_manager_lock_and_del_segment (segment_manager_t * sm, 128 : u32 fs_index); 129 : fifo_segment_t *segment_manager_get_segment (segment_manager_t * sm, 130 : u32 segment_index); 131 : fifo_segment_t *segment_manager_get_segment_w_handle (u64 sh); 132 : fifo_segment_t *segment_manager_get_segment_w_lock (segment_manager_t * sm, 133 : u32 segment_index); 134 : int segment_manager_add_first_segment (segment_manager_t * sm, 135 : u32 segment_size); 136 : u64 segment_manager_make_segment_handle (u32 segment_manager_index, 137 : u32 segment_index); 138 : u64 segment_manager_segment_handle (segment_manager_t * sm, 139 : fifo_segment_t * segment); 140 : void segment_manager_segment_reader_unlock (segment_manager_t * sm); 141 : 142 : int segment_manager_alloc_session_fifos (segment_manager_t * sm, 143 : u32 thread_index, 144 : svm_fifo_t ** rx_fifo, 145 : svm_fifo_t ** tx_fifo); 146 : int segment_manager_try_alloc_fifos (fifo_segment_t * fs, 147 : u32 thread_index, 148 : u32 rx_fifo_size, u32 tx_fifo_size, 149 : svm_fifo_t ** rx_fifo, 150 : svm_fifo_t ** tx_fifo); 151 : void segment_manager_dealloc_fifos (svm_fifo_t * rx_fifo, 152 : svm_fifo_t * tx_fifo); 153 : void segment_manager_detach_fifo (segment_manager_t *sm, svm_fifo_t **f); 154 : void segment_manager_attach_fifo (segment_manager_t *sm, svm_fifo_t **f, 155 : session_t *s); 156 : 157 : void segment_manager_set_watermarks (segment_manager_t * sm, 158 : u8 high_watermark, u8 low_watermark); 159 : 160 : u8 segment_manager_has_fifos (segment_manager_t * sm); 161 : 162 : svm_msg_q_t *segment_manager_alloc_queue (fifo_segment_t * fs, 163 : segment_manager_props_t * props); 164 : void segment_manager_dealloc_queue (segment_manager_t * sm, svm_queue_t * q); 165 : svm_msg_q_t *segment_manager_event_queue (segment_manager_t * sm); 166 : u32 segment_manager_evt_q_expected_size (u32 q_size); 167 : 168 : u8 segment_manager_app_detached (segment_manager_t * sm); 169 : void segment_manager_app_detach (segment_manager_t * sm); 170 : 171 : /** 172 : * Cleanup segment manager sessions 173 : * 174 : * Initiates disconnects for all sessions 'owned' by a segment manager by 175 : * leveraging the backpointers that fifos keep. 176 : * 177 : * @param sm segment manager whose sessions are to be disconnected 178 : */ 179 : void segment_manager_del_sessions (segment_manager_t * sm); 180 : void segment_manager_del_sessions_filter (segment_manager_t *sm, 181 : session_state_t *states); 182 : void segment_manager_format_sessions (segment_manager_t * sm, int verbose); 183 : 184 : void segment_manager_main_init (void); 185 : 186 : segment_manager_props_t *segment_manager_props_init (segment_manager_props_t * 187 : sm); 188 : 189 : static inline void 190 41 : segment_manager_parse_segment_handle (u64 segment_handle, u32 * sm_index, 191 : u32 * segment_index) 192 : { 193 41 : *sm_index = segment_handle >> 32; 194 41 : *segment_index = segment_handle & 0xFFFFFFFF; 195 41 : } 196 : 197 : #endif /* SRC_VNET_SESSION_SEGMENT_MANAGER_H_ */ 198 : /* 199 : * fd.io coding-style-patch-verification: ON 200 : * 201 : * Local Variables: 202 : * eval: (c-set-style "gnu") 203 : * End: 204 : */