This source file includes following definitions.
- mca_rcache_base_vma_module_construct
- mca_rcache_base_vma_module_destruct
- mca_rcache_base_vma_module_alloc
- mca_rcache_base_vma_find
- mca_rcache_base_vma_find_all
- mca_rcache_base_vma_insert
- mca_rcache_base_vma_delete
- mca_rcache_base_vma_iterate
- mca_rcache_base_vma_dump_range
- mca_rcache_base_vma_size
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 #include "opal_config.h"
28
29 #include MCA_memory_IMPLEMENTATION_HEADER
30 #include "opal/mca/memory/memory.h"
31 #include "opal/mca/rcache/rcache.h"
32 #include "rcache_base_vma.h"
33 #include "rcache_base_vma_tree.h"
34 #include "opal/mca/rcache/base/base.h"
35
36
37
38
39
40 static void mca_rcache_base_vma_module_construct (mca_rcache_base_vma_module_t *vma_module) {
41 OBJ_CONSTRUCT(&vma_module->vma_lock, opal_recursive_mutex_t);
42 (void) mca_rcache_base_vma_tree_init (vma_module);
43 }
44
45 static void mca_rcache_base_vma_module_destruct (mca_rcache_base_vma_module_t *vma_module) {
46 OBJ_DESTRUCT(&vma_module->vma_lock);
47 mca_rcache_base_vma_tree_finalize (vma_module);
48 }
49
50 OBJ_CLASS_INSTANCE(mca_rcache_base_vma_module_t, opal_object_t,
51 mca_rcache_base_vma_module_construct,
52 mca_rcache_base_vma_module_destruct);
53
54 mca_rcache_base_vma_module_t *mca_rcache_base_vma_module_alloc (void)
55 {
56 return OBJ_NEW(mca_rcache_base_vma_module_t);
57 }
58
59 int mca_rcache_base_vma_find (mca_rcache_base_vma_module_t *vma_module, void *addr,
60 size_t size, mca_rcache_base_registration_t **reg)
61 {
62 int rc;
63 unsigned char *bound_addr;
64
65 if (size == 0) {
66 return OPAL_ERROR;
67 }
68
69 bound_addr = (unsigned char *) ((intptr_t) addr + size - 1);
70
71
72 if (OPAL_UNLIKELY(opal_memory_changed() &&
73 NULL != opal_memory->memoryc_process &&
74 OPAL_SUCCESS != (rc = opal_memory->memoryc_process()))) {
75 return rc;
76 }
77
78 *reg = mca_rcache_base_vma_tree_find (vma_module, (unsigned char *) addr, bound_addr);
79
80 return OPAL_SUCCESS;
81 }
82
83 int mca_rcache_base_vma_find_all (mca_rcache_base_vma_module_t *vma_module, void *addr,
84 size_t size, mca_rcache_base_registration_t **regs,
85 int reg_cnt)
86 {
87 int rc;
88 unsigned char *bound_addr;
89
90 if(size == 0) {
91 return OPAL_ERROR;
92 }
93
94 bound_addr = (unsigned char *) ((intptr_t) addr + size - 1);
95
96
97 if (OPAL_UNLIKELY(opal_memory_changed() &&
98 NULL != opal_memory->memoryc_process &&
99 OPAL_SUCCESS != (rc = opal_memory->memoryc_process()))) {
100 return rc;
101 }
102
103 return mca_rcache_base_vma_tree_find_all (vma_module, (unsigned char *) addr,
104 bound_addr, regs, reg_cnt);
105 }
106
107 int mca_rcache_base_vma_insert (mca_rcache_base_vma_module_t *vma_module,
108 mca_rcache_base_registration_t *reg, size_t limit)
109 {
110 size_t reg_size = reg->bound - reg->base + 1;
111 int rc;
112
113 if (limit != 0 && reg_size > limit) {
114
115
116 return OPAL_ERR_OUT_OF_RESOURCE;
117 }
118
119
120 if (OPAL_UNLIKELY(opal_memory_changed() &&
121 NULL != opal_memory->memoryc_process &&
122 OPAL_SUCCESS != (rc = opal_memory->memoryc_process()))) {
123 return rc;
124 }
125
126 rc = mca_rcache_base_vma_tree_insert (vma_module, reg, limit);
127 if (OPAL_LIKELY(OPAL_SUCCESS == rc)) {
128
129
130 opal_memory->memoryc_register (reg->base, (uint64_t) reg_size,
131 (uint64_t) (uintptr_t) reg);
132 }
133
134 return rc;
135 }
136
137 int mca_rcache_base_vma_delete (mca_rcache_base_vma_module_t *vma_module,
138 mca_rcache_base_registration_t *reg)
139 {
140
141
142 opal_memory->memoryc_deregister (reg->base,
143 (uint64_t) (reg->bound - reg->base),
144 (uint64_t) (uintptr_t) reg);
145 return mca_rcache_base_vma_tree_delete (vma_module, reg);
146 }
147
148 int mca_rcache_base_vma_iterate (mca_rcache_base_vma_module_t *vma_module,
149 unsigned char *base, size_t size, bool partial_ok,
150 int (*callback_fn) (struct mca_rcache_base_registration_t *, void *),
151 void *ctx)
152 {
153 return mca_rcache_base_vma_tree_iterate (vma_module, base, size, partial_ok, callback_fn, ctx);
154 }
155
156 void mca_rcache_base_vma_dump_range (mca_rcache_base_vma_module_t *vma_module,
157 unsigned char *base, size_t size, char *msg)
158 {
159 mca_rcache_base_vma_tree_dump_range (vma_module, base, size, msg);
160 }
161
162 size_t mca_rcache_base_vma_size (mca_rcache_base_vma_module_t *vma_module)
163 {
164 return mca_rcache_base_vma_tree_size (vma_module);
165 }