svm: refactor memfd and remove ssvm_eth
[vpp.git] / src / svm / ssvm.h
index 9e61b9a..0295e30 100644 (file)
 #include <vppinfra/heap.h>
 #include <vppinfra/pool.h>
 #include <vppinfra/format.h>
+#include <vppinfra/linux/syscall.h>
+
+#ifndef MMAP_PAGESIZE
+#define MMAP_PAGESIZE (clib_mem_get_page_size())
+#endif
 
-#define MMAP_PAGESIZE (4<<10)
 #define SSVM_N_OPAQUE 7
 
 typedef struct
@@ -73,12 +77,12 @@ 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;
+
+  /* Needed by memfd segments */
+  int fd;
 } ssvm_private_t;
 
 always_inline void
@@ -98,6 +102,15 @@ ssvm_lock (ssvm_shared_header_t * h, u32 my_pid, u32 tag)
   h->tag = tag;
 }
 
+always_inline void
+ssvm_lock_non_recursive (ssvm_shared_header_t * h, u32 tag)
+{
+  while (__sync_lock_test_and_set (&h->lock, 1))
+    ;
+
+  h->tag = tag;
+}
+
 always_inline void
 ssvm_unlock (ssvm_shared_header_t * h)
 {
@@ -110,6 +123,14 @@ ssvm_unlock (ssvm_shared_header_t * h)
     }
 }
 
+always_inline void
+ssvm_unlock_non_recursive (ssvm_shared_header_t * h)
+{
+  h->tag = 0;
+  CLIB_MEMORY_BARRIER ();
+  h->lock = 0;
+}
+
 static inline void *
 ssvm_push_heap (ssvm_shared_header_t * sh)
 {
@@ -125,12 +146,12 @@ ssvm_pop_heap (void *oldheap)
 }
 
 #define foreach_ssvm_api_error                  \
-_(NO_NAME, "No shared segment name", -10      \
-_(NO_SIZE, "Size not set (master)", -11)        \
-_(CREATE_FAILURE, "Create failed", -12)                \
-_(SET_SIZE, "Set size failed", -13)            \
-_(MMAP, "mmap failed", -14)                    \
-_(SLAVE_TIMEOUT, "Slave map timeout", -15)
+_(NO_NAME, "No shared segment name", -100)      \
+_(NO_SIZE, "Size not set (master)", -101)       \
+_(CREATE_FAILURE, "Create failed", -102)        \
+_(SET_SIZE, "Set size failed", -103)           \
+_(MMAP, "mmap failed", -104)                   \
+_(SLAVE_TIMEOUT, "Slave map timeout", -105)
 
 typedef enum
 {
@@ -143,6 +164,25 @@ typedef enum
 
 int ssvm_master_init (ssvm_private_t * ssvm, u32 master_index);
 int ssvm_slave_init (ssvm_private_t * ssvm, int timeout_in_seconds);
+void ssvm_delete (ssvm_private_t * ssvm);
+
+int ssvm_master_init_memfd (ssvm_private_t * memfd, u32 master_index);
+int ssvm_slave_init_memfd (ssvm_private_t * memfd);
+void memfd_delete (ssvm_private_t * memfd);
+
+/* These do not belong here, but the original keeps running around... */
+/* $$$$ work w/ Damjan to fix properly */
+#ifndef F_LINUX_SPECIFIC_BASE
+#define F_LINUX_SPECIFIC_BASE 1024
+#endif
+#define MFD_ALLOW_SEALING       0x0002U
+#define F_ADD_SEALS (F_LINUX_SPECIFIC_BASE + 9)
+#define F_GET_SEALS (F_LINUX_SPECIFIC_BASE + 10)
+
+#define F_SEAL_SEAL     0x0001 /* prevent further seals from being set */
+#define F_SEAL_SHRINK   0x0002 /* prevent file from shrinking */
+#define F_SEAL_GROW     0x0004 /* prevent file from growing */
+#define F_SEAL_WRITE    0x0008 /* prevent writes */
 
 #endif /* __included_ssvm_h__ */