1/*
2 *------------------------------------------------------------------
3 * svm.h - shared VM allocation, mmap(...MAP_FIXED...)
4 * 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#include <svm/svm_common.h>
28
29#define MMAP_PAGESIZE (clib_mem_get_page_size())
30
31static inline void *
32svm_mem_alloc (svm_region_t * rp, uword size)
33{
34  u8 *oldheap;
35  ASSERT (rp->flags & SVM_FLAGS_MHEAP);
36  u8 *rv;
37
38  pthread_mutex_lock (&rp->mutex);
39  oldheap = clib_mem_set_heap (rp->data_heap);
40  rv = clib_mem_alloc (size);
41  clib_mem_set_heap (oldheap);
42  pthread_mutex_unlock (&rp->mutex);
43  return (rv);
44}
45
46static inline void *
47svm_mem_alloc_aligned_at_offset (svm_region_t * rp,
48				 uword size, uword align, uword offset)
49{
50  u8 *oldheap;
51  ASSERT (rp->flags & SVM_FLAGS_MHEAP);
52  u8 *rv;
53
54  pthread_mutex_lock (&rp->mutex);
55  oldheap = clib_mem_set_heap (rp->data_heap);
56  rv = clib_mem_alloc_aligned_at_offset (size, align, offset,
57					 1 /* yes, call os_out_of_memory */ );
58  clib_mem_set_heap (oldheap);
59  pthread_mutex_unlock (&rp->mutex);
60  return (rv);
61}
62
63static inline void
64svm_mem_free (svm_region_t * rp, void *ptr)
65{
66  u8 *oldheap;
67  ASSERT (rp->flags & SVM_FLAGS_MHEAP);
68
69  pthread_mutex_lock (&rp->mutex);
70  oldheap = clib_mem_set_heap (rp->data_heap);
71  clib_mem_free (ptr);
72  clib_mem_set_heap (oldheap);
73  pthread_mutex_unlock (&rp->mutex);
74
75}
76
77static inline void *
78svm_push_pvt_heap (svm_region_t * rp)
79{
80  u8 *oldheap;
81  oldheap = clib_mem_set_heap (rp->region_heap);
82  return ((void *) oldheap);
83}
84
85static inline void *
86svm_push_data_heap (svm_region_t * rp)
87{
88  u8 *oldheap;
89  oldheap = clib_mem_set_heap (rp->data_heap);
90  return ((void *) oldheap);
91}
92
93static inline void
94svm_pop_heap (void *oldheap)
95{
96  clib_mem_set_heap (oldheap);
97}
98
99#endif /* __included_svm_h__ */
100
101/*
102 * fd.io coding-style-patch-verification: ON
103 *
104 * Local Variables:
105 * eval: (c-set-style "gnu")
106 * End:
107 */
108