|
FD.io VPP
v21.06-3-gbb25fbf28
Vector Packet Processing
|
Go to the documentation of this file.
23 #include <sys/types.h>
26 #include <netinet/in.h>
63 #ifdef CLIB_SANITIZE_ADDR
64 return 0x200000000000;
76 if ((fd = open (
"/proc/self/maps", 0)) < 0)
91 if (bits >= 36 && bits <= 48)
98 return 0x130000000ULL;
104 pthread_mutex_lock (&rp->
mutex);
141 pthread_mutex_unlock (&rp->
mutex);
155 s =
format (s,
"NODATA ");
167 if (
size >= (1 << 20))
171 else if (
size >= (1 << 10))
186 int verbose = va_arg (*args,
int);
190 s =
format (s,
"%s: base va 0x%x size 0x%x %U\n",
193 s =
format (s,
" user_ctx 0x%x, bitmap_size %d\n",
201 " region_heap 0x%x data_base 0x%x data_heap 0x%x\n",
216 s =
format (s,
" VM in use: ");
236 s =
format (s,
" 0x%x - 0x%x (%dk)\n",
lo,
hi,
271 (
a->pvt_heap_size ?
a->pvt_heap_size :
278 fd = open (
a->backing_file, O_RDWR | O_CREAT, 0777);
286 if (fstat (fd, &statb) < 0)
293 if (statb.st_mode & S_IFREG)
295 if (statb.st_size == 0)
297 if (lseek (fd, map_size, SEEK_SET) == (off_t) - 1)
303 if (write (fd, &junk, 1) != 1)
317 map_size =
a->backing_mmap_size;
320 ASSERT (map_size <= rp->virtual_size -
323 if (mmap (rp->
data_base, map_size, PROT_READ | PROT_WRITE,
324 MAP_SHARED | MAP_FIXED, fd, 0) == MAP_FAILED)
361 fd = open (
a->backing_file, O_RDWR, 0777);
369 if (fstat (fd, &statb) < 0)
376 if (statb.st_mode & S_IFREG)
378 if (statb.st_size == 0)
380 if (lseek (fd, map_size, SEEK_SET) == (off_t) - 1)
386 if (write (fd, &junk, 1) != 1)
400 map_size =
a->backing_mmap_size;
403 ASSERT (map_size <= rp->virtual_size
408 if (mmap (rp->
data_base, map_size, PROT_READ | PROT_WRITE,
409 MAP_SHARED | MAP_FIXED, fd, 0) == MAP_FAILED)
425 int root_path_offset = 0;
431 if (
a->root_path[0] ==
'/')
434 if (
a->name[0] ==
'/')
437 shm_name =
format (0,
"/%s-%s%c", &
a->root_path[root_path_offset],
438 &
a->name[name_offset], 0);
441 shm_name =
format (0,
"%s%c",
a->name, 0);
448 pthread_mutexattr_t attr;
449 pthread_condattr_t cattr;
450 int nbits, words, bit;
459 if (pthread_mutexattr_init (&attr))
462 if (pthread_mutexattr_setpshared (&attr, PTHREAD_PROCESS_SHARED))
465 if (pthread_mutex_init (&rp->
mutex, &attr))
468 if (pthread_mutexattr_destroy (&attr))
471 if (pthread_condattr_init (&cattr))
474 if (pthread_condattr_setpshared (&cattr, PTHREAD_PROCESS_SHARED))
477 if (pthread_cond_init (&rp->
condvar, &cattr))
480 if (pthread_condattr_destroy (&cattr))
522 while (overhead_space > 0);
558 int pid_holding_region_lock;
560 int dead_region_recovery = 0;
563 struct timespec ts, tsrem;
572 getpid (),
a->name, shm_name);
574 svm_fd = shm_open ((
char *) shm_name, O_RDWR | O_CREAT | O_EXCL, 0777);
578 if (fchmod (svm_fd, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP) < 0)
581 if (fchown (svm_fd,
a->uid,
a->gid) < 0)
586 if (lseek (svm_fd,
a->size, SEEK_SET) == (off_t) - 1)
592 if (write (svm_fd, &junk, 1) != 1)
600 PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, svm_fd, 0);
613 return ((
void *) rp);
617 svm_fd = shm_open ((
char *) shm_name, O_RDWR, 0777);
623 perror (
"svm_region_map(mmap open)");
628 if (fchown (svm_fd,
a->uid,
a->gid) < 0)
634 if (0 != fstat (svm_fd, &stat))
640 if (stat.st_size > 0)
646 clib_warning (
"waiting for resize of shm file timed out");
651 ts.tv_nsec = 100000000;
652 while (nanosleep (&ts, &tsrem) < 0)
658 PROT_READ | PROT_WRITE, MAP_SHARED, svm_fd, 0);
673 while (rp->
version == 0 && deadman++ < 5)
685 munmap (rp,
a->size);
694 PROT_READ | PROT_WRITE,
695 MAP_SHARED | MAP_FIXED, svm_fd, 0);
717 if (pid_holding_region_lock && kill (pid_holding_region_lock, 0) < 0)
719 pthread_mutexattr_t attr;
721 (
"region %s mutex held by dead pid %d, tag %d, force unlock",
724 if (pthread_mutexattr_init (&attr))
726 if (pthread_mutexattr_setpshared (&attr, PTHREAD_PROCESS_SHARED))
728 if (pthread_mutex_init (&rp->
mutex, &attr))
730 dead_region_recovery = 1;
733 if (dead_region_recovery)
740 if (dead_region_recovery)
749 if (dead_region_recovery)
756 return ((
void *) rp);
777 uword randomize_baseva;
793 a->baseva += randomize_baseva;
847 a->root_path = root_path;
864 a->root_path = root_path;
906 if (
a->root_path == NULL)
938 for (
i = 0;
i < (need_nbits - 1);
i++)
951 while (index < root_rp->bitmap_size);
956 clib_warning (
"region %s: not enough VM to allocate 0x%llx (%lld)",
970 for (
i = 0;
i < need_nbits;
i++)
1011 clib_warning (
"[%d] shm_unlink (%s)", getpid (), shm_name);
1012 shm_unlink ((
const char *) shm_name);
1027 int i, mypid = getpid ();
1030 uword virtual_base, virtual_size;
1074 if (nclients_left == 0)
1098 for (
i = 0;
i < nbits;
i++)
1132 munmap ((
void *) virtual_base, virtual_size);
1141 munmap ((
void *) virtual_base, virtual_size);
1163 int i, mypid = getpid ();
1164 uword virtual_base, virtual_size;
1208 munmap ((
void *) virtual_base, virtual_size);
1227 int mypid = getpid ();
1263 int mypid = getpid ();
1307 a->root_path = root_path;
1308 a->name = (
char *) svm_names[
i];
1312 pthread_mutex_lock (&rp->
mutex);
1316 pthread_mutex_unlock (&rp->
mutex);
#define SVM_GLOBAL_REGION_SIZE
#define SVM_FLAGS_NEED_DATA_INIT
void svm_region_exit(void)
static void region_unlock(svm_region_t *rp)
static int svm_region_init_internal(svm_map_region_args_t *a)
svm_region_t * svm_get_root_rp(void)
void svm_region_unlink(svm_region_t *rp)
void svm_region_unmap_client(void *rp_arg)
#define vec_c_string_is_terminated(V)
Test whether a vector is a NULL terminated c-string.
void svm_region_exit_client(void)
void svm_region_init(void)
int svm_region_init_chroot(const char *root_path)
#define count_leading_zeros(x)
void svm_region_unmap(void *rp_arg)
#define pool_put(P, E)
Free an object E in pool P.
#define vec_delete(V, N, M)
Delete N elements starting at element M.
#define hash_create_string(elts, value_bytes)
void * svm_map_region(svm_map_region_args_t *a)
void svm_region_init_chroot_uid_gid(const char *root_path, int uid, int gid)
static u64 rnd_pagesize(u64 size)
static u8 * format_svm_size(u8 *s, va_list *args)
#define clib_unix_warning(format, args...)
void svm_region_init_args(svm_map_region_args_t *a)
void svm_region_init_mapped_region(svm_map_region_args_t *a, svm_region_t *rp)
#define pool_foreach(VAR, POOL)
Iterate through pool.
clib_mem_heap_t * clib_mem_create_heap(void *base, uword size, int is_locked, char *fmt,...)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
void * svm_region_find_or_create(svm_map_region_args_t *a)
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
#define vec_dup(V)
Return copy of vector (no header, no alignment)
#define clib_unix_error(format, args...)
f64 end
end of the time range
if(node->flags &VLIB_NODE_FLAG_TRACE) vnet_interface_output_trace(vm
static void svm_pop_heap(void *oldheap)
#define hash_set_mem(h, key, value)
svm_subregion_t * subregions
Fixed length block allocator. Pools are built from clib vectors and bitmaps. Use pools when repeatedl...
sll srl srl sll sra u16x4 i
#define pool_get(P, E)
Allocate an object E from a pool P (unspecified alignment).
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment)
#define CLIB_MEMORY_BARRIER()
static int root_rp_refcount
static uword clib_bitmap_get_no_check(uword *ai, uword i)
Gets the ith bit value from a bitmap Does not sanity-check the bit position.
#define vec_free(V)
Free vector's memory (no header).
static svm_region_t * root_rp
static void svm_region_exit_internal(u8 is_client)
#define hash_get_mem(h, key)
u64 svm_get_global_region_base_va()
static int svm_data_region_create(svm_map_region_args_t *a, svm_region_t *rp)
static u8 * format_svm_flags(u8 *s, va_list *args)
description fragment has unexpected format
void svm_client_scan_this_region_nolock(svm_region_t *rp)
#define CLIB_MEM_UNPOISON(a, s)
u8 * format_svm_region(u8 *s, va_list *args)
static void region_lock(svm_region_t *rp, int tag)
static void * svm_push_pvt_heap(svm_region_t *rp)
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
static void svm_mutex_cleanup(void)
#define SVM_GLOBAL_REGION_NAME
#define hash_unset_mem(h, key)
#define uword_to_pointer(u, type)
void svm_client_scan(const char *root_path)
#define SVM_PVT_MHEAP_SIZE
#define clib_warning(format, args...)
static pthread_mutex_t * mutexes_held[MAXLOCK]
void svm_region_unmap_internal(void *rp_arg, u8 is_client)
static uword clib_bitmap_set_no_check(uword *a, uword i, uword new_value)
Sets the ith bit of a bitmap to new_value.
static u64 clib_cpu_time_now(void)
u8 * shm_name_from_svm_map_region_args(svm_map_region_args_t *a)
#define vec_bytes(v)
Number of data bytes in vector.
static int svm_data_region_map(svm_map_region_args_t *a, svm_region_t *rp)