Motr  M0
source_dock.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2017-2020 Seagate Technology LLC and/or its Affiliates
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * For any questions about this software or licensing,
18  * please email opensource@seagate.com or cortx-questions@seagate.com.
19  *
20  */
21 
22 
23 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_FDMI
24 #include "lib/trace.h"
25 
26 #include <unistd.h>
27 #include "lib/memory.h"
28 #include "fdmi/fdmi.h"
29 #include "fdmi/source_dock.h"
31 #include "fdmi/service.h"
32 
33 /* fdmi registered sources list declaration */
34 M0_TL_DESCR_DEFINE(fdmi_src_dock_src_list,
35  "fdmi src list",
36  M0_INTERNAL,
37  struct m0_fdmi_src_ctx,
38  fsc_linkage, fsc_magic,
41 
42 M0_TL_DEFINE(fdmi_src_dock_src_list, M0_INTERNAL, struct m0_fdmi_src_ctx);
43 
44 /*
45  * FDMI source records list declaration. This list keeps all records that are
46  * waiting for filter processing. When records are processed, they are removed
47  * from this list and added to the inflight list.
48  *
49  * NOTE. 'release' reply is handled in a different way, when release comes in
50  * the record is looked up in a different way. This list is only needed for
51  * record resend operations, not for release.
52  */
53 M0_TL_DESCR_DEFINE(fdmi_record_list, "fdmi rec list", M0_INTERNAL,
54  struct m0_fdmi_src_rec, fsr_linkage, fsr_magic,
57 
58 M0_TL_DEFINE(fdmi_record_list, M0_INTERNAL, struct m0_fdmi_src_rec);
59 
60 /*
61  * Inflight FDMI records. When records are processed, they are moved here.
62  * When 'release' is received, ths record is removed from this list.
63  *
64  * We have a timeout timer waking up the fom periodically, checking
65  * if any record in this list has not been acknowledged in a specified
66  * time. If yes, we have to give up (release refcount on it and let the
67  * dtx done). If not, resend it for processing.
68  */
69 M0_TL_DESCR_DEFINE(fdmi_record_inflight, "fdmi rec inflight", M0_INTERNAL,
70  struct m0_fdmi_src_rec, fsr_linkage, fsr_magic,
73 
74 M0_TL_DEFINE(fdmi_record_inflight, M0_INTERNAL, struct m0_fdmi_src_rec);
75 
76 /* Matched filters list declaration */
77 M0_TL_DESCR_DEFINE(fdmi_matched_filter_list, "fdmi matched filter list",
78  M0_INTERNAL, struct m0_conf_fdmi_filter,
79  ff_linkage, ff_magic,
82 
83 M0_TL_DEFINE(fdmi_matched_filter_list, M0_INTERNAL, struct m0_conf_fdmi_filter);
84 
85 M0_INTERNAL void m0_fdmi_source_dock_init(struct m0_fdmi_src_dock *src_dock)
86 {
87  M0_ENTRY();
88  M0_SET0(src_dock);
89  fdmi_src_dock_src_list_tlist_init(&src_dock->fsdc_src_list);
90  fdmi_record_list_tlist_init(&src_dock->fsdc_posted_rec_list);
91  fdmi_record_inflight_tlist_init(&src_dock->fsdc_rec_inflight);
92  m0_mutex_init(&src_dock->fsdc_list_mutex);
93  src_dock->fsdc_instance_id = 0;
94  M0_LEAVE();
95 }
96 
97 M0_INTERNAL void m0_fdmi_source_dock_fini(struct m0_fdmi_src_dock *src_dock)
98 {
99  struct m0_fdmi_src_ctx *src_ctx;
100 
101  M0_ENTRY();
102 
103  /* Deinitialize FDMI source dock instance */
104 
105  m0_tl_teardown(fdmi_src_dock_src_list,
106  &src_dock->fsdc_src_list, src_ctx) {
107  M0_ASSERT(src_ctx->fsc_registered == false);
108  m0_free(src_ctx);
109  }
110 
111  fdmi_src_dock_src_list_tlist_fini(&src_dock->fsdc_src_list);
112 
113  /* Posted record list is handled by FOM and should be empty here */
114  fdmi_record_list_tlist_fini(&src_dock->fsdc_posted_rec_list);
115  fdmi_record_inflight_tlist_fini(&src_dock->fsdc_rec_inflight);
116  m0_mutex_fini(&src_dock->fsdc_list_mutex);
117 
118  M0_LEAVE();
119 }
120 
121 M0_INTERNAL bool m0_fdmi__record_is_valid(struct m0_fdmi_src_rec *src_rec)
122 {
123  return _0C(src_rec != NULL) &&
124  _0C(src_rec->fsr_src != NULL) &&
125  _0C(src_rec->fsr_src_ctx != NULL) &&
127 }
128 
129 static void src_rec_free(struct m0_ref *ref)
130 {
131  struct m0_fdmi_src_rec *src_rec = M0_AMB(src_rec, ref, fsr_ref);
132 
133  M0_ENTRY("ref %p", ref);
135  M0_PRE(!fdmi_record_list_tlink_is_in(src_rec));
136 
137  M0_LOG(M0_DEBUG, "last ref dropped on fdmi rec id " U128X_F,
138  U128_P(&src_rec->fsr_rec_id));
139 
140  /* Finalize list and link. @src_rec is still alive. */
141  m0_fdmi__record_deinit(src_rec);
142 
150  m0_fdmi__fs_end(src_rec);
151 
152  M0_LEAVE();
153 }
154 
155 M0_INTERNAL void m0_fdmi__record_init(struct m0_fdmi_src_rec *src_rec)
156 {
157  M0_ENTRY("src_rec %p", src_rec);
158  M0_ASSERT(src_rec != NULL);
159 
160  fdmi_record_list_tlink_init(src_rec);
161  fdmi_matched_filter_list_tlist_init(&src_rec->fsr_filter_list);
162  src_rec->fsr_src_ctx =
164  if (src_rec->fsr_src_ctx == NULL) {
165  M0_LOG(M0_ERROR, "FDMI context for record type %x is not found.",
166  src_rec->fsr_src->fs_type_id);
167  }
168 
169  src_rec->fsr_init_time = m0_time_now();
170 
171  M0_LEAVE();
172 }
173 
174 M0_INTERNAL void m0_fdmi__record_deinit(struct m0_fdmi_src_rec *src_rec)
175 {
176  M0_ENTRY("rec_src %p", src_rec);
178 
179  fdmi_matched_filter_list_tlist_fini(&src_rec->fsr_filter_list);
180  fdmi_record_list_tlink_fini(src_rec);
181  src_rec->fsr_rec_id = M0_UINT128(0, 0);
182 
183  M0_LEAVE();
184 }
185 
186 M0_INTERNAL void m0_fdmi__rec_id_gen(struct m0_fdmi_src_rec *src_rec)
187 {
188  M0_ENTRY("src_rec %p", src_rec);
190  M0_PRE(src_rec->fsr_src != NULL);
191  M0_PRE(src_rec->fsr_rec_id.u_hi == 0 && src_rec->fsr_rec_id.u_lo == 0);
192 
210  if (m0_fdmi_src_dock_get()->fsdc_instance_id == 0) {
211 #ifndef __KERNEL__
212  uint64_t seed = m0_time_now() ^ getpid();
213 #else
214  uint64_t seed = m0_time_now();
215 #endif
216  uint64_t id = 0;
217 
218  /* this loop is to make sure ID is never 0. */
219  while (id == 0) {
220  id = m0_rnd64(&seed);
221  seed++;
222  }
224  }
225 
226  M0_ASSERT(sizeof(src_rec) <= sizeof(uint64_t));
227  src_rec->fsr_rec_id = M0_UINT128(
228  m0_fdmi_src_dock_get()->fsdc_instance_id,
229  (uint64_t)src_rec
230  );
231  M0_LOG(M0_DEBUG, "new FDMI record id = "U128X_F,
232  U128_P(&src_rec->fsr_rec_id));
233  M0_LEAVE();
234 }
235 
236 M0_INTERNAL void m0_fdmi__enqueue_locked(struct m0_fdmi_src_rec *src_rec)
237 {
238  struct m0_fdmi_src_dock *src_dock = m0_fdmi_src_dock_get();
239 
241  M0_ASSERT(src_rec != NULL && src_rec->fsr_src != NULL);
242 
243  M0_LOG(M0_DEBUG, "Adding into record list id = "U128X_F,
244  U128_P(&src_rec->fsr_rec_id));
245  fdmi_record_list_tlist_add_tail(
246  &src_dock->fsdc_posted_rec_list, src_rec);
248 }
249 
250 M0_INTERNAL void m0_fdmi__enqueue(struct m0_fdmi_src_rec *src_rec)
251 {
252  struct m0_fdmi_src_dock *src_dock = m0_fdmi_src_dock_get();
253 
254  M0_ASSERT(src_rec != NULL && src_rec->fsr_src != NULL);
255 
256  m0_mutex_lock(&src_dock->fsdc_list_mutex);
257  m0_fdmi__enqueue_locked(src_rec);
258  m0_mutex_unlock(&src_dock->fsdc_list_mutex);
259 }
260 
261 M0_INTERNAL void m0_fdmi__record_post(struct m0_fdmi_src_rec *src_rec)
262 {
263  M0_ENTRY("src %p, fdmi_data %p, rec_id "U128X_F_SAFE,
264  (src_rec ? src_rec->fsr_src : (void*)(-1)),
265  (src_rec ? src_rec->fsr_data : (void*)(-1)),
266  U128_P_SAFE_EX(src_rec, &src_rec->fsr_rec_id));
267 
268  M0_ASSERT(src_rec != NULL && src_rec->fsr_src != NULL);
269 
270  m0_fdmi__record_init(src_rec);
271  m0_fdmi__rec_id_gen(src_rec);
272 
273  /* Init ref cnt to 1, to be droppped when it is processed/released. */
274  m0_ref_init(&src_rec->fsr_ref, 1, src_rec_free);
275  m0_fdmi__fs_get(src_rec);
276  M0_LOG(M0_DEBUG, "fdmi rec id=" U128X_F " ref cnt=%d",
277  U128_P(&src_rec->fsr_rec_id),
278  (int)m0_ref_read(&src_rec->fsr_ref));
279 
280  m0_fdmi__enqueue(src_rec);
281 
282  M0_LEAVE();
283 }
284 
285 M0_INTERNAL int m0_fdmi_source_alloc(enum m0_fdmi_rec_type_id type_id,
286  struct m0_fdmi_src **src)
287 {
288  struct m0_fdmi_src_ctx *src_ctx;
289 
290  M0_ALLOC_PTR(src_ctx);
291  if (src_ctx == NULL) {
292  *src = NULL;
293  return -ENOMEM;
294  }
295  src_ctx->fsc_src.fs_type_id = type_id;
296  *src = &src_ctx->fsc_src;
297 
298  return 0;
299 }
300 
301 M0_INTERNAL void m0_fdmi_source_free(struct m0_fdmi_src *src)
302 {
303  struct m0_fdmi_src_ctx *src_ctx;
304  M0_PRE(src != NULL);
305  src_ctx = container_of(src, struct m0_fdmi_src_ctx, fsc_src);
306  M0_ASSERT(!src_ctx->fsc_registered);
307  fdmi_src_dock_src_list_tlist_remove(src_ctx);
308  m0_free(src_ctx);
309 }
310 
311 M0_INTERNAL int m0_fdmi_source_register(struct m0_fdmi_src *src)
312 {
313  struct m0_fdmi_src_ctx *src_ctx;
314  struct m0_fdmi_src_dock *src_dock = m0_fdmi_src_dock_get();
315 
316  M0_PRE(src != NULL);
317  M0_PRE(src->fs_node_eval != NULL);
318  M0_PRE(src->fs_encode != NULL);
319  M0_PRE(m0_tl_find(fdmi_src_dock_src_list, src_ctx,
320  &src_dock->fsdc_src_list,
321  (src->fs_type_id == src_ctx->fsc_src.fs_type_id &&
322  src_ctx->fsc_registered)) == NULL);
325  M0_ENTRY();
326  src_ctx = container_of(src, struct m0_fdmi_src_ctx, fsc_src);
327  src_ctx->fsc_registered = true;
328  fdmi_src_dock_src_list_tlink_init_at(
329  src_ctx,
330  &src_dock->fsdc_src_list);
331 
332  src->fs_record_post = m0_fdmi__record_post;
333 
334  return M0_RC(0);
335 }
336 
337 M0_INTERNAL void m0_fdmi_source_deregister(struct m0_fdmi_src *src)
338 {
339  struct m0_fdmi_src_dock *src_dock = m0_fdmi_src_dock_get();
340  struct m0_fdmi_src_ctx *src_ctx;
341  struct m0_fdmi_src_rec *src_rec;
342 
343  M0_ENTRY("src = %p", src);
344  M0_PRE(src != NULL);
345 
346  m0_mutex_lock(&src_dock->fsdc_list_mutex);
347 
348  src_ctx = m0_tl_find(
349  fdmi_src_dock_src_list, src_ctx,
350  &m0_fdmi_src_dock_get()->fsdc_src_list,
351  (src->fs_type_id == src_ctx->fsc_src.fs_type_id &&
352  src_ctx->fsc_registered));
353 
354  M0_POST(src_ctx != NULL);
355 
356  src_ctx->fsc_registered = false;
357  src->fs_record_post = NULL;
358 
359  m0_tlist_for(&fdmi_record_list_tl, &src_dock->fsdc_posted_rec_list,
360  src_rec) {
362  if (src_rec->fsr_src == src) {
363  fdmi_record_list_tlist_remove(src_rec);
364  m0_fdmi__record_deinit(src_rec);
365  }
366  } m0_tlist_endfor;
367 
368  m0_mutex_unlock(&src_dock->fsdc_list_mutex);
369 
370  M0_LEAVE();
371 }
372 
373 M0_INTERNAL struct m0_fdmi_src_ctx *
375 {
376  struct m0_fdmi_src_ctx *ret;
377  struct m0_fdmi_src_dock *src_dock = m0_fdmi_src_dock_get();
378 
379  M0_ENTRY("src_dock=%p, src_type_id=%d", src_dock, src_type_id);
380 
381  ret = m0_tl_find(fdmi_src_dock_src_list, ret, &src_dock->fsdc_src_list,
382  ret->fsc_src.fs_type_id == src_type_id);
383 
384  M0_LEAVE("ret=%p", ret);
385  return ret;
386 }
387 
388 M0_INTERNAL void m0_fdmi__fs_get(struct m0_fdmi_src_rec *src_rec)
389 {
390  M0_ENTRY("src_rec=%p", src_rec);
392 
393  M0_LOG(M0_DEBUG, "fs get for "U128X_F,
394  U128_P(&src_rec->fsr_rec_id));
395  if (src_rec->fsr_src->fs_get != NULL) {
396  src_rec->fsr_src->fs_get(src_rec);
397  }
398 
399  M0_LEAVE();
400 }
401 
402 M0_INTERNAL void m0_fdmi__fs_put(struct m0_fdmi_src_rec *src_rec)
403 {
404  M0_ENTRY("src_rec=%p", src_rec);
406 
407  M0_LOG(M0_DEBUG, "fs put for "U128X_F,
408  U128_P(&src_rec->fsr_rec_id));
409  if (src_rec->fsr_src->fs_put != NULL)
410  src_rec->fsr_src->fs_put(src_rec);
411 
412  M0_LEAVE();
413 }
414 
415 M0_INTERNAL void m0_fdmi__fs_begin(
416  struct m0_fdmi_src_rec *src_rec)
417 {
418  M0_ENTRY("src_rec = %p", src_rec);
420 
421  if (src_rec->fsr_src->fs_begin != NULL)
422  src_rec->fsr_src_ctx->fsc_src.fs_begin(src_rec);
423 
424  M0_LEAVE();
425 }
426 
427 M0_INTERNAL void m0_fdmi__fs_end(struct m0_fdmi_src_rec *src_rec)
428 {
429  M0_ENTRY("src_rec = %p", src_rec);
431 
432  if (src_rec->fsr_src->fs_end != NULL)
433  src_rec->fsr_src->fs_end(src_rec);
434 
435  M0_LEAVE();
436 }
437 
438 M0_INTERNAL enum m0_fdmi_rec_type_id
440 {
442  return src_rec->fsr_src->fs_type_id;
443 }
444 
445 M0_INTERNAL int m0_fdmi__handle_release(struct m0_uint128 *fdmi_rec_id)
446 {
447  struct m0_fdmi_src_rec *src_rec;
448  uint64_t expected;
449  uint64_t actual;
450  struct m0_fdmi_src_dock *src_dock = m0_fdmi_src_dock_get();
451  bool waiting;
452 
453  M0_PRE(fdmi_rec_id != NULL);
454 
455  M0_ENTRY("fdmi_rec_id "U128X_F_SAFE, U128_P_SAFE(fdmi_rec_id));
456 
457  /*
458  * First, validate that this rec_id was generated by this running
459  * instance (see m0_fdmi__rec_id_gen).
460  */
461  actual = fdmi_rec_id->u_hi;
463  if (actual != expected) {
464  M0_LOG(M0_WARN,
465  "Failed rc=1. Received release-record aimed at "
466  "another source dock instance: u_hi = %" PRIx64 ", "
467  "expected %"PRIx64, actual, expected);
468  /*
469  * @todo FDMI Phase 2 -- post addb event about invalid
470  * fdmi_record_id.
471  */
472  return M0_RC(1);
473  }
474 
475  /*
476  * Lower 64 bit of fdmi_record_id are a pointer to
477  * src_rec. See m0_fdmi__rec_id_gen.
478  */
479  src_rec = (void *)fdmi_rec_id->u_lo;
480  if (src_rec == NULL ||
482  src_rec->fsr_rec_id.u_hi != fdmi_rec_id->u_hi ||
483  src_rec->fsr_rec_id.u_lo != fdmi_rec_id->u_lo) {
484  /*
485  * @todo Phase 2. In Phase 1, we release transaction BEFORE
486  * this 'release' even comes. So in Phase 1 we always end up
487  * in this code branch. But in Phase 2, it will all change.
488  */
489  M0_LOG(M0_WARN,
490  "Attempt to release non-existent FDMI record with ID "
491  U128X_F_SAFE" (magic %ld)", U128_P_SAFE(fdmi_rec_id),
492  (src_rec ? src_rec->fsr_magic : 0));
493 
494  /*
495  * @todo FDMI Phase 2 -- post addb event about invalid
496  * fdmi_record_id.
497  */
498  return M0_RC(0);
499  }
500 
501  m0_mutex_lock(&src_dock->fsdc_list_mutex);
502  if ((waiting = fdmi_record_inflight_tlink_is_in(src_rec)))
503  fdmi_record_inflight_tlist_remove(src_rec);
504  m0_mutex_unlock(&src_dock->fsdc_list_mutex);
505  if (waiting) {
506  M0_LOG(M0_DEBUG, "src_rec =" U128X_F " ref cnt:%d",
507  U128_P(&src_rec->fsr_rec_id),
508  (int)m0_ref_read(&src_rec->fsr_ref) - 1);
509  m0_ref_put(&src_rec->fsr_ref);
510  m0_fdmi__fs_put(src_rec);
511  }
512  /* @todo Phase 2: clear map <fdmi record id, endpoint>. */
513  return M0_RC(0);
514 }
515 
516 #undef M0_TRACE_SUBSYSTEM
517 
518 /*
519  * Local variables:
520  * c-indentation-style: "K&R"
521  * c-basic-offset: 8
522  * tab-width: 8
523  * fill-column: 80
524  * scroll-step: 1
525  * End:
526  */
527 /*
528  * vim: tabstop=8 shiftwidth=8 noexpandtab textwidth=80 nowrap
529  */
uint64_t id
Definition: cob.h:2380
#define M0_PRE(cond)
M0_INTERNAL void m0_mutex_unlock(struct m0_mutex *mutex)
Definition: mutex.c:66
M0_INTERNAL void m0_fdmi__record_post(struct m0_fdmi_src_rec *src_rec)
Definition: source_dock.c:261
struct m0_tl fsr_filter_list
Definition: src_rec.h:92
#define NULL
Definition: misc.h:38
M0_INTERNAL int m0_fdmi__handle_release(struct m0_uint128 *fdmi_rec_id)
Definition: source_dock.c:445
struct fdmi_sd_fom fsdc_sd_fom
struct m0_mutex fsdc_list_mutex
struct m0_tl fsdc_src_list
uint64_t fsr_magic
Definition: src_rec.h:67
void(* fs_get)(struct m0_fdmi_src_rec *src_rec)
Definition: source_dock.h:66
#define M0_LOG(level,...)
Definition: trace.h:167
M0_LEAVE()
struct m0_uint128 fsr_rec_id
Definition: src_rec.h:80
M0_INTERNAL bool m0_fdmi__record_is_valid(struct m0_fdmi_src_rec *src_rec)
Definition: source_dock.c:121
M0_INTERNAL void m0_fdmi__record_init(struct m0_fdmi_src_rec *src_rec)
Definition: source_dock.c:155
static void src_rec_free(struct m0_ref *ref)
Definition: source_dock.c:129
M0_INTERNAL void m0_fdmi_source_free(struct m0_fdmi_src *src)
Definition: source_dock.c:301
#define container_of(ptr, type, member)
Definition: misc.h:33
#define M0_SET0(obj)
Definition: misc.h:64
M0_INTERNAL void m0_mutex_lock(struct m0_mutex *mutex)
Definition: mutex.c:49
M0_TL_DESCR_DEFINE(fdmi_src_dock_src_list, "fdmi src list", M0_INTERNAL, struct m0_fdmi_src_ctx, fsc_linkage, fsc_magic, M0_FDMI_SRC_DOCK_SRC_CTX_MAGIC, M0_FDMI_SRC_DOCK_SRC_CTX_HEAD_MAGIC)
void(* fs_put)(struct m0_fdmi_src_rec *src_rec)
Definition: source_dock.h:68
#define PRIx64
Definition: types.h:61
M0_INTERNAL void m0_fdmi__fs_get(struct m0_fdmi_src_rec *src_rec)
Definition: source_dock.c:388
#define U128_P_SAFE_EX(y, x)
Definition: types.h:53
struct m0_ref fsr_ref
Definition: src_rec.h:87
return M0_RC(rc)
struct m0_fdmi_src * fsr_src
Definition: src_rec.h:72
#define M0_ENTRY(...)
Definition: trace.h:170
static int expected
Definition: locality.c:102
M0_INTERNAL int m0_fdmi_source_alloc(enum m0_fdmi_rec_type_id type_id, struct m0_fdmi_src **src)
Definition: source_dock.c:285
M0_INTERNAL void m0_ref_put(struct m0_ref *ref)
Definition: refs.c:38
void m0_ref_init(struct m0_ref *ref, int init_num, void(*release)(struct m0_ref *ref))
Definition: refs.c:24
#define M0_AMB(obj, ptr, field)
Definition: misc.h:320
Definition: refs.h:34
#define m0_tl_teardown(name, head, obj)
Definition: tlist.h:708
if(value==NULL)
Definition: dir.c:350
M0_INTERNAL void m0_fdmi__enqueue(struct m0_fdmi_src_rec *src_rec)
Definition: source_dock.c:250
#define M0_ASSERT(cond)
M0_INTERNAL bool m0_mutex_is_locked(const struct m0_mutex *mutex)
Definition: mutex.c:95
#define U128_P(x)
Definition: types.h:45
m0_time_t m0_time_now(void)
Definition: time.c:134
M0_INTERNAL void m0_fdmi_source_deregister(struct m0_fdmi_src *src)
Definition: source_dock.c:337
void * fsr_data
Definition: src_rec.h:75
M0_INTERNAL struct m0_fdmi_src_dock * m0_fdmi_src_dock_get(void)
Definition: fdmi.c:890
M0_INTERNAL void m0_fdmi__fs_end(struct m0_fdmi_src_rec *src_rec)
Definition: source_dock.c:427
M0_INTERNAL int m0_fdmi_source_register(struct m0_fdmi_src *src)
Definition: source_dock.c:311
uint64_t u_hi
Definition: types.h:36
M0_INTERNAL void m0_mutex_init(struct m0_mutex *mutex)
Definition: mutex.c:35
#define U128_P_SAFE(x)
Definition: types.h:49
#define M0_POST(cond)
M0_INTERNAL void m0_fdmi__fs_begin(struct m0_fdmi_src_rec *src_rec)
Definition: source_dock.c:415
M0_INTERNAL void m0_fdmi__src_dock_fom_wakeup(struct fdmi_sd_fom *sd_fom)
m0_fdmi_rec_type_id
Definition: fdmi.h:234
M0_INTERNAL void m0_fdmi__rec_id_gen(struct m0_fdmi_src_rec *src_rec)
Definition: source_dock.c:186
#define U128X_F_SAFE
Definition: types.h:48
M0_INTERNAL enum m0_fdmi_rec_type_id m0_fdmi__sd_rec_type_id_get(struct m0_fdmi_src_rec *src_rec)
Definition: source_dock.c:439
#define U128X_F
Definition: types.h:42
struct m0_tl fsdc_posted_rec_list
struct m0_tl fsdc_rec_inflight
enum m0_fdmi_rec_type_id fs_type_id
Definition: source_dock.h:49
M0_INTERNAL int64_t m0_ref_read(const struct m0_ref *ref)
Definition: refs.c:44
m0_time_t fsr_init_time
Definition: src_rec.h:111
M0_INTERNAL uint64_t m0_rnd64(uint64_t *seed)
Definition: misc.c:100
M0_TL_DEFINE(fdmi_src_dock_src_list, M0_INTERNAL, struct m0_fdmi_src_ctx)
#define M0_ALLOC_PTR(ptr)
Definition: memory.h:86
M0_INTERNAL void m0_fdmi_source_dock_fini(struct m0_fdmi_src_dock *src_dock)
Definition: source_dock.c:97
#define _0C(exp)
Definition: assert.h:311
M0_INTERNAL void m0_mutex_fini(struct m0_mutex *mutex)
Definition: mutex.c:42
struct m0_fdmi_src_ctx * fsr_src_ctx
Definition: src_rec.h:98
void(* fs_begin)(struct m0_fdmi_src_rec *src_rec)
Definition: source_dock.h:70
#define m0_tlist_endfor
Definition: tlist.h:448
struct m0_fdmi_src fsc_src
M0_INTERNAL void m0_fdmi__record_deinit(struct m0_fdmi_src_rec *src_rec)
Definition: source_dock.c:174
#define M0_UINT128(hi, lo)
Definition: types.h:40
#define m0_tlist_for(descr, head, obj)
Definition: tlist.h:435
M0_INTERNAL struct m0_fdmi_src_ctx * m0_fdmi__src_ctx_get(enum m0_fdmi_rec_type_id src_type_id)
Definition: source_dock.c:374
uint64_t u_lo
Definition: types.h:37
void(* fs_end)(struct m0_fdmi_src_rec *src_rec)
Definition: source_dock.h:72
#define m0_tl_find(name, var, head,...)
Definition: tlist.h:757
void m0_free(void *data)
Definition: memory.c:146
M0_INTERNAL void m0_fdmi__fs_put(struct m0_fdmi_src_rec *src_rec)
Definition: source_dock.c:402
struct m0_pdclust_src_addr src
Definition: fd.c:108
M0_INTERNAL void m0_fdmi_source_dock_init(struct m0_fdmi_src_dock *src_dock)
Definition: source_dock.c:85
M0_INTERNAL void m0_fdmi__enqueue_locked(struct m0_fdmi_src_rec *src_rec)
Definition: source_dock.c:236
Definition: trace.h:478