FD.io VPP
v21.06-3-gbb25fbf28
Vector Packet Processing
|
Go to the source code of this file.
Functions | |
static svm_msg_q_ring_t * | svm_msg_q_ring_inline (svm_msg_q_t *mq, u32 ring_index) |
svm_msg_q_ring_t * | svm_msg_q_ring (svm_msg_q_t *mq, u32 ring_index) |
Get message queue ring. More... | |
static void * | svm_msg_q_ring_data (svm_msg_q_ring_t *ring, u32 elt_index) |
static void | svm_msg_q_init_mutex (svm_msg_q_shared_queue_t *sq) |
svm_msg_q_shared_t * | svm_msg_q_init (void *base, svm_msg_q_cfg_t *cfg) |
uword | svm_msg_q_size_to_alloc (svm_msg_q_cfg_t *cfg) |
svm_msg_q_shared_t * | svm_msg_q_alloc (svm_msg_q_cfg_t *cfg) |
Allocate message queue. More... | |
void | svm_msg_q_attach (svm_msg_q_t *mq, void *smq_base) |
void | svm_msg_q_cleanup (svm_msg_q_t *mq) |
Cleanup mq's private data. More... | |
void | svm_msg_q_free (svm_msg_q_t *mq) |
Free message queue. More... | |
static void | svm_msg_q_send_signal (svm_msg_q_t *mq, u8 is_consumer) |
svm_msg_q_msg_t | svm_msg_q_alloc_msg_w_ring (svm_msg_q_t *mq, u32 ring_index) |
Allocate message buffer on ring. More... | |
int | svm_msg_q_lock_and_alloc_msg_w_ring (svm_msg_q_t *mq, u32 ring_index, u8 noblock, svm_msg_q_msg_t *msg) |
Lock message queue and allocate message buffer on ring. More... | |
svm_msg_q_msg_t | svm_msg_q_alloc_msg (svm_msg_q_t *mq, u32 nbytes) |
Allocate message buffer. More... | |
void * | svm_msg_q_msg_data (svm_msg_q_t *mq, svm_msg_q_msg_t *msg) |
Get data for message in queue. More... | |
void | svm_msg_q_free_msg (svm_msg_q_t *mq, svm_msg_q_msg_t *msg) |
Free message buffer. More... | |
static int | svm_msq_q_msg_is_valid (svm_msg_q_t *mq, svm_msg_q_msg_t *msg) |
static void | svm_msg_q_add_raw (svm_msg_q_t *mq, u8 *elem) |
int | svm_msg_q_add (svm_msg_q_t *mq, svm_msg_q_msg_t *msg, int nowait) |
Producer enqueue one message to queue. More... | |
void | svm_msg_q_add_and_unlock (svm_msg_q_t *mq, svm_msg_q_msg_t *msg) |
Producer enqueue one message to queue with mutex held. More... | |
int | svm_msg_q_sub_raw (svm_msg_q_t *mq, svm_msg_q_msg_t *elem) |
Consumer dequeue one message from queue. More... | |
int | svm_msg_q_sub_raw_batch (svm_msg_q_t *mq, svm_msg_q_msg_t *msg_buf, u32 n_msgs) |
Consumer dequeue multiple messages from queue. More... | |
int | svm_msg_q_sub (svm_msg_q_t *mq, svm_msg_q_msg_t *msg, svm_q_conditional_wait_t cond, u32 time) |
Consumer dequeue one message from queue. More... | |
void | svm_msg_q_set_eventfd (svm_msg_q_t *mq, int fd) |
Set event fd for queue. More... | |
int | svm_msg_q_alloc_eventfd (svm_msg_q_t *mq) |
Allocate event fd for queue. More... | |
int | svm_msg_q_wait (svm_msg_q_t *mq, svm_msg_q_wait_type_t type) |
Wait for message queue event. More... | |
int | svm_msg_q_wait_prod (svm_msg_q_t *mq) |
Wait for message queue event as producer. More... | |
int | svm_msg_q_timedwait (svm_msg_q_t *mq, double timeout) |
Timed wait for message queue event. More... | |
u8 * | format_svm_msg_q (u8 *s, va_list *args) |
Format message queue, shows msg count for each ring. More... | |
Format message queue, shows msg count for each ring.
Definition at line 628 of file message_queue.c.
int svm_msg_q_add | ( | svm_msg_q_t * | mq, |
svm_msg_q_msg_t * | msg, | ||
int | nowait | ||
) |
Producer enqueue one message to queue.
Prior to calling this, the producer should've obtained a message buffer from one of the rings by calling svm_msg_q_alloc_msg.
mq | message queue |
msg | message (pointer to ring position) to be enqueued |
nowait | flag to indicate if request is blocking or not |
Definition at line 363 of file message_queue.c.
void svm_msg_q_add_and_unlock | ( | svm_msg_q_t * | mq, |
svm_msg_q_msg_t * | msg | ||
) |
Producer enqueue one message to queue with mutex held.
Prior to calling this, the producer should've obtained a message buffer from one of the rings by calling svm_msg_q_alloc_msg. It assumes the queue mutex is held.
mq | message queue |
msg | message (pointer to ring position) to be enqueued |
Definition at line 394 of file message_queue.c.
|
static |
Definition at line 346 of file message_queue.c.
svm_msg_q_shared_t* svm_msg_q_alloc | ( | svm_msg_q_cfg_t * | cfg | ) |
Allocate message queue.
Allocates a message queue on the heap. Based on the configuration options, apart from the message queue this also allocates (one or multiple) shared-memory rings for the messages.
cfg | configuration options: queue len, consumer pid, ring configs |
Definition at line 130 of file message_queue.c.
int svm_msg_q_alloc_eventfd | ( | svm_msg_q_t * | mq | ) |
Allocate event fd for queue.
Definition at line 491 of file message_queue.c.
svm_msg_q_msg_t svm_msg_q_alloc_msg | ( | svm_msg_q_t * | mq, |
u32 | nbytes | ||
) |
Allocate message buffer.
Message is allocated on the first available ring capable of holding the requested number of bytes.
mq | message queue |
nbytes | number of bytes needed for message |
Definition at line 266 of file message_queue.c.
svm_msg_q_msg_t svm_msg_q_alloc_msg_w_ring | ( | svm_msg_q_t * | mq, |
u32 | ring_index | ||
) |
Allocate message buffer on ring.
Message is allocated, on requested ring. The caller MUST check that the ring is not full.
mq | message queue |
ring_index | ring on which the allocation should occur |
Definition at line 221 of file message_queue.c.
void svm_msg_q_attach | ( | svm_msg_q_t * | mq, |
void * | smq_base | ||
) |
Definition at line 144 of file message_queue.c.
void svm_msg_q_cleanup | ( | svm_msg_q_t * | mq | ) |
Cleanup mq's private data.
Definition at line 170 of file message_queue.c.
void svm_msg_q_free | ( | svm_msg_q_t * | mq | ) |
Free message queue.
mq | message queue to be freed |
Definition at line 179 of file message_queue.c.
void svm_msg_q_free_msg | ( | svm_msg_q_t * | mq, |
svm_msg_q_msg_t * | msg | ||
) |
Free message buffer.
Marks message buffer on ring as free.
mq | message queue |
msg | message to be freed |
Definition at line 294 of file message_queue.c.
svm_msg_q_shared_t* svm_msg_q_init | ( | void * | base, |
svm_msg_q_cfg_t * | cfg | ||
) |
Definition at line 72 of file message_queue.c.
|
static |
Definition at line 43 of file message_queue.c.
int svm_msg_q_lock_and_alloc_msg_w_ring | ( | svm_msg_q_t * | mq, |
u32 | ring_index, | ||
u8 | noblock, | ||
svm_msg_q_msg_t * | msg | ||
) |
Lock message queue and allocate message buffer on ring.
This should be used when multiple writers/readers are expected to compete for the rings/queue. Message should be enqueued by calling svm_msg_q_add_w_lock and the caller MUST unlock the queue once the message in enqueued.
mq | message queue |
ring_index | ring on which the allocation should occur |
noblock | flag that indicates if request should block |
msg | pointer to message to be filled in |
Definition at line 239 of file message_queue.c.
void* svm_msg_q_msg_data | ( | svm_msg_q_t * | mq, |
svm_msg_q_msg_t * | msg | ||
) |
Get data for message in queue.
mq | message queue |
msg | message for which the data is requested |
Definition at line 287 of file message_queue.c.
svm_msg_q_ring_t* svm_msg_q_ring | ( | svm_msg_q_t * | mq, |
u32 | ring_index | ||
) |
Get message queue ring.
mq | message queue |
ring_index | index of ring |
Definition at line 30 of file message_queue.c.
|
inlinestatic |
|
inlinestatic |
|
static |
void svm_msg_q_set_eventfd | ( | svm_msg_q_t * | mq, |
int | fd | ||
) |
Set event fd for queue.
If set, queue will exclusively use eventfds for signaling. Moreover, afterwards, the queue should only be used in non-blocking mode. Waiting for events should be done externally using something like epoll.
mq | message queue |
fd | consumer eventfd |
Definition at line 485 of file message_queue.c.
uword svm_msg_q_size_to_alloc | ( | svm_msg_q_cfg_t * | cfg | ) |
Definition at line 104 of file message_queue.c.
int svm_msg_q_sub | ( | svm_msg_q_t * | mq, |
svm_msg_q_msg_t * | msg, | ||
svm_q_conditional_wait_t | cond, | ||
u32 | time | ||
) |
Consumer dequeue one message from queue.
This returns the message pointing to the data in the message rings. Should only be used in single consumer scenarios as no locks are grabbed. The consumer is expected to call svm_msg_q_free_msg once it finishes processing/copies the message data.
mq | message queue |
msg | pointer to structure where message is to be received |
cond | flag that indicates if request should block or not |
time | time to wait if condition it SVM_Q_TIMEDWAIT |
Definition at line 457 of file message_queue.c.
int svm_msg_q_sub_raw | ( | svm_msg_q_t * | mq, |
svm_msg_q_msg_t * | elem | ||
) |
Consumer dequeue one message from queue.
Returns the message pointing to the data in the message rings. Should only be used in single consumer scenarios as no locks are grabbed. The consumer is expected to call svm_msg_q_free_msg once it finishes processing/copies the message data.
mq | message queue |
msg | pointer to structure where message is to be received |
Definition at line 402 of file message_queue.c.
int svm_msg_q_sub_raw_batch | ( | svm_msg_q_t * | mq, |
svm_msg_q_msg_t * | msg_buf, | ||
u32 | n_msgs | ||
) |
Consumer dequeue multiple messages from queue.
Returns the message pointing to the data in the message rings. Should only be used in single consumer scenarios as no locks are grabbed. The consumer is expected to call svm_msg_q_free_msg once it finishes processing/copies the message data.
mq | message queue |
msg_buf | pointer to array of messages to received |
n_msgs | lengt of msg_buf array |
Definition at line 423 of file message_queue.c.
int svm_msg_q_timedwait | ( | svm_msg_q_t * | mq, |
double | timeout | ||
) |
Timed wait for message queue event.
Must be called with mutex held.
mq | message queue |
timeout | time in seconds |
Definition at line 572 of file message_queue.c.
int svm_msg_q_wait | ( | svm_msg_q_t * | mq, |
svm_msg_q_wait_type_t | type | ||
) |
Wait for message queue event.
When eventfds are not configured, the shared memory mutex is locked before waiting on the condvar. Typically called by consumers.
Definition at line 501 of file message_queue.c.
int svm_msg_q_wait_prod | ( | svm_msg_q_t * | mq | ) |
Wait for message queue event as producer.
Similar to svm_msg_q_wait but lock (mutex or spinlock) must be held. Should only be called by producers.
Definition at line 543 of file message_queue.c.
|
static |
Definition at line 323 of file message_queue.c.