diff options
Diffstat (limited to 'src/svm')
-rw-r--r-- | src/svm/fifo_segment.c | 33 | ||||
-rw-r--r-- | src/svm/fifo_segment.h | 9 | ||||
-rw-r--r-- | src/svm/fifo_types.h | 1 |
3 files changed, 43 insertions, 0 deletions
diff --git a/src/svm/fifo_segment.c b/src/svm/fifo_segment.c index 3e9aecb9dc8..76cc046efec 100644 --- a/src/svm/fifo_segment.c +++ b/src/svm/fifo_segment.c @@ -301,6 +301,7 @@ fifo_segment_init (fifo_segment_t * fs) fsh->max_log2_fifo_size = min_log2 (max_fifo); fsh->n_cached_bytes = 0; fsh->n_reserved_bytes = fsh->byte_index; + fsh->start_byte_index = fsh->byte_index; ASSERT (fsh->max_byte_index <= sh->ssvm_size - offset); fs->max_byte_index = fsh->max_byte_index; @@ -1054,6 +1055,38 @@ fifo_segment_msg_q_attach (fifo_segment_t *fs, uword offset, u32 mq_index) return mq; } +void +fifo_segment_msg_qs_discover (fifo_segment_t *fs, int *fds, u32 n_fds) +{ + svm_msg_q_shared_t *smq; + u32 n_mqs, size, i; + uword offset = 0, n_alloced; + svm_msg_q_t *mq; + + n_mqs = fs->h->n_mqs; + if (n_fds && n_mqs != n_fds) + { + clib_warning ("expected %u fds got %u", n_mqs, n_fds); + return; + } + + vec_validate (fs->mqs, n_mqs - 1); + n_alloced = fs->h->n_reserved_bytes - fs->h->start_byte_index; + ASSERT (n_alloced % n_mqs == 0); + size = n_alloced / n_mqs; + + offset = fs->h->start_byte_index; + for (i = 0; i < n_mqs; i++) + { + mq = vec_elt_at_index (fs->mqs, i); + smq = (svm_msg_q_shared_t *) ((u8 *) fs->h + offset); + svm_msg_q_attach (mq, smq); + if (n_fds) + svm_msg_q_set_eventfd (mq, fds[i]); + offset += size; + } +} + uword fifo_segment_msg_q_offset (fifo_segment_t *fs, u32 mq_index) { diff --git a/src/svm/fifo_segment.h b/src/svm/fifo_segment.h index 268b48b39f6..9d2ab281034 100644 --- a/src/svm/fifo_segment.h +++ b/src/svm/fifo_segment.h @@ -167,6 +167,15 @@ svm_msg_q_t *fifo_segment_msg_q_attach (fifo_segment_t *fs, uword offset, u32 mq_index); /** + * Discover mqs on mq only segment + * + * @param fs fifo segment for mq + * @param fds array of fds is mqs use eventfds + * @param n_fds number of fds + */ +void fifo_segment_msg_qs_discover (fifo_segment_t *fs, int *fds, u32 n_fds); + +/** * Message queue offset on segment * * @param fs fifo segment for mq diff --git a/src/svm/fifo_types.h b/src/svm/fifo_types.h index 03adbd33c2c..7b844f00bfe 100644 --- a/src/svm/fifo_types.h +++ b/src/svm/fifo_types.h @@ -150,6 +150,7 @@ struct fifo_segment_header_ CLIB_CACHE_LINE_ALIGN_MARK (allocator); uword byte_index; uword max_byte_index; + uword start_byte_index; CLIB_CACHE_LINE_ALIGN_MARK (slice); fifo_segment_slice_t slices[0]; /** Fixed array of slices */ }; |