#define SSVM_N_OPAQUE 7
+typedef enum ssvm_segment_type_
+{
+ SSVM_SEGMENT_SHM = 0,
+ SSVM_SEGMENT_MEMFD,
+ SSVM_SEGMENT_PRIVATE,
+ SSVM_N_SEGMENT_TYPES /**< Private segments */
+} ssvm_segment_type_t;
+
typedef struct
{
/* Spin-lock */
void *heap;
/* Segment must be mapped at this address, or no supper */
- u64 ssvm_va;
+ uword ssvm_va;
/* The actual mmap size */
- u64 ssvm_size;
+ uword ssvm_size;
u32 master_pid;
u32 slave_pid;
u8 *name;
/* Set when the master application thinks it's time to make the donuts */
volatile u32 ready;
- /* Needed to make unique MAC addresses, etc. */
- u32 master_index;
+ ssvm_segment_type_t type;
} ssvm_shared_header_t;
typedef struct
ssvm_shared_header_t *sh;
u64 ssvm_size;
u32 my_pid;
- u32 vlib_hw_if_index;
u8 *name;
uword requested_va;
int i_am_master;
- u32 per_interface_next_index;
- u32 *rx_queue;
+
+ union
+ {
+ int fd; /**< memfd segments */
+ int attach_timeout; /**< shm segments attach timeout (sec) */
+ };
} ssvm_private_t;
always_inline void
return;
}
- while (__sync_lock_test_and_set (&h->lock, 1))
+ while (clib_atomic_test_and_set (&h->lock))
;
h->owner_pid = my_pid;
always_inline void
ssvm_lock_non_recursive (ssvm_shared_header_t * h, u32 tag)
{
- while (__sync_lock_test_and_set (&h->lock, 1))
+ while (clib_atomic_test_and_set (&h->lock))
;
h->tag = tag;
clib_mem_set_heap (oldheap);
}
+static inline void *
+ssvm_mem_alloc (ssvm_private_t * ssvm, uword size)
+{
+ u8 *oldheap;
+ void *rv;
+
+ oldheap = clib_mem_set_heap (ssvm->sh->heap);
+ rv = clib_mem_alloc (size);
+ clib_mem_set_heap (oldheap);
+ return (rv);
+}
+
#define foreach_ssvm_api_error \
_(NO_NAME, "No shared segment name", -100) \
_(NO_SIZE, "Size not set (master)", -101) \
#define SSVM_API_ERROR_NO_NAME (-10)
-int ssvm_master_init (ssvm_private_t * ssvm, u32 master_index);
-int ssvm_slave_init (ssvm_private_t * ssvm, int timeout_in_seconds);
+int ssvm_master_init (ssvm_private_t * ssvm, ssvm_segment_type_t type);
+int ssvm_slave_init (ssvm_private_t * ssvm, ssvm_segment_type_t type);
void ssvm_delete (ssvm_private_t * ssvm);
+int ssvm_master_init_shm (ssvm_private_t * ssvm);
+int ssvm_slave_init_shm (ssvm_private_t * ssvm);
+void ssvm_delete_shm (ssvm_private_t * ssvm);
+
+int ssvm_master_init_memfd (ssvm_private_t * memfd);
+int ssvm_slave_init_memfd (ssvm_private_t * memfd);
+void ssvm_delete_memfd (ssvm_private_t * memfd);
+
+int ssvm_master_init_private (ssvm_private_t * ssvm);
+int ssvm_slave_init_private (ssvm_private_t * ssvm);
+void ssvm_delete_private (ssvm_private_t * ssvm);
+
+ssvm_segment_type_t ssvm_type (const ssvm_private_t * ssvm);
+u8 *ssvm_name (const ssvm_private_t * ssvm);
+
#endif /* __included_ssvm_h__ */
/*