+ a->h = h;
+ a->name = name;
+ a->nbuckets = nbuckets;
+ a->memory_size = memory_size;
+
+ BV (clib_bihash_init2) (a);
+}
+
+#if BIHASH_32_64_SVM
+#if !defined (MFD_ALLOW_SEALING)
+#define MFD_ALLOW_SEALING 0x0002U
+#endif
+
+void BV (clib_bihash_master_init_svm)
+ (BVT (clib_bihash) * h, char *name, u32 nbuckets, u64 memory_size)
+{
+ uword bucket_size;
+ u8 *mmap_addr;
+ vec_header_t *freelist_vh;
+ int fd;
+
+ ASSERT (memory_size < (1ULL << 32));
+ /* Set up for memfd sharing */
+ if ((fd = memfd_create (name, MFD_ALLOW_SEALING)) == -1)
+ {
+ clib_unix_warning ("memfd_create");
+ return;
+ }
+
+ if (ftruncate (fd, memory_size) < 0)
+ {
+ clib_unix_warning ("ftruncate");
+ return;
+ }
+
+ /* Not mission-critical, complain and continue */
+ if ((fcntl (fd, F_ADD_SEALS, F_SEAL_SHRINK)) == -1)
+ clib_unix_warning ("fcntl (F_ADD_SEALS)");
+
+ mmap_addr = mmap (0, memory_size,
+ PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 /* offset */ );
+
+ if (mmap_addr == MAP_FAILED)
+ {
+ clib_unix_warning ("mmap failed");
+ ASSERT (0);
+ }
+
+ h->sh = (void *) mmap_addr;
+ h->memfd = fd;
+ nbuckets = 1 << (max_log2 (nbuckets));
+
+ h->name = (u8 *) name;
+ h->sh->nbuckets = h->nbuckets = nbuckets;
+ h->log2_nbuckets = max_log2 (nbuckets);
+
+ alloc_arena (h) = (u64) (uword) mmap_addr;
+ alloc_arena_next (h) = CLIB_CACHE_LINE_BYTES;
+ alloc_arena_size (h) = memory_size;