FD.io VPP  v19.08.1-401-g8e4ed521a
Vector Packet Processing
segment_manager.c File Reference
+ Include dependency graph for segment_manager.c:

Go to the source code of this file.

Data Structures

struct  segment_manager_main_
 

Macros

#define segment_manager_foreach_segment_w_lock(VAR, SM, BODY)
 

Typedefs

typedef struct segment_manager_main_ segment_manager_main_t
 

Functions

static segment_manager_props_tsegment_manager_properties_get (segment_manager_t *sm)
 
segment_manager_props_tsegment_manager_props_init (segment_manager_props_t *props)
 
static u8 segment_manager_app_detached (segment_manager_t *sm)
 
void segment_manager_app_detach (segment_manager_t *sm)
 
static u32 segment_manager_segment_index (segment_manager_t *sm, fifo_segment_t *seg)
 
int segment_manager_add_segment (segment_manager_t *sm, u32 segment_size)
 Adds segment to segment manager's pool. More...
 
void segment_manager_del_segment (segment_manager_t *sm, fifo_segment_t *fs)
 Remove segment without lock. More...
 
static void segment_manager_lock_and_del_segment (segment_manager_t *sm, u32 fs_index)
 Removes segment after acquiring writer lock. More...
 
fifo_segment_tsegment_manager_get_segment (segment_manager_t *sm, u32 segment_index)
 Reads a segment from the segment manager's pool without lock. More...
 
u64 segment_manager_segment_handle (segment_manager_t *sm, fifo_segment_t *segment)
 
static void segment_manager_parse_segment_handle (u64 segment_handle, u32 *sm_index, u32 *segment_index)
 
u64 segment_manager_make_segment_handle (u32 segment_manager_index, u32 segment_index)
 
fifo_segment_tsegment_manager_get_segment_w_handle (u64 segment_handle)
 
fifo_segment_tsegment_manager_get_segment_w_lock (segment_manager_t *sm, u32 segment_index)
 Reads a segment from the segment manager's pool and acquires reader lock. More...
 
void segment_manager_segment_reader_unlock (segment_manager_t *sm)
 
void segment_manager_segment_writer_unlock (segment_manager_t *sm)
 
segment_manager_tsegment_manager_alloc (void)
 
int segment_manager_init (segment_manager_t *sm, u32 first_seg_size, u32 prealloc_fifo_pairs)
 Initializes segment manager based on options provided. More...
 
void segment_manager_free (segment_manager_t *sm)
 Cleanup segment manager. More...
 
void segment_manager_init_free (segment_manager_t *sm)
 Initiate segment manager cleanup. More...
 
segment_manager_tsegment_manager_get (u32 index)
 
segment_manager_tsegment_manager_get_if_valid (u32 index)
 
u32 segment_manager_index (segment_manager_t *sm)
 
u8 segment_manager_has_fifos (segment_manager_t *sm)
 
void segment_manager_del_sessions (segment_manager_t *sm)
 Initiate disconnects for all sessions 'owned' by a segment manager. More...
 
int segment_manager_try_alloc_fifos (fifo_segment_t *fifo_segment, u32 rx_fifo_size, u32 tx_fifo_size, svm_fifo_t **rx_fifo, svm_fifo_t **tx_fifo)
 
int segment_manager_alloc_session_fifos (segment_manager_t *sm, svm_fifo_t **rx_fifo, svm_fifo_t **tx_fifo)
 
void segment_manager_dealloc_fifos (svm_fifo_t *rx_fifo, svm_fifo_t *tx_fifo)
 
int segment_manager_grow_fifo (segment_manager_t *sm, svm_fifo_t *f, u32 size)
 Grows fifo owned by segment manager. More...
 
int segment_manager_collect_fifo_chunks (segment_manager_t *sm, svm_fifo_t *f)
 Collect fifo chunks that are no longer used. More...
 
int segment_manager_shrink_fifo (segment_manager_t *sm, svm_fifo_t *f, u32 size, u8 is_producer)
 Request to shrink fifo owned by segment manager. More...
 
u32 segment_manager_evt_q_expected_size (u32 q_len)
 
svm_msg_q_tsegment_manager_alloc_queue (fifo_segment_t *segment, segment_manager_props_t *props)
 Allocates shm queue in the first segment. More...
 
svm_msg_q_tsegment_manager_event_queue (segment_manager_t *sm)
 
void segment_manager_dealloc_queue (segment_manager_t *sm, svm_queue_t *q)
 Frees shm queue allocated in the first segment. More...
 
void segment_manager_main_init (segment_manager_main_init_args_t *a)
 
static clib_error_tsegment_manager_show_fn (vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
 
void segment_manager_format_sessions (segment_manager_t *sm, int verbose)
 

Variables

static segment_manager_main_t sm_main
 
static vlib_cli_command_t segment_manager_show_command
 (constructor) VLIB_CLI_COMMAND (segment_manager_show_command) More...
 

Macro Definition Documentation

◆ segment_manager_foreach_segment_w_lock

#define segment_manager_foreach_segment_w_lock (   VAR,
  SM,
  BODY 
)
Value:
do { \
clib_rwlock_reader_lock (&(SM)->segments_rwlock); \
pool_foreach((VAR), ((SM)->segments), (BODY)); \
clib_rwlock_reader_unlock (&(SM)->segments_rwlock); \
} while (0)

Definition at line 36 of file segment_manager.c.

Typedef Documentation

◆ segment_manager_main_t

Function Documentation

◆ segment_manager_add_segment()

int segment_manager_add_segment ( segment_manager_t sm,
u32  segment_size 
)

Adds segment to segment manager's pool.

If needed a writer's lock is acquired before allocating a new segment to avoid affecting any of the segments pool readers.

Definition at line 85 of file segment_manager.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ segment_manager_alloc()

segment_manager_t* segment_manager_alloc ( void  )

Definition at line 293 of file segment_manager.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ segment_manager_alloc_queue()

svm_msg_q_t* segment_manager_alloc_queue ( fifo_segment_t segment,
segment_manager_props_t props 
)

Allocates shm queue in the first segment.

Must be called with lock held

Definition at line 744 of file segment_manager.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ segment_manager_alloc_session_fifos()

int segment_manager_alloc_session_fifos ( segment_manager_t sm,
svm_fifo_t **  rx_fifo,
svm_fifo_t **  tx_fifo 
)

Definition at line 546 of file segment_manager.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ segment_manager_app_detach()

void segment_manager_app_detach ( segment_manager_t sm)

Definition at line 67 of file segment_manager.c.

+ Here is the caller graph for this function:

◆ segment_manager_app_detached()

static u8 segment_manager_app_detached ( segment_manager_t sm)
static

Definition at line 61 of file segment_manager.c.

+ Here is the caller graph for this function:

◆ segment_manager_collect_fifo_chunks()

int segment_manager_collect_fifo_chunks ( segment_manager_t sm,
svm_fifo_t f 
)

Collect fifo chunks that are no longer used.

This should not be called unless SVM_FIFO_F_COLLECT_CHUNKS is set for the fifo. The chunks are returned to the fifo segment freelist.

Parameters
smsegment manager that owns the fifo
ffifo whose chunks are to be collected
Returns
0 on success, error otherwise

Definition at line 691 of file segment_manager.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ segment_manager_dealloc_fifos()

void segment_manager_dealloc_fifos ( svm_fifo_t rx_fifo,
svm_fifo_t tx_fifo 
)

Definition at line 633 of file segment_manager.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ segment_manager_dealloc_queue()

void segment_manager_dealloc_queue ( segment_manager_t sm,
svm_queue_t q 
)

Frees shm queue allocated in the first segment.

Definition at line 788 of file segment_manager.c.

+ Here is the call graph for this function:

◆ segment_manager_del_segment()

void segment_manager_del_segment ( segment_manager_t sm,
fifo_segment_t fs 
)

Remove segment without lock.

Definition at line 173 of file segment_manager.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ segment_manager_del_sessions()

void segment_manager_del_sessions ( segment_manager_t sm)

Initiate disconnects for all sessions 'owned' by a segment manager.

Cleanup segment manager sessions.

Definition at line 471 of file segment_manager.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ segment_manager_event_queue()

svm_msg_q_t* segment_manager_event_queue ( segment_manager_t sm)

Definition at line 779 of file segment_manager.c.

+ Here is the caller graph for this function:

◆ segment_manager_evt_q_expected_size()

u32 segment_manager_evt_q_expected_size ( u32  q_len)

Definition at line 722 of file segment_manager.c.

+ Here is the call graph for this function:

◆ segment_manager_format_sessions()

void segment_manager_format_sessions ( segment_manager_t sm,
int  verbose 
)

Definition at line 884 of file segment_manager.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ segment_manager_free()

void segment_manager_free ( segment_manager_t sm)

Cleanup segment manager.

Parameters
smsegment manager to be freed

Definition at line 380 of file segment_manager.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ segment_manager_get()

segment_manager_t* segment_manager_get ( u32  index)

Definition at line 422 of file segment_manager.c.

+ Here is the caller graph for this function:

◆ segment_manager_get_if_valid()

segment_manager_t* segment_manager_get_if_valid ( u32  index)

Definition at line 428 of file segment_manager.c.

+ Here is the caller graph for this function:

◆ segment_manager_get_segment()

fifo_segment_t* segment_manager_get_segment ( segment_manager_t sm,
u32  segment_index 
)

Reads a segment from the segment manager's pool without lock.

Definition at line 224 of file segment_manager.c.

+ Here is the caller graph for this function:

◆ segment_manager_get_segment_w_handle()

fifo_segment_t* segment_manager_get_segment_w_handle ( u64  segment_handle)

Definition at line 253 of file segment_manager.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ segment_manager_get_segment_w_lock()

fifo_segment_t* segment_manager_get_segment_w_lock ( segment_manager_t sm,
u32  segment_index 
)

Reads a segment from the segment manager's pool and acquires reader lock.

Caller must drop the reader's lock by calling segment_manager_segment_reader_unlock once it finishes working with the segment.

Definition at line 274 of file segment_manager.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ segment_manager_grow_fifo()

int segment_manager_grow_fifo ( segment_manager_t sm,
svm_fifo_t f,
u32  size 
)

Grows fifo owned by segment manager.

Parameters
smsegment manager that owns the fifo
ffifo to be grown
sizeamount of bytes to add to fifo
Returns
0 on success, negative number otherwise

Definition at line 678 of file segment_manager.c.

+ Here is the call graph for this function:

◆ segment_manager_has_fifos()

u8 segment_manager_has_fifos ( segment_manager_t sm)

Definition at line 442 of file segment_manager.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ segment_manager_index()

u32 segment_manager_index ( segment_manager_t sm)

Definition at line 436 of file segment_manager.c.

+ Here is the caller graph for this function:

◆ segment_manager_init()

int segment_manager_init ( segment_manager_t sm,
u32  first_seg_size,
u32  prealloc_fifo_pairs 
)

Initializes segment manager based on options provided.

Returns error if ssvm segment(s) allocation fails.

Definition at line 308 of file segment_manager.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ segment_manager_init_free()

void segment_manager_init_free ( segment_manager_t sm)

Initiate segment manager cleanup.

Parameters
smsegment manager to be freed

Definition at line 409 of file segment_manager.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ segment_manager_lock_and_del_segment()

static void segment_manager_lock_and_del_segment ( segment_manager_t sm,
u32  fs_index 
)
inlinestatic

Removes segment after acquiring writer lock.

Definition at line 202 of file segment_manager.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ segment_manager_main_init()

void segment_manager_main_init ( segment_manager_main_init_args_t a)

Definition at line 809 of file segment_manager.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ segment_manager_make_segment_handle()

u64 segment_manager_make_segment_handle ( u32  segment_manager_index,
u32  segment_index 
)

Definition at line 246 of file segment_manager.c.

+ Here is the caller graph for this function:

◆ segment_manager_parse_segment_handle()

static void segment_manager_parse_segment_handle ( u64  segment_handle,
u32 sm_index,
u32 segment_index 
)
static

Definition at line 238 of file segment_manager.c.

+ Here is the caller graph for this function:

◆ segment_manager_properties_get()

static segment_manager_props_t* segment_manager_properties_get ( segment_manager_t sm)
static

Definition at line 44 of file segment_manager.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ segment_manager_props_init()

segment_manager_props_t* segment_manager_props_init ( segment_manager_props_t props)

Definition at line 51 of file segment_manager.c.

+ Here is the caller graph for this function:

◆ segment_manager_segment_handle()

u64 segment_manager_segment_handle ( segment_manager_t sm,
fifo_segment_t segment 
)

Definition at line 230 of file segment_manager.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ segment_manager_segment_index()

static u32 segment_manager_segment_index ( segment_manager_t sm,
fifo_segment_t seg 
)
inlinestatic

Definition at line 73 of file segment_manager.c.

+ Here is the caller graph for this function:

◆ segment_manager_segment_reader_unlock()

void segment_manager_segment_reader_unlock ( segment_manager_t sm)

Definition at line 281 of file segment_manager.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ segment_manager_segment_writer_unlock()

void segment_manager_segment_writer_unlock ( segment_manager_t sm)

Definition at line 287 of file segment_manager.c.

+ Here is the call graph for this function:

◆ segment_manager_show_fn()

static clib_error_t* segment_manager_show_fn ( vlib_main_t vm,
unformat_input_t input,
vlib_cli_command_t cmd 
)
static

Definition at line 825 of file segment_manager.c.

+ Here is the call graph for this function:

◆ segment_manager_shrink_fifo()

int segment_manager_shrink_fifo ( segment_manager_t sm,
svm_fifo_t f,
u32  size,
u8  is_producer 
)

Request to shrink fifo owned by segment manager.

If this is not called by the producer, no attempt is made to reduce the size until the producer tries to enqueue more data. To collect the chunks that are to be removed call segment_manager_collect_fifo_chunks

Size reduction does not affect fifo chunk boundaries. Therefore chunks are not split and the amount of bytes to be removed can be equal to or less than what was requested.

Parameters
smsegment manager that owns the fifo
ffifo to be shrunk
sizeamount of bytes to remove from fifo
is_producerflag that indicates is caller is the producer for the fifo.
Returns
actual number of bytes to be removed

Definition at line 704 of file segment_manager.c.

+ Here is the call graph for this function:

◆ segment_manager_try_alloc_fifos()

int segment_manager_try_alloc_fifos ( fifo_segment_t fifo_segment,
u32  rx_fifo_size,
u32  tx_fifo_size,
svm_fifo_t **  rx_fifo,
svm_fifo_t **  tx_fifo 
)

Definition at line 510 of file segment_manager.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ segment_manager_show_command

vlib_cli_command_t segment_manager_show_command
static
Initial value:
=
{
.path = "show segment-manager",
.short_help = "show segment-manager [segments][verbose]",
}
static clib_error_t * segment_manager_show_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)

(constructor) VLIB_CLI_COMMAND (segment_manager_show_command)

Definition at line 875 of file segment_manager.c.

◆ sm_main

segment_manager_main_t sm_main
static

Definition at line 34 of file segment_manager.c.