Motr  M0
tx_regmap.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2013-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 #include "be/tx_regmap.h"
24 
25 #include "ut/ut.h" /* M0_UT_ASSERT */
26 
27 #include "lib/types.h" /* uint64_t */
28 #include "lib/arith.h" /* m0_rnd64 */
29 #include "lib/misc.h" /* M0_SET0 */
30 #include "lib/string.h" /* memcpy */
31 
32 #include "be/ut/helper.h" /* m0_be_ut_seg */
33 
34 /*
35 #define LOGD(...) printf(__VA_ARGS__)
36 */
37 #define LOGD(...)
38 
39 enum {
42  BE_UT_RDT_ITER = 0x10000,
43 };
44 
48 };
49 
52 
53 static bool be_ut_reg_d_is_equal(const struct m0_be_reg_d *rd1,
54  const struct m0_be_reg_d *rd2)
55 {
56  return rd1->rd_reg.br_size == rd2->rd_reg.br_size &&
57  rd1->rd_reg.br_addr == rd2->rd_reg.br_addr;
58 }
59 
60 static int be_ut_rdt_del_find(int index)
61 {
62  int i;
63 
64  for (i = index + 1; i < BE_UT_RDT_SIZE; ++i) {
65  if (be_ut_rdt_rd[i].ur_inserted)
66  break;
67  }
68  return i;
69 }
70 
71 static void be_ut_reg_d_tree_check(void)
72 {
73  struct be_ut_rdt_reg_d *urd;
74  struct m0_be_reg_d *rd;
75  int i;
76  size_t size = 0;
77 
79  for (i = 0; i < BE_UT_RDT_SIZE; ++i) {
80  urd = &be_ut_rdt_rd[i];
81  if (urd->ur_inserted) {
82  ++size;
84  rd = m0_be_rdt_next(&be_ut_rdt, rd);
85  }
86  }
87  M0_UT_ASSERT(rd == NULL);
89 }
90 
92 {
93  struct be_ut_rdt_reg_d *urd;
94  struct m0_be_reg_d *rd;
95  uint64_t seed = 0;
97  void *r_addr;
98  int rc;
99  int i;
100  int index;
101  int del_i;
102 
104  M0_UT_ASSERT(rc == 0);
105  for (i = 0; i < BE_UT_RDT_SIZE; ++i) {
107  r_addr = (void *) (uintptr_t) (i * BE_UT_RDT_R_SIZE + 1);
108  be_ut_rdt_rd[i] = (struct be_ut_rdt_reg_d) {
109  .ur_rd = {
110  .rd_reg = M0_BE_REG(NULL, r_size, r_addr),
111  },
112  .ur_inserted = false,
113  };
114  }
116  for (i = 0; i < BE_UT_RDT_ITER; ++i) {
118  urd = &be_ut_rdt_rd[index];
119 
120  if (!urd->ur_inserted) {
121  m0_be_rdt_ins(&be_ut_rdt, &urd->ur_rd);
122  } else {
123  del_i = be_ut_rdt_del_find(index);
124  rd = m0_be_rdt_del(&be_ut_rdt, &urd->ur_rd);
125  M0_UT_ASSERT(equi(del_i == BE_UT_RDT_SIZE, rd == NULL));
128  &be_ut_rdt_rd[del_i].ur_rd)));
129  }
130  urd->ur_inserted = !urd->ur_inserted;
131 
133  }
135 }
136 
137 enum {
138  BE_UT_REGMAP_ITER = 0x10000,
141 };
142 
143 /* [begin, end) */
150 };
151 
153  char *trs_name;
155  size_t trs_nr;
156 };
157 
158 #define BUT_TR(begin, end, do_insert, desired_nr, desired_len) \
159  { \
160  .bur_begin = (begin), \
161  .bur_end = (end), \
162  .bur_do_insert = (do_insert), \
163  .bur_desired_nr = (desired_nr), \
164  .bur_desired_len = (desired_len), \
165  }
166 
167 
168 #define BUT_TRA_NAME(name) be_ut_tra_##name
169 #define DEFINE_BUT_TRA(name, ...) \
170  static struct be_ut_test_reg BUT_TRA_NAME(name)[] = { __VA_ARGS__ }
171 
172 #define BUT_TRS(name) { \
173  .trs_name = #name, \
174  .trs_test = BUT_TRA_NAME(name), \
175  .trs_nr = ARRAY_SIZE(BUT_TRA_NAME(name)), \
176 }
177 
178 /*
179  * ins = insert
180  * del = delete
181  * adj = adjacent
182  * cpy = copy
183  * top = top
184  * bot = bottom
185  */
186 DEFINE_BUT_TRA(ins_simple, BUT_TR(1, 3, true, 1, 2));
187 DEFINE_BUT_TRA(ins_size1, BUT_TR(1, 2, true, 1, 1));
188 
189 DEFINE_BUT_TRA(ins2, BUT_TR(1, 3, true, 1, 2), BUT_TR(4, 6, true, 2, 4));
190 DEFINE_BUT_TRA(ins2_size1, BUT_TR(1, 2, true, 1, 1), BUT_TR(2, 3, true, 2, 2));
191 
192 DEFINE_BUT_TRA(ins2_adj, BUT_TR(1, 3, true, 1, 2), BUT_TR(3, 5, true, 2, 4));
193 DEFINE_BUT_TRA(ins2_adj_size1,
194  BUT_TR(1, 3, true, 1, 2), BUT_TR(3, 4, true, 2, 3));
195 
196 DEFINE_BUT_TRA(ins_replace, BUT_TR(1, 3, true, 1, 2), BUT_TR(1, 3, true, 1, 2));
197 DEFINE_BUT_TRA(ins_cpy, BUT_TR(3, 8, true, 1, 5), BUT_TR(4, 7, true, 1, 5));
198 DEFINE_BUT_TRA(ins_cpy_top, BUT_TR(3, 8, true, 1, 5), BUT_TR(5, 8, true, 1, 5));
199 DEFINE_BUT_TRA(ins_cpy_bot, BUT_TR(3, 8, true, 1, 5), BUT_TR(3, 5, true, 1, 5));
200 
201 DEFINE_BUT_TRA(del_none, BUT_TR(1, 3, false, 0, 0));
202 DEFINE_BUT_TRA(del_none_size1, BUT_TR(1, 2, false, 0, 0));
203 
204 DEFINE_BUT_TRA(del_entire,
205  BUT_TR(1, 3, true, 1, 2), BUT_TR(1, 3, false, 0, 0));
206 DEFINE_BUT_TRA(del_entire_top,
207  BUT_TR(1, 3, true, 1, 2), BUT_TR(1, 4, false, 0, 0));
208 DEFINE_BUT_TRA(del_entire_bot,
209  BUT_TR(3, 5, true, 1, 2), BUT_TR(2, 5, false, 0, 0));
210 DEFINE_BUT_TRA(del_entire_both,
211  BUT_TR(3, 5, true, 1, 2), BUT_TR(2, 6, false, 0, 0));
212 DEFINE_BUT_TRA(del_nop,
213  BUT_TR(3, 8, true, 1, 5), BUT_TR(4, 7, false, 1, 5));
214 
215 DEFINE_BUT_TRA(ins2_del1,
216  BUT_TR(3, 5, true, 1, 2), BUT_TR(6, 7, true, 2, 3),
217  BUT_TR(3, 5, false, 1, 1));
218 DEFINE_BUT_TRA(ins2_del2,
219  BUT_TR(3, 5, true, 1, 2), BUT_TR(6, 7, true, 2, 3),
220  BUT_TR(3, 5, false, 1, 1), BUT_TR(6, 7, false, 0, 0));
221 DEFINE_BUT_TRA(ins2_del_all,
222  BUT_TR(3, 5, true, 1, 2), BUT_TR(6, 7, true, 2, 3),
223  BUT_TR(3, 7, false, 0, 0));
224 
225 DEFINE_BUT_TRA(del_cut_top1,
226  BUT_TR(3, 8, true, 1, 5), BUT_TR(5, 9, false, 1, 2));
227 DEFINE_BUT_TRA(del_cut_top0,
228  BUT_TR(3, 8, true, 1, 5), BUT_TR(5, 8, false, 1, 2));
229 DEFINE_BUT_TRA(del_cut_bot1,
230  BUT_TR(3, 8, true, 1, 5), BUT_TR(2, 5, false, 1, 3));
231 DEFINE_BUT_TRA(del_cut_bot0,
232  BUT_TR(3, 8, true, 1, 5), BUT_TR(3, 5, false, 1, 3));
233 DEFINE_BUT_TRA(del_cut_adj,
234  BUT_TR(3, 5, true, 1, 2), BUT_TR(5, 8, true, 2, 5),
235  BUT_TR(4, 6, false, 2, 3));
236 DEFINE_BUT_TRA(del_cut_entire_top,
237  BUT_TR(3, 5, true, 1, 2), BUT_TR(5, 8, true, 2, 5),
238  BUT_TR(4, 8, false, 1, 1));
239 DEFINE_BUT_TRA(del_cut_entire_bot,
240  BUT_TR(3, 5, true, 1, 2), BUT_TR(5, 8, true, 2, 5),
241  BUT_TR(3, 6, false, 1, 2));
242 
244  BUT_TRS(ins_simple),
245  BUT_TRS(ins_size1),
246  BUT_TRS(ins2),
247  BUT_TRS(ins2_size1),
248  BUT_TRS(ins2_adj),
249  BUT_TRS(ins2_adj_size1),
250  BUT_TRS(ins_replace),
251  BUT_TRS(ins_cpy),
252  BUT_TRS(ins_cpy_top),
253  BUT_TRS(ins_cpy_bot),
254  BUT_TRS(del_none),
255  BUT_TRS(del_none_size1),
256  BUT_TRS(del_entire),
257  BUT_TRS(del_entire_top),
258  BUT_TRS(del_entire_bot),
259  BUT_TRS(del_entire_both),
260  BUT_TRS(del_nop),
261  BUT_TRS(ins2_del1),
262  BUT_TRS(ins2_del2),
263  BUT_TRS(ins2_del_all),
264  BUT_TRS(del_cut_top1),
265  BUT_TRS(del_cut_top0),
266  BUT_TRS(del_cut_bot1),
267  BUT_TRS(del_cut_bot0),
268  BUT_TRS(del_cut_adj),
269  BUT_TRS(del_cut_entire_top),
270  BUT_TRS(del_cut_entire_bot),
271 };
272 
273 #undef BUT_TRS
274 #undef DEFINE_BUT_TRA
275 #undef BUT_TRA_NAME
276 #undef BUT_TR
277 
279 static const unsigned be_ut_rm_unused = ~0;
283 static unsigned be_ut_rm_iteration;
284 static void *be_ut_rm_ops_data = (void *) 42;
285 
286 static void be_ut_rm_fill2(uintptr_t addr, m0_bcount_t size, unsigned value,
287  bool fill_reg)
288 {
289  uintptr_t i;
290 
291  for (i = addr; i < addr + size; ++i) {
292  M0_UT_ASSERT(0 <= i && i < BE_UT_REGMAP_LEN);
294  be_ut_rm_unused != value));
295  M0_UT_ASSERT(ergo(fill_reg,
297  be_ut_rm_unused != value)));
298  be_ut_rm_data[i] = value;
299  if (fill_reg)
300  be_ut_rm_reg[i] = value;
301  }
302 }
303 
304 static void be_ut_rm_fill(const struct m0_be_reg_d *rd, unsigned value,
305  bool fill_reg)
306 {
308  be_ut_rm_fill2((uintptr_t) rd->rd_reg.br_addr,
309  rd->rd_reg.br_size, value, fill_reg);
310 }
311 
312 static void be_ut_regmap_add(void *data, struct m0_be_reg_d *rd)
313 {
316 }
317 
318 static void be_ut_regmap_del(void *data, const struct m0_be_reg_d *rd)
319 {
321  be_ut_rm_fill(rd, be_ut_rm_unused, true);
322 }
323 
324 static void be_ut_regmap_cpy(void *data, const struct m0_be_reg_d *super,
325  const struct m0_be_reg_d *rd)
326 {
328  be_ut_rm_fill(rd, be_ut_rm_unused, false);
329  be_ut_rm_fill(rd, be_ut_rm_iteration, false);
330 }
331 
332 static void be_ut_regmap_cut(void *data, struct m0_be_reg_d *rd,
333  m0_bcount_t cut_at_start, m0_bcount_t cut_at_end)
334 {
336  uintptr_t addr;
337 
340 
341  size = rd->rd_reg.br_size;
342  addr = (uintptr_t) rd->rd_reg.br_addr;
343 
344  if (cut_at_start != 0)
345  be_ut_rm_fill2(addr, cut_at_start, be_ut_rm_unused, true);
346 
347  if (cut_at_end != 0)
348  be_ut_rm_fill2(addr + size - cut_at_end, cut_at_end,
349  be_ut_rm_unused, true);
350 }
351 
352 static const struct m0_be_regmap_ops be_ut_regmap_ops = {
354  .rmo_del = be_ut_regmap_del,
355  .rmo_cpy = be_ut_regmap_cpy,
356  .rmo_cut = be_ut_regmap_cut
357 };
358 
359 static void be_ut_regmap_init(void)
360 {
361  int rc;
362  int i;
363 
367  M0_UT_ASSERT(rc == 0);
368  for (i = 0; i < BE_UT_REGMAP_LEN; ++i) {
371  }
372  be_ut_rm_iteration = 0;
373 }
374 
375 static void be_ut_regmap_fini(void)
376 {
378 }
379 
380 static void be_ut_regmap_data_copy(void)
381 {
383 }
384 
385 static void be_ut_regmap_print_d(unsigned d, int i)
386 {
387  if (d == be_ut_rm_unused) {
388  LOGD("%*s", 4, ".");
389  } else {
390  LOGD("%4.u", d);
391  }
392  LOGD("%c", i == BE_UT_REGMAP_LEN - 1 ? '\n' : ' ');
393 }
394 
395 static void be_ut_regmap_data_cmp(const struct m0_be_reg_d *r,
396  unsigned desired,
397  bool nop)
398 {
399  int i;
400 
401  LOGD("save: ");
402  for (i = 0; i < BE_UT_REGMAP_LEN; ++i)
404  LOGD("curr: ");
405  for (i = 0; i < BE_UT_REGMAP_LEN; ++i)
407  LOGD("reg : ");
408  for (i = 0; i < BE_UT_REGMAP_LEN; ++i)
410  LOGD(" : ");
411  for (i = 0; i < BE_UT_REGMAP_LEN; ++i)
412  be_ut_regmap_print_d(i % 10, i);
413 
414  for (i = 0; i < BE_UT_REGMAP_LEN; ++i) {
415  M0_UT_ASSERT(ergo(nop,
417  if (m0_be_reg_d_is_in(r, (void *) (uintptr_t) i)) {
418  M0_UT_ASSERT(ergo(!nop, be_ut_rm_data[i] == desired));
419  } else {
420  M0_UT_ASSERT(ergo(!nop, be_ut_rm_data[i] ==
422  }
423  }
424 }
425 
426 /* check regmap size - number of regions in the regmap */
427 static void be_ut_regmap_size_length_check(size_t desired_size,
428  m0_bcount_t desired_length,
429  bool do_check)
430 {
431  struct m0_be_reg_d *rd;
432  size_t size = 0;
433  m0_bcount_t length = 0;
434  size_t size1 = 0;
435  m0_bcount_t length1 = 0;
436  int i;
437 
438  for (rd = m0_be_regmap_first(&be_ut_rm_regmap); rd != NULL;
439  rd = m0_be_regmap_next(&be_ut_rm_regmap, rd)) {
440  ++size;
441  length += rd->rd_reg.br_size;
442  }
443  M0_UT_ASSERT(ergo(do_check, size == desired_size));
444  M0_UT_ASSERT(ergo(do_check, length == desired_length));
446  for (i = 0; i < BE_UT_REGMAP_LEN; ++i) {
447  length1 += be_ut_rm_reg[i] != be_ut_rm_unused;
448  size1 += (i == 0 ? be_ut_rm_unused : be_ut_rm_reg[i - 1]) !=
450  }
451  M0_UT_ASSERT(length1 == length);
452  M0_UT_ASSERT(size1 == size);
453 }
454 
455 /*
456  * There is one special case when m0_be_regmap_del() is no-op: when a new region
457  * is completely covered by existing and existing is larger than new at the
458  * beginning and at the end. For example, if new region is [5, 10) and in the
459  * tree there is a region [3, 12), then delete is no-op because delete operation
460  * will need additional credit m0_be_tx_credit.tc_reg_nr for the regions [3, 5)
461  * and [10, 12).
462  */
463 static bool be_ut_regmap_nop(m0_bcount_t begin, m0_bcount_t end, bool do_insert)
464 {
465  unsigned value;
466  int i;
467 
468  if (do_insert)
469  return false;
470  if (begin == 0 || end + 1 == BE_UT_REGMAP_LEN)
471  return false;
472 
473  value = be_ut_rm_reg[begin];
474  for (i = begin; i < end; ++i) {
475  if (be_ut_rm_reg[i] != value)
476  return false;
477  }
478  if (be_ut_rm_reg[begin - 1] != value || be_ut_rm_reg[end] != value)
479  return false;
480  return true;
481 }
482 
483 /* do operation with range [begin, end) */
484 static void be_ut_regmap_do(m0_bcount_t begin, m0_bcount_t end, bool do_insert)
485 {
486  static unsigned long gen_idx = 0;
487  struct m0_be_reg_d rd;
488  unsigned desired;
489  bool nop;
490 
491  M0_PRE(0 <= begin && begin < BE_UT_REGMAP_LEN);
492  M0_PRE(0 <= end && end <= BE_UT_REGMAP_LEN);
493  M0_PRE(begin <= end);
494 
496 
497  LOGD("\n%s [%lu, %lu), iteration = %u\n",
498  do_insert ? "ins" : "del", begin, end, be_ut_rm_iteration);
499 
501  rd = (struct m0_be_reg_d ) {
502  .rd_reg = M0_BE_REG(NULL, end - begin, (void *) begin),
503  .rd_gen_idx = ++gen_idx,
504  };
505 
507  nop = be_ut_regmap_nop(begin, end, do_insert);
508 
509  if (do_insert)
511  else
513 
514  desired = do_insert == 1 ? be_ut_rm_iteration : be_ut_rm_unused;
515  be_ut_regmap_data_cmp(&rd, desired, nop);
516  be_ut_regmap_size_length_check(0, 0, false);
517 }
518 
520 {
521  struct be_ut_test_reg_suite *burs;
522  struct be_ut_test_reg *bur;
523  int i;
524  int j;
525 
526 
527  for (i = 0; i < ARRAY_SIZE(be_ut_test_regs); ++i) {
529  burs = &be_ut_test_regs[i];
530  be_ut_regmap_size_length_check(0, 0, true);
531  LOGD("\ntesting %s suite\n", burs->trs_name);
532  for (j = 0; j < burs->trs_nr; ++j) {
533  bur = &burs->trs_test[j];
534  be_ut_regmap_do(bur->bur_begin, bur->bur_end,
535  bur->bur_do_insert);
537  bur->bur_desired_len,
538  true);
539  }
541  }
542 }
543 
545 {
546  m0_bcount_t begin;
547  m0_bcount_t end;
548  unsigned i;
549  uint64_t seed = 0;
550  int do_insert;
551 
553  for (i = 0; i < BE_UT_REGMAP_ITER; ++i) {
554  begin = m0_rnd64(&seed) % (BE_UT_REGMAP_LEN -
555  BE_UT_REGMAP_R_SIZE - 1) + 1;
556  end = begin + m0_rnd64(&seed) % BE_UT_REGMAP_R_SIZE + 1;
557  do_insert = m0_rnd64(&seed) % 2;
558  be_ut_regmap_do(begin, end, do_insert != 0);
559  }
561 }
562 
563 enum {
564  BE_UT_RA_SEG_SIZE = 0x10000,
568  BE_UT_RA_ITER = 0x10000,
569 };
570 
572 static struct m0_be_seg *be_ut_ra_seg;
573 static uint64_t be_ut_ra_rand_seed;
577 
579 {
581 }
582 
584 {
585  return (void *) (uintptr_t) be_ut_ra_seg->bs_addr +
586  be_ut_ra_seg->bs_reserved + offs;
587 }
588 
589 static void be_ut_reg_area_reset(bool reset_save)
590 {
591  int i;
592 
593  for (i = 0; i < BE_UT_RA_SIZE; ++i) {
594  be_ut_ra_data[i] = 0;
595  if (reset_save)
596  be_ut_ra_save[i] = 0;
597  }
598 }
599 
601 {
602  int rc;
603 
607  M0_UT_ASSERT(rc == 0);
608  be_ut_reg_area_reset(true);
609 }
610 
611 static void be_ut_reg_area_fini(void)
612 {
614 }
615 
616 static void be_ut_reg_area_fill(struct m0_be_reg_d *rd)
617 {
618  uintptr_t begin = be_ut_reg_area_addr2offs(rd->rd_reg.br_addr);
619  uintptr_t end = begin + rd->rd_reg.br_size;
620 
621  M0_PRE(0 <= begin && begin < BE_UT_RA_SIZE);
622  M0_PRE(0 <= end && end <= BE_UT_RA_SIZE);
623  M0_PRE(begin <= end);
624 
625  memcpy(&be_ut_ra_data[begin], rd->rd_buf, end - begin);
626 }
627 
628 /* XXX copy-paste from be_ut_reg_area_fill() */
629 static void be_ut_reg_area_fill_save(struct m0_be_reg_d *rd)
630 {
631  uintptr_t begin = be_ut_reg_area_addr2offs(rd->rd_reg.br_addr);
632  uintptr_t end = begin + rd->rd_reg.br_size;
633 
634  M0_PRE(0 <= begin && begin < BE_UT_RA_SIZE);
635  M0_PRE(0 <= end && end <= BE_UT_RA_SIZE);
636  M0_PRE(begin <= end);
637 
638  memcpy(&be_ut_ra_save[begin], rd->rd_reg.br_addr, end - begin);
639 }
640 
641 static void be_ut_reg_area_get(void)
642 {
643  struct m0_be_reg_d *rd;
644 
645  be_ut_reg_area_reset(false);
646  for (rd = m0_be_reg_area_first(&be_ut_ra_reg_area); rd != NULL;
649  }
650 }
651 
652 static void be_ut_reg_area_size_length_check(size_t desired_size,
653  m0_bcount_t desired_length,
654  bool do_check)
655 {
656  struct m0_be_tx_credit used;
657 
659  M0_UT_ASSERT(ergo(do_check, used.tc_reg_nr == desired_size));
660  M0_UT_ASSERT(ergo(do_check, used.tc_reg_size == desired_length));
661 }
662 
663 static void be_ut_reg_area_check(bool do_insert, struct m0_be_reg_d *rd)
664 {
665  struct m0_be_reg_d *rdi;
666  int cmp;
667  m0_bindex_t begin;
668  m0_bindex_t end;
669  m0_bindex_t ibegin;
670  m0_bindex_t iend;
671 
672  if (do_insert) {
674  } else {
676  end = begin + rd->rd_reg.br_size;
678  rdi != NULL;
679  rdi = m0_be_reg_area_next(&be_ut_ra_reg_area, rdi)) {
680  ibegin = be_ut_reg_area_addr2offs(rdi->rd_reg.br_addr);
681  iend = ibegin + rdi->rd_reg.br_size;
682  if (ibegin < begin && end < iend)
683  break;
684  }
685  if (rdi == NULL) {
687  bzero(&be_ut_ra_save[begin], rd->rd_reg.br_size);
688  }
689  }
690  cmp = memcmp(be_ut_ra_save, be_ut_ra_data,
692  M0_UT_ASSERT(cmp == 0);
693 }
694 
695 static void be_ut_reg_area_rand(void)
696 {
697  int i;
698 
699  for (i = 0; i < ARRAY_SIZE(be_ut_ra_reg); ++i)
700  be_ut_ra_reg[i] = m0_rnd64(&be_ut_ra_rand_seed) % 0xFF + 1;
701 }
702 
703 /*
704  * insert = capture
705  * delete = uncapture
706  */
707 /* do operation with range [begin, end) */
708 /* XXX copy-paste from be_ut_regmap_do() */
710  bool do_insert)
711 {
712  struct m0_be_reg_d rd;
713 
714  M0_PRE(0 <= begin && begin < BE_UT_RA_SIZE);
715  M0_PRE(0 <= end && end <= BE_UT_RA_SIZE);
716  M0_PRE(begin <= end);
717 
718  memcpy(be_ut_ra_save, be_ut_ra_data, sizeof be_ut_ra_save);
719 
720  LOGD("\n%s [%lu, %lu)",
721  do_insert ? "capture" : "uncapture", begin, end);
722 
724  rd = (struct m0_be_reg_d ) {
725  .rd_reg = M0_BE_REG(be_ut_ra_seg, end - begin,
726  be_ut_reg_area_offs2addr(begin)),
727  };
728 
729  if (do_insert) {
731  memcpy(rd.rd_reg.br_addr, be_ut_ra_reg, rd.rd_reg.br_size);
733  } else {
735  }
736 
738  be_ut_reg_area_check(do_insert, &rd);
739 }
740 
741 /* XXX FIXME copy-paste from m0_be_ut_regmap_simple */
743 {
744  struct be_ut_test_reg_suite *burs;
745  struct be_ut_test_reg *bur;
746  struct m0_be_ut_seg ut_seg;
747  m0_bindex_t nr;
748  int i;
749  int j;
750 
753 
754  be_ut_ra_rand_seed = 0;
755  for (i = 0; i < ARRAY_SIZE(be_ut_test_regs); ++i) {
756  burs = &be_ut_test_regs[i];
757 
758  nr = 0;
759  for (j = 0; j < burs->trs_nr; ++j)
760  nr += burs->trs_test[j].bur_do_insert;
762 
764  LOGD("\ntesting %s suite\n", burs->trs_name);
765  for (j = 0; j < burs->trs_nr; ++j) {
766  bur = &burs->trs_test[j];
768  bur->bur_do_insert);
770  bur->bur_desired_len,
771  true);
772  }
774  }
775 
777 }
778 
779 /* XXX FIXME copy-paste from m0_be_ut_regmap_random */
781 {
782  struct m0_be_ut_seg ut_seg;
783  m0_bcount_t begin;
784  m0_bcount_t end;
785  unsigned i;
786  uint64_t seed = 0;
787  int do_insert;
788 
791 
793  for (i = 0; i < BE_UT_RA_ITER; ++i) {
794  begin = m0_rnd64(&seed) % (BE_UT_REGMAP_LEN -
795  BE_UT_REGMAP_R_SIZE - 1) + 1;
796  end = begin + m0_rnd64(&seed) % BE_UT_REGMAP_R_SIZE + 1;
797  do_insert = m0_rnd64(&seed) % 2;
798  be_ut_reg_area_do(begin, end, do_insert != 0);
800  }
803 }
804 
805 /* backend UT reg area merge. R == region */
806 enum {
816 };
817 
818 /* #define BE_UT_RA_MERGE_DEBUG */
819 
821 static uint64_t be_ut_ra_merge_seed;
825 
826 /* get random number in range [min, max] */
827 static unsigned be_ut_reg_area_merge_rand(unsigned min, unsigned max)
828 {
829  return m0_rnd64(&be_ut_ra_merge_seed) % (max - min + 1) + min;
830 }
831 
833 {
834  return (uintptr_t) addr - be_ut_ra_merge_seg->bs_reserved -
835  (uintptr_t) be_ut_ra_merge_seg->bs_addr;
836 }
837 
839 {
840  return be_ut_ra_merge_seg->bs_addr +
842 }
843 
845  m0_bindex_t begin,
847  void *buf)
848 {
849  void *addr = be_ut_reg_area_merge_offs2addr(begin);
850 
851  memcpy(addr, buf, size);
852  struct m0_be_reg_d rd = {
854  .rd_buf = NULL,
855  };
856  m0_be_reg_area_capture(ra, &rd);
857 }
858 
859 /* this function is the most tricky part of reg_area merge UT */
861 {
862  static unsigned char random[BE_UT_RA_MERGE_SIZE_TOTAL];
863  m0_bindex_t pos = 0;
864  m0_bindex_t begin;
866  int i;
867  int nr;
868 
869  pos = 0;
870  nr = 0;
871  while (pos < BE_UT_RA_MERGE_SIZE_TOTAL &&
873  begin = pos;
876  for (i = 0; i < size; ++i)
877  random[i] = be_ut_reg_area_merge_rand(1, 0xFF);
878  if (begin + size < BE_UT_RA_MERGE_SIZE_TOTAL)
879  be_ut_reg_area_merge_ra_add(ra, begin, size, random);
880 
881  pos += size;
882  /* skip some space after the region */
885  pos += size;
886  ++nr;
887  }
888 }
889 
890 static void be_ut_reg_area_arr_copy(unsigned char *arr,
891  m0_bcount_t arr_size,
892  struct m0_be_reg_area *ra,
893  bool clear_arr)
894 {
895  struct m0_be_reg_d *rd;
898  int i;
899 
900  if (clear_arr)
901  memset(arr, 0, arr_size);
902 
903  M0_BE_REG_AREA_FORALL(ra, rd) {
905  size = rd->rd_reg.br_size;
906  M0_UT_ASSERT(index >= 0);
907  M0_UT_ASSERT(size > 0);
908  /* it might be integer overflow in (index + size) expression */
909  M0_UT_ASSERT(index < arr_size);
910  M0_UT_ASSERT(size < arr_size);
911  M0_UT_ASSERT(index + size < arr_size);
912  memcpy(&arr[index], rd->rd_buf, size);
913  for (i = 0; i < size; ++i)
914  M0_UT_ASSERT(arr[index + i] != 0);
915  };
916 }
917 
919 {
920 #if BE_UT_RA_MERGE_DEBUG
921  int i;
922 #endif
923 
925  ARRAY_SIZE(be_ut_ra_merge_pre), ra, true);
926 #if BE_UT_RA_MERGE_DEBUG
927  printf("merge_pre: ");
928  for (i = 0; i < ARRAY_SIZE(be_ut_ra_merge_pre); ++i)
929  printf("%4.u", (unsigned) be_ut_ra_merge_pre[i]);
930  printf("\n");
931 #endif
932 }
933 
935 {
936  int i;
937 
941  ra, false);
942 #if BE_UT_RA_MERGE_DEBUG
943  printf("merged: ");
944  for (i = 0; i < ARRAY_SIZE(be_ut_ra_merged); ++i)
945  printf("%4.u", (unsigned) be_ut_ra_merged[i]);
946  printf("\n");
947 #endif
948  for (i = 0; i < ARRAY_SIZE(be_ut_ra_merged); ++i) {
950  be_ut_ra_merged[i] != 0));
951  }
952 }
953 
955 {
956  int cmp;
957 #if BE_UT_RA_MERGE_DEBUG
958  int i;
959 #endif
960 
962  ARRAY_SIZE(be_ut_ra_merge_post), ra, true);
963 #if BE_UT_RA_MERGE_DEBUG
964  printf("merge_post: ");
965  for (i = 0; i < ARRAY_SIZE(be_ut_ra_merge_post); ++i)
966  printf("%4.u", (unsigned) be_ut_ra_merge_post[i]);
967  printf("\n\n");
968 #endif
969  /*
970  * check if arrays merge is equal to merge using
971  * m0_be_reg_area_merge_in().
972  */
975  M0_UT_ASSERT(cmp == 0);
976 }
977 
979 {
980  static struct m0_be_reg_area ra;
981  static struct m0_be_reg_area mra[BE_UT_RA_MERGE_NR]; /* merge ra */
982  struct m0_be_tx_credit prepared_ra = {};
983  struct m0_be_tx_credit prepared_mra;
984  struct m0_be_ut_seg ut_seg;
985 #if BE_UT_RA_MERGE_DEBUG
986  unsigned char mra_arr[BE_UT_RA_MERGE_SIZE_TOTAL];
987  int k;
988 #endif
989  int i;
990  int j;
991  int rc;
992 
995 
998  m0_be_tx_credit_mac(&prepared_ra, &prepared_mra, BE_UT_RA_MERGE_NR);
999 
1000  rc = m0_be_reg_area_init(&ra, &prepared_ra, M0_BE_REG_AREA_DATA_NOCOPY);
1001  M0_UT_ASSERT(rc == 0);
1002  for (i = 0; i < ARRAY_SIZE(mra); ++i) {
1003  m0_be_reg_area_init(&mra[i], &prepared_mra,
1005  M0_UT_ASSERT(rc == 0);
1006  }
1007 
1008  be_ut_ra_merge_seed = 0;
1009  for (j = 0; j < BE_UT_RA_MERGE_ITER; ++j) {
1010  /* reset all data structures */
1011  m0_be_reg_area_reset(&ra);
1012  for (i = 0; i < ARRAY_SIZE(mra); ++i)
1013  m0_be_reg_area_reset(&mra[i]);
1014  /* create random reg_areas */
1015  for (i = 0; i < ARRAY_SIZE(mra); ++i)
1017  /* merge it with ra */
1018  for (i = 0; i < ARRAY_SIZE(mra); ++i) {
1019 #if BE_UT_RA_MERGE_DEBUG
1020  printf("i = %d\n", i);
1021  be_ut_reg_area_arr_copy(mra_arr, ARRAY_SIZE(mra_arr),
1022  &mra[i], true);
1023  printf("mra_arr: ");
1024  for (k = 0; k < ARRAY_SIZE(mra_arr); ++k)
1025  printf("%4.u", (unsigned) mra_arr[k]);
1026  printf("\n");
1027 #endif
1029  m0_be_reg_area_merge_in(&ra, &mra[i]);
1030  be_ut_reg_area_merge_in(&mra[i]);
1032  }
1033  }
1034 
1035  m0_be_reg_area_fini(&ra);
1036  for (i = 0; i < ARRAY_SIZE(mra); ++i)
1037  m0_be_reg_area_fini(&mra[i]);
1038 
1040 }
1041 
1042 /*
1043  * Local variables:
1044  * c-indentation-style: "K&R"
1045  * c-basic-offset: 8
1046  * tab-width: 8
1047  * fill-column: 80
1048  * scroll-step: 1
1049  * End:
1050  */
1051 /*
1052  * vim: tabstop=8 shiftwidth=8 noexpandtab textwidth=80 nowrap
1053  */
void * bs_addr
Definition: seg.h:71
void m0_be_ut_seg_fini(struct m0_be_ut_seg *ut_seg)
Definition: stubs.c:267
M0_INTERNAL struct m0_be_reg_d * m0_be_rdt_next(const struct m0_be_reg_d_tree *rdt, struct m0_be_reg_d *prev)
Definition: tx_regmap.c:314
static size_t nr
Definition: dump.c:1505
m0_bcount_t bur_desired_len
Definition: tx_regmap.c:149
#define M0_PRE(cond)
M0_INTERNAL struct m0_be_reg_d * m0_be_regmap_first(struct m0_be_regmap *rm)
Definition: tx_regmap.c:527
struct m0_be_reg_d ur_rd
Definition: tx_regmap.c:46
M0_INTERNAL struct m0_be_reg_d * m0_be_rdt_del(struct m0_be_reg_d_tree *rdt, const struct m0_be_reg_d *rd)
Definition: tx_regmap.c:347
void m0_be_ut_regmap_simple(void)
Definition: tx_regmap.c:519
static void be_ut_regmap_data_cmp(const struct m0_be_reg_d *r, unsigned desired, bool nop)
Definition: tx_regmap.c:395
static struct be_ut_rdt_reg_d be_ut_rdt_rd[BE_UT_RDT_SIZE]
Definition: tx_regmap.c:50
static void be_ut_reg_area_fill(struct m0_be_reg_d *rd)
Definition: tx_regmap.c:616
static void be_ut_reg_area_init(m0_bindex_t nr)
Definition: tx_regmap.c:600
#define NULL
Definition: misc.h:38
static void be_ut_regmap_del(void *data, const struct m0_be_reg_d *rd)
Definition: tx_regmap.c:318
void m0_be_ut_regmap_random(void)
Definition: tx_regmap.c:544
M0_INTERNAL struct m0_be_reg_d * m0_be_reg_area_first(struct m0_be_reg_area *ra)
Definition: tx_regmap.c:814
#define ergo(a, b)
Definition: misc.h:293
struct be_ut_test_reg * trs_test
Definition: tx_regmap.c:154
static void be_ut_reg_area_merge_rand_ra(struct m0_be_reg_area *ra)
Definition: tx_regmap.c:860
static void be_ut_reg_area_rand(void)
Definition: tx_regmap.c:695
static int be_ut_rdt_del_find(int index)
Definition: tx_regmap.c:60
M0_INTERNAL void m0_be_regmap_del(struct m0_be_regmap *rm, const struct m0_be_reg_d *rd)
Definition: tx_regmap.c:493
M0_INTERNAL void m0_be_rdt_fini(struct m0_be_reg_d_tree *rdt)
Definition: tx_regmap.c:218
static char be_ut_ra_save[BE_UT_RA_SIZE]
Definition: tx_regmap.c:574
struct m0_be_seg * bus_seg
Definition: helper.h:119
static void be_ut_regmap_do(m0_bcount_t begin, m0_bcount_t end, bool do_insert)
Definition: tx_regmap.c:484
M0_INTERNAL int m0_be_regmap_init(struct m0_be_regmap *rm, const struct m0_be_regmap_ops *ops, void *ops_data, size_t size_max, bool split_on_absorb)
Definition: tx_regmap.c:378
struct m0_bufvec data
Definition: di.c:40
static void be_ut_reg_area_fill_save(struct m0_be_reg_d *rd)
Definition: tx_regmap.c:629
int const char const void * value
Definition: dir.c:325
M0_INTERNAL void m0_be_regmap_add(struct m0_be_regmap *rm, struct m0_be_reg_d *rd)
Definition: tx_regmap.c:458
static void be_ut_regmap_add(void *data, struct m0_be_reg_d *rd)
Definition: tx_regmap.c:312
m0_bcount_t br_size
Definition: seg.h:144
uint64_t m0_bindex_t
Definition: types.h:80
struct m0_be_ut_seg ut_seg
Definition: ad.c:73
static unsigned char be_ut_ra_merge_pre[BE_UT_RA_MERGE_SIZE_TOTAL]
Definition: tx_regmap.c:822
void m0_be_ut_seg_init(struct m0_be_ut_seg *ut_seg, struct m0_be_ut_backend *ut_be, m0_bcount_t size)
Definition: stubs.c:256
uint64_t m0_bcount_t
Definition: types.h:77
static void be_ut_rm_fill(const struct m0_be_reg_d *rd, unsigned value, bool fill_reg)
Definition: tx_regmap.c:304
static struct m0_be_reg_d_tree be_ut_rdt
Definition: tx_regmap.c:51
static void be_ut_regmap_cut(void *data, struct m0_be_reg_d *rd, m0_bcount_t cut_at_start, m0_bcount_t cut_at_end)
Definition: tx_regmap.c:332
bool ur_inserted
Definition: tx_regmap.c:47
#define M0_SET0(obj)
Definition: misc.h:64
#define M0_BE_REG(seg, size, addr)
Definition: seg.h:148
static void be_ut_reg_area_merge_ra_add(struct m0_be_reg_area *ra, m0_bindex_t begin, m0_bcount_t size, void *buf)
Definition: tx_regmap.c:844
Definition: sock.c:887
void(* rmo_add)(void *data, struct m0_be_reg_d *rd)
Definition: tx_regmap.h:79
m0_bcount_t bs_reserved
Definition: seg.h:74
M0_INTERNAL void m0_be_reg_area_capture(struct m0_be_reg_area *ra, struct m0_be_reg_d *rd)
Definition: tx_regmap.c:751
static struct m0_be_regmap be_ut_rm_regmap
Definition: tx_regmap.c:278
#define M0_BE_REG_AREA_FORALL(ra, rd)
Definition: tx_regmap.h:299
static unsigned char be_ut_ra_merged[BE_UT_RA_MERGE_SIZE_TOTAL]
Definition: tx_regmap.c:823
M0_INTERNAL void m0_be_reg_area_fini(struct m0_be_reg_area *ra)
Definition: tx_regmap.c:602
static m0_bindex_t be_ut_reg_area_addr2offs(void *addr)
Definition: tx_regmap.c:578
M0_INTERNAL int m0_be_reg_area_init(struct m0_be_reg_area *ra, const struct m0_be_tx_credit *prepared, enum m0_be_reg_area_type type)
Definition: tx_regmap.c:559
struct m0_be_reg rd_reg
Definition: tx_regmap.h:53
#define equi(a, b)
Definition: misc.h:297
#define M0_BE_TX_CREDIT(nr, size)
Definition: tx_credit.h:94
static void be_ut_reg_area_reset(bool reset_save)
Definition: tx_regmap.c:589
M0_INTERNAL size_t m0_be_regmap_size(const struct m0_be_regmap *rm)
Definition: tx_regmap.c:538
static char * addr
Definition: node_k.c:37
static void be_ut_reg_area_fini(void)
Definition: tx_regmap.c:611
int i
Definition: dir.c:1033
M0_INTERNAL void m0_be_reg_area_reset(struct m0_be_reg_area *ra)
Definition: tx_regmap.c:797
#define LOGD(...)
Definition: tx_regmap.c:37
static unsigned be_ut_rm_data_copy[BE_UT_REGMAP_LEN]
Definition: tx_regmap.c:282
M0_INTERNAL struct m0_be_reg_d * m0_be_reg_area_next(struct m0_be_reg_area *ra, struct m0_be_reg_d *prev)
Definition: tx_regmap.c:820
size_t bur_desired_nr
Definition: tx_regmap.c:148
static void * be_ut_reg_area_merge_offs2addr(m0_bindex_t offs)
Definition: tx_regmap.c:838
M0_INTERNAL void m0_be_reg_area_used(struct m0_be_reg_area *ra, struct m0_be_tx_credit *used)
Definition: tx_regmap.c:616
M0_INTERNAL int m0_be_rdt_init(struct m0_be_reg_d_tree *rdt, size_t size_max)
Definition: tx_regmap.c:207
static struct m0_be_reg_area be_ut_ra_reg_area
Definition: tx_regmap.c:571
static void be_ut_reg_area_get(void)
Definition: tx_regmap.c:641
M0_INTERNAL bool m0_be_reg_d__invariant(const struct m0_be_reg_d *rd)
Definition: tx_regmap.c:50
static void be_ut_regmap_fini(void)
Definition: tx_regmap.c:375
static struct be_ut_test_reg_suite be_ut_test_regs[]
Definition: tx_regmap.c:243
if(value==NULL)
Definition: dir.c:350
static void be_ut_reg_area_merge_post(struct m0_be_reg_area *ra)
Definition: tx_regmap.c:954
M0_INTERNAL void m0_be_tx_credit_mac(struct m0_be_tx_credit *c, const struct m0_be_tx_credit *c1, m0_bcount_t k)
Definition: tx_credit.c:88
void m0_be_ut_reg_area_simple(void)
Definition: tx_regmap.c:742
bool bur_do_insert
Definition: tx_regmap.c:147
static const struct m0_be_regmap_ops be_ut_regmap_ops
Definition: tx_regmap.c:352
static void be_ut_regmap_size_length_check(size_t desired_size, m0_bcount_t desired_length, bool do_check)
Definition: tx_regmap.c:427
void m0_be_ut_reg_area_random(void)
Definition: tx_regmap.c:780
static bool be_ut_regmap_nop(m0_bcount_t begin, m0_bcount_t end, bool do_insert)
Definition: tx_regmap.c:463
#define BUT_TR(begin, end, do_insert, desired_nr, desired_len)
Definition: tx_regmap.c:158
static long long max(long long a, long long b)
Definition: crate.c:196
static void be_ut_reg_area_merge_pre(struct m0_be_reg_area *ra)
Definition: tx_regmap.c:918
static unsigned be_ut_rm_reg[BE_UT_REGMAP_LEN]
Definition: tx_regmap.c:281
static unsigned be_ut_rm_iteration
Definition: tx_regmap.c:283
static int cmp(const struct m0_ut_suite **s0, const struct m0_ut_suite **s1)
Definition: ut.c:654
static uint64_t be_ut_ra_merge_seed
Definition: tx_regmap.c:821
static void be_ut_reg_area_do(m0_bcount_t begin, m0_bcount_t end, bool do_insert)
Definition: tx_regmap.c:709
Definition: xcode.h:73
M0_INTERNAL void m0_be_reg_area_merge_in(struct m0_be_reg_area *ra, struct m0_be_reg_area *src)
Definition: tx_regmap.c:787
M0_INTERNAL size_t m0_be_rdt_size(const struct m0_be_reg_d_tree *rdt)
Definition: tx_regmap.c:241
static void be_ut_reg_area_check(bool do_insert, struct m0_be_reg_d *rd)
Definition: tx_regmap.c:663
static void be_ut_regmap_init(void)
Definition: tx_regmap.c:359
M0_INTERNAL struct m0_be_reg_d * m0_be_regmap_next(struct m0_be_regmap *rm, struct m0_be_reg_d *prev)
Definition: tx_regmap.c:532
Definition: seg.h:66
static const unsigned be_ut_rm_unused
Definition: tx_regmap.c:279
static void * be_ut_reg_area_offs2addr(m0_bindex_t offs)
Definition: tx_regmap.c:583
static unsigned char be_ut_ra_merge_post[BE_UT_RA_MERGE_SIZE_TOTAL]
Definition: tx_regmap.c:824
static void be_ut_regmap_cpy(void *data, const struct m0_be_reg_d *super, const struct m0_be_reg_d *rd)
Definition: tx_regmap.c:324
void m0_be_ut_reg_d_tree(void)
Definition: tx_regmap.c:91
static int used
Definition: base.c:304
static void be_ut_regmap_data_copy(void)
Definition: tx_regmap.c:380
static struct m0_be_seg * be_ut_ra_merge_seg
Definition: tx_regmap.c:820
M0_INTERNAL void m0_be_reg_area_uncapture(struct m0_be_reg_area *ra, const struct m0_be_reg_d *rd)
Definition: tx_regmap.c:775
m0_bcount_t bur_begin
Definition: tx_regmap.c:145
M0_INTERNAL void m0_be_rdt_ins(struct m0_be_reg_d_tree *rdt, const struct m0_be_reg_d *rd)
Definition: tx_regmap.c:328
static long long min(long long a, long long b)
Definition: crate.c:191
static void be_ut_reg_area_merge_in(struct m0_be_reg_area *ra)
Definition: tx_regmap.c:934
M0_INTERNAL uint64_t m0_rnd64(uint64_t *seed)
Definition: misc.c:100
static unsigned be_ut_reg_area_merge_rand(unsigned min, unsigned max)
Definition: tx_regmap.c:827
static void be_ut_rm_fill2(uintptr_t addr, m0_bcount_t size, unsigned value, bool fill_reg)
Definition: tx_regmap.c:286
static struct m0_be_seg * be_ut_ra_seg
Definition: tx_regmap.c:572
#define BUT_TRS(name)
Definition: tx_regmap.c:172
static int r[NR]
Definition: thread.c:46
struct read_size r_size
static bool be_ut_reg_d_is_equal(const struct m0_be_reg_d *rd1, const struct m0_be_reg_d *rd2)
Definition: tx_regmap.c:53
static void be_ut_reg_area_arr_copy(unsigned char *arr, m0_bcount_t arr_size, struct m0_be_reg_area *ra, bool clear_arr)
Definition: tx_regmap.c:890
void * rd_buf
Definition: tx_regmap.h:58
static void be_ut_reg_d_tree_check(void)
Definition: tx_regmap.c:71
m0_bcount_t size
Definition: di.c:39
static void be_ut_regmap_print_d(unsigned d, int i)
Definition: tx_regmap.c:385
m0_bcount_t bur_end
Definition: tx_regmap.c:146
#define DEFINE_BUT_TRA(name,...)
Definition: tx_regmap.c:169
M0_INTERNAL bool m0_be_reg_d_is_in(const struct m0_be_reg_d *rd, void *ptr)
Definition: tx_regmap.c:62
static char be_ut_ra_reg[BE_UT_RA_SIZE]
Definition: tx_regmap.c:576
static void be_ut_reg_area_size_length_check(size_t desired_size, m0_bcount_t desired_length, bool do_check)
Definition: tx_regmap.c:652
static uint64_t be_ut_ra_rand_seed
Definition: tx_regmap.c:573
M0_INTERNAL struct m0_be_reg_d * m0_be_rdt_find(const struct m0_be_reg_d_tree *rdt, void *addr)
Definition: tx_regmap.c:299
static unsigned be_ut_rm_data[BE_UT_REGMAP_LEN]
Definition: tx_regmap.c:280
M0_INTERNAL void m0_be_regmap_fini(struct m0_be_regmap *rm)
Definition: tx_regmap.c:395
void * br_addr
Definition: seg.h:145
int32_t rc
Definition: trigger_fop.h:47
#define ARRAY_SIZE(a)
Definition: misc.h:45
static char be_ut_ra_data[BE_UT_RA_SIZE]
Definition: tx_regmap.c:575
#define M0_UT_ASSERT(a)
Definition: ut.h:46
static void * be_ut_rm_ops_data
Definition: tx_regmap.c:284
void m0_be_ut_reg_area_merge(void)
Definition: tx_regmap.c:978
static m0_bindex_t be_ut_reg_area_merge_addr2offs(void *addr)
Definition: tx_regmap.c:832