Motr  M0
tx_regmap.h
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 #pragma once
24 #ifndef __MOTR_BE_TX_REGMAP_H__
25 #define __MOTR_BE_TX_REGMAP_H__
26 
27 #include "lib/time.h" /* m0_time_t */
28 
29 #include "be/seg.h" /* m0_be_reg */
30 #include "be/tx_credit.h" /* m0_be_tx_credit */
31 
32 struct m0_ext;
33 struct m0_be_op;
34 struct m0_be_io;
35 
49 struct m0_be_reg_d {
53  struct m0_be_reg rd_reg;
58  void *rd_buf;
64  unsigned long rd_gen_idx;
65 };
66 
67 #define M0_BE_REG_D(reg, buf) (struct m0_be_reg_d) \
68  { .rd_reg = (reg), .rd_buf = (buf) }
69 #define M0_BE_REG_D_CREDIT(rd) M0_BE_TX_CREDIT(1, (rd)->rd_reg.br_size)
70 
73  size_t brt_size;
74  size_t brt_size_max;
75  struct m0_be_reg_d *brt_r;
76 };
77 
79  void (*rmo_add)(void *data, struct m0_be_reg_d *rd);
80  void (*rmo_del)(void *data, const struct m0_be_reg_d *rd);
81  void (*rmo_cpy)(void *data, const struct m0_be_reg_d *super,
82  const struct m0_be_reg_d *rd);
83  void (*rmo_cut)(void *data, struct m0_be_reg_d *rd,
84  m0_bcount_t cut_at_start, m0_bcount_t cut_at_end);
85  void (*rmo_split)(void *data,
86  struct m0_be_reg_d *rd,
87  struct m0_be_reg_d *rd_new);
88 };
89 
90 struct m0_be_regmap {
92  const struct m0_be_regmap_ops *br_ops;
93  void *br_ops_data;
95 };
96 
97 M0_INTERNAL bool m0_be_reg_d__invariant(const struct m0_be_reg_d *rd);
98 M0_INTERNAL bool m0_be_reg_d_is_in(const struct m0_be_reg_d *rd, void *ptr);
99 
116 M0_INTERNAL int m0_be_rdt_init(struct m0_be_reg_d_tree *rdt, size_t size_max);
118 M0_INTERNAL void m0_be_rdt_fini(struct m0_be_reg_d_tree *rdt);
119 M0_INTERNAL bool m0_be_rdt__invariant(const struct m0_be_reg_d_tree *rdt);
121 M0_INTERNAL size_t m0_be_rdt_size(const struct m0_be_reg_d_tree *rdt);
122 
132 M0_INTERNAL struct m0_be_reg_d *
133 m0_be_rdt_find(const struct m0_be_reg_d_tree *rdt, void *addr);
143 M0_INTERNAL struct m0_be_reg_d *
144 m0_be_rdt_next(const struct m0_be_reg_d_tree *rdt, struct m0_be_reg_d *prev);
145 
153 M0_INTERNAL void m0_be_rdt_ins(struct m0_be_reg_d_tree *rdt,
154  const struct m0_be_reg_d *rd);
164 M0_INTERNAL struct m0_be_reg_d *m0_be_rdt_del(struct m0_be_reg_d_tree *rdt,
165  const struct m0_be_reg_d *rd);
166 
167 M0_INTERNAL void m0_be_rdt_reset(struct m0_be_reg_d_tree *rdt);
168 
169 /*
170  * Initialises regmap.
171  *
172  * @param split_on_absorb controls regmap behavior when new region is added to
173  * regmap and an existing region in regmap completely
174  * contains the new.
175  *
176  * If split_on_absorb is true then existing region is splitted into 2 regions
177  * (if it is possible), and new region is inserted between them.
178  * If split_on_absorb is false then new region is "copied" into the old one,
179  * so no new regions are added to the reg_d tree.
180  */
181 M0_INTERNAL int
183  const struct m0_be_regmap_ops *ops,
184  void *ops_data,
185  size_t size_max,
186  bool split_on_absorb);
187 M0_INTERNAL void m0_be_regmap_fini(struct m0_be_regmap *rm);
188 M0_INTERNAL bool m0_be_regmap__invariant(const struct m0_be_regmap *rm);
189 
190 /* XXX add const */
191 M0_INTERNAL void m0_be_regmap_add(struct m0_be_regmap *rm,
192  struct m0_be_reg_d *rd);
193 M0_INTERNAL void m0_be_regmap_del(struct m0_be_regmap *rm,
194  const struct m0_be_reg_d *rd);
195 
196 M0_INTERNAL struct m0_be_reg_d *m0_be_regmap_first(struct m0_be_regmap *rm);
197 M0_INTERNAL struct m0_be_reg_d *m0_be_regmap_next(struct m0_be_regmap *rm,
198  struct m0_be_reg_d *prev);
199 M0_INTERNAL size_t m0_be_regmap_size(const struct m0_be_regmap *rm);
200 
201 M0_INTERNAL void m0_be_regmap_reset(struct m0_be_regmap *rm);
202 
226 };
227 
239  // bool bra_data_copy;
240  char *bra_area;
248 };
249 
264 M0_INTERNAL int m0_be_reg_area_init(struct m0_be_reg_area *ra,
265  const struct m0_be_tx_credit *prepared,
267 M0_INTERNAL void m0_be_reg_area_fini(struct m0_be_reg_area *ra);
268 M0_INTERNAL bool m0_be_reg_area__invariant(const struct m0_be_reg_area *ra);
269 
270 M0_INTERNAL void m0_be_reg_area_used(struct m0_be_reg_area *ra,
271  struct m0_be_tx_credit *used);
272 M0_INTERNAL void m0_be_reg_area_prepared(struct m0_be_reg_area *ra,
273  struct m0_be_tx_credit *prepared);
274 M0_INTERNAL void m0_be_reg_area_captured(struct m0_be_reg_area *ra,
275  struct m0_be_tx_credit *captured);
276 
277 M0_INTERNAL void m0_be_reg_area_capture(struct m0_be_reg_area *ra,
278  struct m0_be_reg_d *rd);
279 M0_INTERNAL void m0_be_reg_area_uncapture(struct m0_be_reg_area *ra,
280  const struct m0_be_reg_d *rd);
281 
282 M0_INTERNAL void m0_be_reg_area_merge_in(struct m0_be_reg_area *ra,
283  struct m0_be_reg_area *src);
284 
285 M0_INTERNAL void m0_be_reg_area_reset(struct m0_be_reg_area *ra);
286 
287 /*
288  * Try to reduce used space of reg_area by removing unused space
289  * between captured regions and/or regions reordering/merging inside reg_area.
290  *
291  * @note XXX not implemented yet.
292  */
293 M0_INTERNAL void m0_be_reg_area_optimize(struct m0_be_reg_area *ra);
294 
295 M0_INTERNAL struct m0_be_reg_d *m0_be_reg_area_first(struct m0_be_reg_area *ra);
296 M0_INTERNAL struct m0_be_reg_d *
297 m0_be_reg_area_next(struct m0_be_reg_area *ra, struct m0_be_reg_d *prev);
298 
299 #define M0_BE_REG_AREA_FORALL(ra, rd) \
300  for ((rd) = m0_be_reg_area_first(ra); \
301  (rd) != NULL; \
302  (rd) = m0_be_reg_area_next((ra), (rd)))
303 
304 /*
305  * Merger merges multiple reg_areas (sources) into one (destination) by the
306  * following rules:
307  * - if a region is in some source reg_area then the region is in the
308  * destination reg_area;
309  * - destination reg_area contains regions with largest generation index among
310  * all source reg_areas.
311  */
317 };
318 
319 M0_INTERNAL int
321  int reg_area_nr_max);
322 M0_INTERNAL void m0_be_reg_area_merger_fini(struct m0_be_reg_area_merger *brm);
323 M0_INTERNAL void m0_be_reg_area_merger_reset(struct m0_be_reg_area_merger *brm);
324 
325 M0_INTERNAL void m0_be_reg_area_merger_add(struct m0_be_reg_area_merger *brm,
326  struct m0_be_reg_area *ra);
327 M0_INTERNAL void
329  struct m0_be_reg_area *ra);
330 
332 #endif /* __MOTR_BE_TX_REGMAP_H__ */
333 
334 /*
335  * Local variables:
336  * c-indentation-style: "K&R"
337  * c-basic-offset: 8
338  * tab-width: 8
339  * fill-column: 80
340  * scroll-step: 1
341  * End:
342  */
343 /*
344  * vim: tabstop=8 shiftwidth=8 noexpandtab textwidth=80 nowrap
345  */
static void ptr(struct m0_addb2__context *ctx, const uint64_t *v, char *buf)
Definition: dump.c:440
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
struct m0_be_reg_d ** brm_pos
Definition: tx_regmap.h:316
M0_INTERNAL struct m0_be_reg_d * m0_be_regmap_first(struct m0_be_regmap *rm)
Definition: tx_regmap.c:527
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
bool br_split_on_absorb
Definition: tx_regmap.h:94
M0_INTERNAL struct m0_be_reg_d * m0_be_reg_area_first(struct m0_be_reg_area *ra)
Definition: tx_regmap.c:814
M0_INTERNAL int m0_be_reg_area_merger_init(struct m0_be_reg_area_merger *brm, int reg_area_nr_max)
Definition: tx_regmap.c:826
unsigned long rd_gen_idx
Definition: tx_regmap.h:64
size_t brt_size_max
Definition: tx_regmap.h:74
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 bool m0_be_reg_area__invariant(const struct m0_be_reg_area *ra)
Definition: tx_regmap.c:609
struct m0_be_tx_credit bra_prepared
Definition: tx_regmap.h:242
M0_INTERNAL void m0_be_rdt_fini(struct m0_be_reg_d_tree *rdt)
Definition: tx_regmap.c:218
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
M0_INTERNAL void m0_be_regmap_add(struct m0_be_regmap *rm, struct m0_be_reg_d *rd)
Definition: tx_regmap.c:458
uint64_t m0_bcount_t
Definition: types.h:77
M0_INTERNAL void m0_be_reg_area_merger_add(struct m0_be_reg_area_merger *brm, struct m0_be_reg_area *ra)
Definition: tx_regmap.c:857
struct m0_be_reg_d * brt_r
Definition: tx_regmap.h:75
void * br_ops_data
Definition: tx_regmap.h:93
m0_bcount_t bra_area_used
Definition: tx_regmap.h:241
void(* rmo_add)(void *data, struct m0_be_reg_d *rd)
Definition: tx_regmap.h:79
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
M0_INTERNAL void m0_be_reg_area_fini(struct m0_be_reg_area *ra)
Definition: tx_regmap.c:602
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
enum m0_be_reg_area_type bra_type
Definition: tx_regmap.h:238
M0_INTERNAL size_t m0_be_regmap_size(const struct m0_be_regmap *rm)
Definition: tx_regmap.c:538
M0_INTERNAL void m0_be_reg_area_reset(struct m0_be_reg_area *ra)
Definition: tx_regmap.c:797
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
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
M0_INTERNAL bool m0_be_reg_d__invariant(const struct m0_be_reg_d *rd)
Definition: tx_regmap.c:50
char * bra_area
Definition: tx_regmap.h:240
struct m0_be_tx_credit bra_captured
Definition: tx_regmap.h:247
size_t brt_size
Definition: tx_regmap.h:73
M0_INTERNAL void m0_be_reg_area_merger_merge_to(struct m0_be_reg_area_merger *brm, struct m0_be_reg_area *ra)
Definition: tx_regmap.c:894
const struct m0_be_regmap_ops * br_ops
Definition: tx_regmap.h:92
void(* rmo_del)(void *data, const struct m0_be_reg_d *rd)
Definition: tx_regmap.h:80
M0_INTERNAL void m0_be_reg_area_captured(struct m0_be_reg_area *ra, struct m0_be_tx_credit *captured)
Definition: tx_regmap.c:637
Definition: xcode.h:73
M0_INTERNAL bool m0_be_regmap__invariant(const struct m0_be_regmap *rm)
Definition: tx_regmap.c:401
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
void(* rmo_cpy)(void *data, const struct m0_be_reg_d *super, const struct m0_be_reg_d *rd)
Definition: tx_regmap.h:81
M0_INTERNAL void m0_be_reg_area_optimize(struct m0_be_reg_area *ra)
Definition: tx_regmap.c:808
struct m0_be_reg_d_tree br_rdt
Definition: tx_regmap.h:91
M0_INTERNAL void m0_be_reg_area_merger_reset(struct m0_be_reg_area_merger *brm)
Definition: tx_regmap.c:852
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
M0_INTERNAL bool m0_be_rdt__invariant(const struct m0_be_reg_d_tree *rdt)
Definition: tx_regmap.c:224
Definition: seg.h:142
static int used
Definition: base.c:304
M0_INTERNAL void m0_be_reg_area_merger_fini(struct m0_be_reg_area_merger *brm)
Definition: tx_regmap.c:846
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_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
void(* rmo_split)(void *data, struct m0_be_reg_d *rd, struct m0_be_reg_d *rd_new)
Definition: tx_regmap.h:85
Definition: ext.h:37
M0_INTERNAL void m0_be_reg_area_prepared(struct m0_be_reg_area *ra, struct m0_be_tx_credit *prepared)
Definition: tx_regmap.c:629
void * rd_buf
Definition: tx_regmap.h:58
struct m0_be_reg_area ** brm_reg_areas
Definition: tx_regmap.h:315
M0_INTERNAL bool m0_be_reg_d_is_in(const struct m0_be_reg_d *rd, void *ptr)
Definition: tx_regmap.c:62
Definition: io.h:87
M0_INTERNAL void m0_be_rdt_reset(struct m0_be_reg_d_tree *rdt)
Definition: tx_regmap.c:367
m0_be_reg_area_type
Definition: tx_regmap.h:208
struct m0_be_regmap bra_map
Definition: tx_regmap.h:237
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
int type
Definition: dir.c:1031
struct m0_fom_ops ops
Definition: io_foms.c:623
Definition: op.h:74
M0_INTERNAL void m0_be_regmap_fini(struct m0_be_regmap *rm)
Definition: tx_regmap.c:395
struct m0_pdclust_src_addr src
Definition: fd.c:108
void(* rmo_cut)(void *data, struct m0_be_reg_d *rd, m0_bcount_t cut_at_start, m0_bcount_t cut_at_end)
Definition: tx_regmap.h:83
M0_INTERNAL void m0_be_regmap_reset(struct m0_be_regmap *rm)
Definition: tx_regmap.c:544