blob: 1682b7ad2fa828256e4ad7f54d9ff07410b944a8 [file] [log] [blame]
Dave Barach8a7fb0c2016-07-08 14:44:23 -04001/*
Ed Warnickecb9cada2015-12-08 15:45:58 -07002 *------------------------------------------------------------------
Dave Barach8a7fb0c2016-07-08 14:44:23 -04003 * svm.h - shared VM allocation, mmap(...MAP_FIXED...)
Ed Warnickecb9cada2015-12-08 15:45:58 -07004 * brain police
5 *
6 * Copyright (c) 2009 Cisco and/or its affiliates.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at:
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *------------------------------------------------------------------
19 */
20
21#ifndef __included_svm_h__
22#define __included_svm_h__
23
24#include <pthread.h>
25#include <vppinfra/clib.h>
26#include <vppinfra/mem.h>
27
Dave Barach95bb8832015-12-12 10:37:00 -050028#define MMAP_PAGESIZE (clib_mem_get_page_size())
Ed Warnickecb9cada2015-12-08 15:45:58 -070029
Dave Barach8a7fb0c2016-07-08 14:44:23 -040030#define SVM_VERSION ((1<<16) | 1) /* set to declare region ready. */
Ed Warnickecb9cada2015-12-08 15:45:58 -070031
Dave Barach8a7fb0c2016-07-08 14:44:23 -040032#define SVM_FLAGS_MHEAP (1<<0) /* region contains an mheap */
33#define SVM_FLAGS_FILE (1<<1) /* region backed by one or more files */
34#define SVM_FLAGS_NODATA (1<<2) /* region will be further subdivided */
35#define SVM_FLAGS_NEED_DATA_INIT (1<<3)
Ed Warnickecb9cada2015-12-08 15:45:58 -070036
Dave Barach8a7fb0c2016-07-08 14:44:23 -040037#define SVM_PVT_MHEAP_SIZE (128<<10) /* region's private mheap (128k) */
Ed Warnickecb9cada2015-12-08 15:45:58 -070038
Dave Barach8a7fb0c2016-07-08 14:44:23 -040039typedef struct svm_region_
40{
41 volatile uword version;
42 pthread_mutex_t mutex;
43 pthread_cond_t condvar;
44 int mutex_owner_pid; /* in case of trouble */
45 int mutex_owner_tag;
46 uword flags;
47 uword virtual_base; /* base of the region object */
48 uword virtual_size;
49 void *region_heap;
50 void *data_base; /* data portion base address */
51 void *data_heap; /* data heap, if any */
52 volatile void *user_ctx; /* user context pointer */
53 /* stuff allocated in the region's heap */
54 uword bitmap_size; /* nbits in virtual alloc bitmap */
55 uword *bitmap; /* the bitmap */
56 char *region_name;
57 char *backing_file;
58 char **filenames;
59 uword *client_pids;
60 /* pad */
Ed Warnickecb9cada2015-12-08 15:45:58 -070061
Dave Barach8a7fb0c2016-07-08 14:44:23 -040062 /* next page:
63 * (64K) clib heap for the region itself
64 *
65 * data_base -> whatever is in this region
66 */
Ed Warnickecb9cada2015-12-08 15:45:58 -070067
68} svm_region_t;
69
Dave Barach8a7fb0c2016-07-08 14:44:23 -040070typedef struct svm_map_region_args_
71{
72 char *root_path; /* NULL means use the truly global arena */
73 char *name;
74 uword baseva;
75 uword size;
76 uword flags;
77 char *backing_file;
78 uword backing_mmap_size;
79 /* uid, gid to own the svm region(s) */
80 int uid;
81 int gid;
Ed Warnickecb9cada2015-12-08 15:45:58 -070082} svm_map_region_args_t;
83
84
85/*
Dave Barach8a7fb0c2016-07-08 14:44:23 -040086 * Memory shared across all router instances. Packet buffers, etc
87 * Base should be "out of the way," and size should be big enough to
Ed Warnickecb9cada2015-12-08 15:45:58 -070088 * cover everything we plan to put here.
89 */
90#define SVM_GLOBAL_REGION_BASEVA 0x30000000
Dave Barach8a7fb0c2016-07-08 14:44:23 -040091#define SVM_GLOBAL_REGION_SIZE (64<<20)
Ed Warnickecb9cada2015-12-08 15:45:58 -070092#define SVM_GLOBAL_REGION_NAME "/global_vm"
93
94/*
Dave Barach8a7fb0c2016-07-08 14:44:23 -040095 * Memory shared across individual router instances.
Ed Warnickecb9cada2015-12-08 15:45:58 -070096 */
97#define SVM_OVERLAY_REGION_BASEVA \
98 (SVM_GLOBAL_REGION_BASEVA + SVM_GLOBAL_REGION_SIZE)
Dave Barach8a7fb0c2016-07-08 14:44:23 -040099#define SVM_OVERLAY_REGION_SIZE (1<<20)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700100#define SVM_OVERLAY_REGION_BASENAME "/overlay_vm"
101
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400102typedef struct
103{
104 u8 *subregion_name;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700105} svm_subregion_t;
106
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400107typedef struct
108{
109 svm_subregion_t *subregions; /* subregion pool */
110 uword *name_hash;
111 u8 *root_path;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700112} svm_main_region_t;
113
114
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400115void *svm_region_find_or_create (svm_map_region_args_t * a);
116void svm_region_init (void);
117void svm_region_init_chroot (char *root_path);
118void svm_region_init_chroot_uid_gid (char *root_path, int uid, int gid);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700119void svm_region_exit (void);
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400120void svm_region_unmap (void *rp_arg);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700121void svm_client_scan (char *root_path);
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400122void svm_client_scan_this_region_nolock (svm_region_t * rp);
123u8 *shm_name_from_svm_map_region_args (svm_map_region_args_t * a);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700124
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400125static inline void *
126svm_mem_alloc (svm_region_t * rp, uword size)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700127{
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400128 u8 *oldheap;
129 ASSERT (rp->flags & SVM_FLAGS_MHEAP);
130 u8 *rv;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700131
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400132 pthread_mutex_lock (&rp->mutex);
133 oldheap = clib_mem_set_heap (rp->data_heap);
134 rv = clib_mem_alloc (size);
135 clib_mem_set_heap (oldheap);
136 pthread_mutex_unlock (&rp->mutex);
137 return (rv);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700138}
139
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400140static inline void *
141svm_mem_alloc_aligned_at_offset (svm_region_t * rp,
142 uword size, uword align, uword offset)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700143{
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400144 u8 *oldheap;
145 ASSERT (rp->flags & SVM_FLAGS_MHEAP);
146 u8 *rv;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700147
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400148 pthread_mutex_lock (&rp->mutex);
149 oldheap = clib_mem_set_heap (rp->data_heap);
150 rv = clib_mem_alloc_aligned_at_offset (size, align, offset);
151 clib_mem_set_heap (oldheap);
152 pthread_mutex_unlock (&rp->mutex);
153 return (rv);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700154}
155
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400156static inline void
157svm_mem_free (svm_region_t * rp, void *ptr)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700158{
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400159 u8 *oldheap;
160 ASSERT (rp->flags & SVM_FLAGS_MHEAP);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700161
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400162 pthread_mutex_lock (&rp->mutex);
163 oldheap = clib_mem_set_heap (rp->data_heap);
164 clib_mem_free (ptr);
165 clib_mem_set_heap (oldheap);
166 pthread_mutex_unlock (&rp->mutex);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700167
168}
169
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400170static inline void *
171svm_push_pvt_heap (svm_region_t * rp)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700172{
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400173 u8 *oldheap;
174 oldheap = clib_mem_set_heap (rp->region_heap);
175 return ((void *) oldheap);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700176}
177
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400178static inline void *
179svm_push_data_heap (svm_region_t * rp)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700180{
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400181 u8 *oldheap;
182 oldheap = clib_mem_set_heap (rp->data_heap);
183 return ((void *) oldheap);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700184}
185
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400186static inline void
187svm_pop_heap (void *oldheap)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700188{
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400189 clib_mem_set_heap (oldheap);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700190}
191
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400192u8 *format_svm_region (u8 * s, va_list * args);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700193
194svm_region_t *svm_get_root_rp (void);
195
196#endif /* __included_svm_h__ */
Dave Barach8a7fb0c2016-07-08 14:44:23 -0400197
198/*
199 * fd.io coding-style-patch-verification: ON
200 *
201 * Local Variables:
202 * eval: (c-set-style "gnu")
203 * End:
204 */