Arax -8d09c51940345c86062e8ef2427c705ae66e5926
A Runtime Framework for Decoupling Applications from Heterogeneous Accelerators
Loading...
Searching...
No Matches
arax_pipe.c
Go to the documentation of this file.
1#include <arax_pipe.h>
2#include <stdio.h>
3#include <string.h>
4
5arax_pipe_s* arax_pipe_init(void *mem, size_t size, int enforce_version)
6{
7 arax_pipe_s *pipe = mem;
8 uint64_t value;
9
10 value = arax_pipe_add_process(pipe);
11
12 if (value) { // Not first so assume initialized
13 while (!pipe->sha[0]);
14 if (strcmp(pipe->sha, ARAX_GIT_REV)) {
15 fprintf(stderr, "Arax revision mismatch(%s vs %s)!", ARAX_GIT_REV, pipe->sha);
16 if (enforce_version)
17 return 0;
18 }
20 return pipe;
21 }
22
23 printf("Initializing pipe.\n");
24
25 pipe->shm_size = size;
26
30 snprintf(pipe->sha + 1, ARAX_PIPE_SHA_SIZE - 1, "%s", &ARAX_GIT_REV[1]);
31 pipe->sha[0] = ARAX_GIT_REV[0];
32
33 arax_object_repo_init(&(pipe->objs), pipe);
34
35 size -= sizeof(*pipe); // Subtract header size
36
37 if (arch_alloc_init_once(&(pipe->allocator), size))
38 return 0;
39
40 if (!utils_list_init(&(pipe->orphan_vacs)) )
41 return 0;
42
43 async_meta_init_once(&(pipe->async), &(pipe->allocator) );
44
46
47 async_condition_init(&(pipe->async), &(pipe->orphan_cond));
48
49 arax_throttle_init(&(pipe->async), &(pipe->throttle), size, size);
50
51 utils_kv_init(&(pipe->ass_kv));
52
53 utils_kv_init(&(pipe->metrics_kv));
54
55 return pipe;
56} /* arax_pipe_init */
57
59{
60 return pipe->sha;
61}
62
72
74{
75 return pipe->orphan_vacs.length;
76}
77
79{
80 arax_vaccel_s *vac = 0;
81
83
86
88
90
91 if (lvac) {
92 vac = lvac->owner;
94 arax_assert(vac->phys == 0);
95 }
96
97 return vac;
98}
99
108
115
117{
118 return __sync_fetch_and_add(&(pipe->processes), 1);
119}
120
122{
123 return __sync_fetch_and_add(&(pipe->processes), -1);
124}
125
127{
128 arax_assert(pid); // Pid cant be 0
129 int have_to_mmap = 1;
130 int c;
131
133 for (c = 0; c < ARAX_PROC_MAP_SIZE; c++) {
134 if (pipe->proc_map[c] == pid) {
135 have_to_mmap = 0; // Already mmaped
136 break;
137 }
138
139 if (!pipe->proc_map[c]) { // Reached an unused cell
140 pipe->proc_map[c] = pid; // Register new pid
141 break;
142 }
143 }
145 return have_to_mmap;
146}
147
149{
150 arax_assert(pid); // Pid cant be 0
151 int c;
152
154 for (c = 0; c < ARAX_PROC_MAP_SIZE; c++) {
155 if (pipe->proc_map[c] == pid) // Found PID location
156 break;
157 }
158 arax_assert(c < ARAX_PROC_MAP_SIZE); // pid should be in the proc_map
159 // Skip cell containing pid
160 memmove(pipe->proc_map + c, pipe->proc_map + (c + 1), ARAX_PROC_MAP_SIZE - (c + 1));
161 pipe->proc_map[ARAX_PROC_MAP_SIZE - 1] = 0;
163}
164
166{
167 int value = __sync_bool_compare_and_swap(&(pipe->self), 0, pipe);
168
169 if (value)
170 return pipe;
171 else
172 return pipe->self;
173}
174
176{
178 utils_list_s *list;
179 arax_accel_s *accel_in_list = 0;
180
182 utils_list_for_each(*list, itr){
183 accel_in_list = (arax_accel_s *) itr->owner;
184 if (accel == accel_in_list) {
186 arax_object_ref_dec(&(accel->obj));
187 return 0;
188 }
189 }
191 return 1;
192}
193
196{
198 utils_list_s *list;
199 arax_accel_s *accel = 0;
200
202 utils_list_for_each(*list, itr){
203 accel = (arax_accel_s *) itr->owner;
204 if (type && (type != accel->type) )
205 continue;
206 if (!name ||
207 (strcmp(name, arax_accel_get_name(accel) ) == 0) )
208 {
211 return accel;
212 }
213 }
214 accel = 0;
216 return accel;
217}
218
220{
222 utils_list_s *list;
223 arax_proc_s *proc;
224
225 list = arax_object_list_lock(&(pipe->objs), ARAX_TYPE_PROC);
226 utils_list_for_each(*list, itr){
227 proc = (arax_proc_s *) itr->owner;
228 if (strcmp(name, proc->obj.name) == 0) {
230 return proc;
231 }
232 }
233 proc = 0;
235 return proc;
236}
237
242{
243 int ret = arax_pipe_del_process(pipe) == 1;
244
245 if (ret) { // Last user
246 arax_object_repo_exit(&(pipe->objs));
247 async_meta_exit(&(pipe->async) );
248 arch_alloc_exit(&(pipe->allocator) );
249 }
250 return ret;
251}
252
257
258
263
264
270
272{
273 arax_assert(pipe);
275}
#define ARAX_PIPE_THOTTLE_DEBUG_FUNC(FUNC)
Definition arax_pipe.h:218
#define ARAX_PIPE_SHA_SIZE
Definition arax_pipe.h:19
#define ARAX_PIPE_THOTTLE_DEBUG_PARAMS
Definition arax_pipe.h:217
struct arax_pipe arax_pipe_s
enum arax_accel_type arax_accel_type_e
int arch_alloc_init_once(arch_alloc_s *alloc, size_t size)
void arch_alloc_init_always(arch_alloc_s *alloc)
void arch_alloc_exit(arch_alloc_s *alloc)
#define arax_assert(EXPR)
Definition arax_assert.h:7
#define arax_assert_obj(OBJ, TYPE)
Definition arax_assert.h:12
struct utils_list_node utils_list_node_s
#define utils_list_for_each(list, itr)
Definition list.h:96
@ ARAX_TYPE_VIRT_ACCEL
Definition arax_object.h:17
@ ARAX_TYPE_PROC
Definition arax_object.h:18
@ ARAX_TYPE_PHYS_ACCEL
Definition arax_object.h:16
void async_condition_wait(async_condition_s *cond)
void async_condition_unlock(async_condition_s *cond)
void async_condition_notify(async_condition_s *cond)
void async_meta_init_once(async_meta_s *meta, arch_alloc_s *alloc)
void async_condition_init(async_meta_s *meta, async_condition_s *cond)
void async_condition_lock(async_condition_s *cond)
void async_meta_exit(async_meta_s *meta)
const char * arax_accel_get_name(arax_accel_s *accel)
Definition arax_accel.c:83
int arax_object_repo_exit(arax_object_repo_s *repo)
Definition arax_object.c:71
void arax_object_repo_init(arax_object_repo_s *repo, arax_pipe_s *pipe)
Definition arax_object.c:60
utils_list_s * arax_object_list_lock(arax_object_repo_s *repo, arax_object_type_e type)
void arax_object_list_unlock(arax_object_repo_s *repo, arax_object_type_e type)
int arax_object_ref_dec(arax_object_s *obj)
int arax_pipe_have_orphan_vaccels(arax_pipe_s *pipe)
Definition arax_pipe.c:73
arax_proc_s * arax_pipe_find_proc(arax_pipe_s *pipe, const char *name)
Definition arax_pipe.c:219
int arax_pipe_have_to_mmap(arax_pipe_s *pipe, int pid)
Definition arax_pipe.c:126
const char * arax_pipe_get_revision(arax_pipe_s *pipe)
Definition arax_pipe.c:58
size_t arax_pipe_get_total_size(arax_pipe_s *pipe)
Definition arax_pipe.c:271
uint64_t arax_pipe_add_process(arax_pipe_s *pipe)
Definition arax_pipe.c:116
void arax_pipe_orphan_stop(arax_pipe_s *pipe)
Definition arax_pipe.c:109
void ARAX_PIPE_THOTTLE_DEBUG_FUNC arax_pipe_size_dec(arax_pipe_s *pipe, size_t sz ARAX_PIPE_THOTTLE_DEBUG_PARAMS)
Definition arax_pipe.c:259
int arax_pipe_exit(arax_pipe_s *pipe)
Definition arax_pipe.c:241
void arax_pipe_mark_unmap(arax_pipe_s *pipe, int pid)
Definition arax_pipe.c:148
void * arax_pipe_mmap_address(arax_pipe_s *pipe)
Definition arax_pipe.c:165
arax_vaccel_s * arax_pipe_get_orphan_vaccel(arax_pipe_s *pipe)
Definition arax_pipe.c:78
size_t arax_pipe_get_available_size(arax_pipe_s *pipe)
Definition arax_pipe.c:265
void ARAX_PIPE_THOTTLE_DEBUG_FUNC arax_pipe_size_inc(arax_pipe_s *pipe, size_t sz ARAX_PIPE_THOTTLE_DEBUG_PARAMS)
Definition arax_pipe.c:253
int arax_pipe_delete_accel(arax_pipe_s *pipe, arax_accel_s *accel)
Definition arax_pipe.c:175
void arax_pipe_add_orphan_vaccel(arax_pipe_s *pipe, arax_vaccel_s *vac)
Definition arax_pipe.c:63
void arax_pipe_remove_orphan_vaccel(arax_pipe_s *pipe, arax_vaccel_s *vac)
Definition arax_pipe.c:100
arax_pipe_s * arax_pipe_init(void *mem, size_t size, int enforce_version)
Definition arax_pipe.c:5
arax_accel_s * arax_pipe_find_accel(arax_pipe_s *pipe, const char *name, arax_accel_type_e type)
Definition arax_pipe.c:194
uint64_t arax_pipe_del_process(arax_pipe_s *pipe)
Definition arax_pipe.c:121
size_t arax_throttle_get_available_size(arax_throttle_s *thr)
void ARAX_THROTTLE_DEBUG_FUNC arax_throttle_size_dec(arax_throttle_s *thr, size_t sz ARAX_THROTTLE_DEBUG_PARAMS)
void ARAX_THROTTLE_DEBUG_FUNC arax_throttle_size_inc(arax_throttle_s *thr, size_t sz ARAX_THROTTLE_DEBUG_PARAMS)
void arax_throttle_init(async_meta_s *meta, arax_throttle_s *thr, size_t a_sz, size_t t_sz)
size_t arax_throttle_get_total_size(arax_throttle_s *thr)
utils_list_node_s * utils_list_del(utils_list_s *list, utils_list_node_s *node)
Definition list.c:26
utils_list_node_s * utils_list_pop_head(utils_list_s *list)
Definition list.c:36
int utils_list_node_linked(utils_list_node_s *node)
Definition list.c:81
utils_list_s * utils_list_init(void *mem)
Definition list.c:3
void utils_list_add(utils_list_s *list, utils_list_node_s *node)
Definition list.c:20
#define utils_spinlock_lock(V)
Definition queue.c:35
#define utils_spinlock_unlock(V)
Definition queue.c:36
void utils_kv_init(utils_kv_s *kv)
Definition Kv.c:5
arax_object_s obj
Definition arax_accel.h:16
arax_accel_type_e type
Definition arax_accel.h:17
arax_object_s obj
Definition arax_proc.h:17
arax_accel_s * phys
Definition arax_vaccel.h:38
utils_list_node_s vaccels
Definition arax_vaccel.h:35
void * owner
Definition list.h:14
size_t length
Definition list.h:19
utils_list_s orphan_vacs
Definition arax_pipe.h:41
async_condition_s orphan_cond
Definition arax_pipe.h:40
arax_throttle_s throttle
Definition arax_pipe.h:35
uint64_t processes
Definition arax_pipe.h:29
uint64_t shm_size
Definition arax_pipe.h:28
arch_alloc_s allocator
Definition arax_pipe.h:46
uint64_t proc_map[ARAX_PROC_MAP_SIZE]
Definition arax_pipe.h:31
utils_spinlock proc_lock
Definition arax_pipe.h:30
char sha[ARAX_PIPE_SHA_SIZE+1]
Definition arax_pipe.h:26
utils_kv_s ass_kv
Definition arax_pipe.h:43
async_meta_s async
Definition arax_pipe.h:34
async_condition_s cntrl_ready_cond
Definition arax_pipe.h:38
void * self
Definition arax_pipe.h:27
utils_kv_s metrics_kv
Definition arax_pipe.h:44
arax_object_repo_s objs
Definition arax_pipe.h:33