25 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_BE 61 return buf->b_addr ==
NULL ? -ENOMEM : 0;
89 for (pos = 0;
rc == 0 && pos < ls_size;
116 header->fsh_rbuf_size_aligned);
121 return header->fsh_size > 0 &&
122 header->fsh_rbuf_nr > 0 &&
123 header->fsh_cbuf_offset >=
125 header->fsh_rbuf_size_aligned &&
137 ls->ls_header.fsh_rbuf_size_aligned);
199 for (
i =
nr - 1;
i >= 0; --
i)
214 for (
i = 0;
i <
ls->ls_header.fsh_rbuf_nr; ++
i) {
250 ls->ls_stob_destroyed =
false;
251 ls->ls_offset_discarded = 0;
254 if (
ls->ls_create_mode) {
257 ls->ls_cfg.lsc_stob_domain_location,
258 ls->ls_cfg.lsc_stob_domain_init_cfg,
259 &
ls->ls_stob_domain);
262 else if (
rc == -ENOENT)
265 ls->ls_cfg.lsc_stob_domain_location,
266 ls->ls_cfg.lsc_stob_domain_init_cfg,
267 ls->ls_cfg.lsc_stob_domain_key,
268 ls->ls_cfg.lsc_stob_domain_create_cfg,
269 &
ls->ls_stob_domain);
272 ls->ls_cfg.lsc_stob_domain_init_cfg,
273 &
ls->ls_stob_domain);
297 if (
ls->ls_create_mode) {
299 ls->ls_cfg.lsc_stob_create_cfg);
304 if (
ls->ls_create_mode) {
306 !
ls->ls_cfg.lsc_stob_dont_zero));
307 return ls->ls_cfg.lsc_stob_dont_zero ? 0 :
312 return m0_be_fmt_log_store_header_init(&
ls->ls_header,
316 size = m0_be_fmt_log_store_header_size_max(
NULL);
322 if (!
ls->ls_create_mode)
325 alignment = 1ULL << shift;
326 size = m0_be_fmt_log_store_header_size_max(
NULL);
330 header->fsh_size =
ls->ls_cfg.lsc_size;
331 header->fsh_rbuf_offset = header_size;
332 header->fsh_rbuf_nr =
ls->ls_cfg.lsc_rbuf_nr;
333 header->fsh_rbuf_size =
ls->ls_cfg.lsc_rbuf_size;
338 header->fsh_rbuf_size_aligned;
344 if (!
ls->ls_create_mode)
346 return m0_be_fmt_log_store_header_encode_buf(
347 &
ls->ls_header, &
ls->ls_header_buf);
349 buf = &
ls->ls_header_buf;
352 buf->b_addr, 0,
buf->b_nob);
354 if (
ls->ls_create_mode)
356 rc = m0_be_fmt_log_store_header_decode_buf(&
header,
361 m0_be_fmt_log_store_header_decoded_free(
header);
364 alignment = 1ULL << shift;
376 if (
ls->ls_rbuf_write_lio ==
NULL ||
377 ls->ls_rbuf_write_op ==
NULL ||
378 ls->ls_rbuf_read_lio ==
NULL ||
379 ls->ls_rbuf_read_op ==
NULL ||
380 ls->ls_rbuf_read_buf ==
NULL) {
406 if (
ls->ls_destroy_mode) {
414 if (!
ls->ls_stob_destroyed)
420 if (
ls->ls_destroy_mode) {
423 ls->ls_stob_destroyed =
true;
429 m0_be_fmt_log_store_header_fini(&
ls->ls_header);
454 .
ml_name =
"M0_BE_LOG_STORE_LEVEL_ASSIGNS",
459 .ml_name =
"M0_BE_LOG_STORE_LEVEL_STOB_DOMAIN",
464 .ml_name =
"M0_BE_LOG_STORE_LEVEL_STOB_FIND",
469 .ml_name =
"M0_BE_LOG_STORE_LEVEL_STOB_LOCATE",
474 .ml_name =
"M0_BE_LOG_STORE_LEVEL_STOB_CREATE",
479 .ml_name =
"M0_BE_LOG_STORE_LEVEL_ZERO",
484 .ml_name =
"M0_BE_LOG_STORE_LEVEL_LS_HEADER_INIT",
489 .ml_name =
"M0_BE_LOG_STORE_LEVEL_LS_HEADER_BUF_ALLOC",
494 .ml_name =
"M0_BE_LOG_STORE_LEVEL_HEADER_CREATE",
499 .ml_name =
"M0_BE_LOG_STORE_LEVEL_HEADER_ENCODE",
504 .ml_name =
"M0_BE_LOG_STORE_LEVEL_HEADER_IO",
509 .ml_name =
"M0_BE_LOG_STORE_LEVEL_HEADER_DECODE",
514 .ml_name =
"M0_BE_LOG_STORE_LEVEL_RBUF_ARR_ALLOC",
519 .ml_name =
"M0_BE_LOG_STORE_LEVEL_RBUF_INIT",
524 .ml_name =
"M0_BE_LOG_STORE_LEVEL_RBUF_ASSIGN",
529 .ml_name =
"fully initialized",
541 ls->ls_cfg = *ls_cfg;
542 ls->ls_create_mode = create_mode;
552 ls->ls_destroy_mode = destroy_mode;
598 return ls->ls_header.fsh_cbuf_size;
611 if (
offset >=
ls->ls_offset_discarded) {
612 *length =
ls->ls_header.fsh_cbuf_size;
633 return ls->ls_header.fsh_cbuf_offset +
634 position %
ls->ls_header.fsh_cbuf_size;
647 ls->ls_header.fsh_cbuf_offset,
648 ls->ls_header.fsh_cbuf_size);
653 M0_INTERNAL
struct m0_buf *
656 return &
ls->ls_rbuf_write_buf;
659 M0_INTERNAL
struct m0_buf *
664 return &
ls->ls_rbuf_read_buf[*iter];
667 M0_INTERNAL
struct m0_buf *
671 return ++*iter ==
ls->ls_header.fsh_rbuf_nr ?
672 NULL : &
ls->ls_rbuf_read_buf[*iter];
685 ls->ls_rbuf_read_op :
ls->ls_rbuf_write_op)[
index];
688 ls->ls_rbuf_read_lio :
ls->ls_rbuf_write_lio)[
index];
708 if (*iter ==
ls->ls_header.fsh_rbuf_nr) {
731 size =
ls->ls_header.fsh_rbuf_size_aligned;
732 offset =
ls->ls_header.fsh_rbuf_offset;
733 for (
i = 0;
i <
ls->ls_header.fsh_rbuf_nr; ++
i) {
735 lio = &
ls->ls_rbuf_read_lio[
i];
736 op = &
ls->ls_rbuf_read_op[
i];
737 buf = &
ls->ls_rbuf_read_buf[
i];
739 lio = &
ls->ls_rbuf_write_lio[
i];
740 op = &
ls->ls_rbuf_write_op[
i];
741 buf = &
ls->ls_rbuf_write_buf;
763 return (position >=
index && position < end) ||
764 (
index >= end && (position >=
index || position < end));
775 #undef M0_TRACE_SUBSYSTEM
M0_INTERNAL void m0_be_log_store_rbuf_io_reset(struct m0_be_log_store *ls, enum m0_be_log_store_io_type io_type)
M0_INTERNAL void m0_be_log_store_io_discard(struct m0_be_log_store *ls, m0_bindex_t offset, struct m0_be_op *op)
#define M0_ALLOC_ARR(arr, nr)
M0_INTERNAL m0_bcount_t m0_be_io_size(struct m0_be_io *bio)
#define M0_BE_FMT_DECODE_CFG_DEFAULT
M0_INTERNAL void m0_be_io_vec_pack(struct m0_be_io *bio)
M0_INTERNAL void m0_be_log_store_close(struct m0_be_log_store *ls)
M0_INTERNAL int m0_stob_locate(struct m0_stob *stob)
M0_INTERNAL int m0_be_log_store_open(struct m0_be_log_store *ls, struct m0_be_log_store_cfg *ls_cfg)
struct m0_fid si_domain_fid
static int be_log_store_zero(struct m0_be_log_store *ls, m0_bcount_t ls_size)
static int be_log_store_level_enter(struct m0_module *module)
#define M0_LOG(level,...)
enum m0_trace_level level
M0_INTERNAL const struct m0_fid * m0_stob_domain_id_get(const struct m0_stob_domain *dom)
static struct m0_be_log_io * be_log_store_rbuf_io_and_op(struct m0_be_log_store *ls, enum m0_be_log_store_io_type io_type, struct m0_be_op **op, unsigned index)
M0_INTERNAL int m0_stob_domain_destroy(struct m0_stob_domain *dom)
M0_INTERNAL struct m0_buf * m0_be_log_store_rbuf_read_buf_first(struct m0_be_log_store *ls, unsigned *iter)
static void be_log_store_rbuf_fini_nr(struct m0_be_log_store *ls, int nr)
static int be_log_store_rbuf_init_fini_index(struct m0_be_log_store *ls, int i, bool init)
M0_INTERNAL struct m0_buf * m0_be_log_store_rbuf_read_buf_next(struct m0_be_log_store *ls, unsigned *iter)
M0_INTERNAL void m0_free_aligned(void *data, size_t size, unsigned shift)
M0_INTERNAL struct m0 * m0_get(void)
#define container_of(ptr, type, member)
M0_INTERNAL m0_bcount_t m0_be_log_store_buf_size(struct m0_be_log_store *ls)
M0_INTERNAL struct m0_be_log_io * m0_be_log_store_rbuf_io_first(struct m0_be_log_store *ls, enum m0_be_log_store_io_type io_type, struct m0_be_op **op, unsigned *iter)
M0_INTERNAL uint32_t m0_stob_block_shift(struct m0_stob *stob)
static void be_log_store_buf_free_aligned(struct m0_be_log_store *ls, struct m0_buf *buf)
static const struct m0_uint128 zero
M0_INTERNAL struct m0_be_io * m0_be_log_io_be_io(struct m0_be_log_io *lio)
M0_INTERNAL void m0_be_io_configure(struct m0_be_io *bio, enum m0_stob_io_opcode opcode)
M0_INTERNAL void m0_be_log_store_io_translate(struct m0_be_log_store *ls, m0_bindex_t position, struct m0_be_io *bio)
M0_INTERNAL int m0_stob_domain_create(const char *location, const char *str_cfg_init, uint64_t dom_key, const char *str_cfg_create, struct m0_stob_domain **out)
static struct m0_be_log_store * be_log_store_module2store(struct m0_module *module)
return M0_ERR(-EOPNOTSUPP)
M0_INTERNAL const struct m0_stob_id * m0_stob_id_get(struct m0_stob *stob)
static bool m0_is_aligned(uint64_t val, uint64_t alignment)
M0_INTERNAL int m0_be_io_single(struct m0_stob *stob, enum m0_stob_io_opcode opcode, void *ptr_user, m0_bindex_t offset_stob, m0_bcount_t size)
M0_INTERNAL void m0_be_io_credit_add(struct m0_be_io_credit *iocred0, const struct m0_be_io_credit *iocred1)
M0_INTERNAL void m0_be_log_io_deallocate(struct m0_be_log_io *lio)
static bool be_log_store_header_validate(struct m0_be_fmt_log_store_header *header, uint64_t alignment)
M0_INTERNAL bool m0_be_log_store_contains_stob(struct m0_be_log_store *ls, const struct m0_stob_id *stob_id)
M0_INTERNAL void m0_be_io_stob_move(struct m0_be_io *bio, struct m0_stob *stob, m0_bindex_t offset, m0_bindex_t win_start, m0_bcount_t win_size)
M0_INTERNAL struct m0_be_log_io * m0_be_log_store_rbuf_io_next(struct m0_be_log_store *ls, enum m0_be_log_store_io_type io_type, struct m0_be_op **op, unsigned *iter)
M0_INTERNAL void m0_module_setup(struct m0_module *module, const char *name, const struct m0_modlev *level, int level_nr, struct m0 *instance)
M0_INTERNAL bool m0_be_log_store__invariant(struct m0_be_log_store *ls)
static void be_log_store_rbuf_free(struct m0_be_log_store *ls, struct m0_buf *buf)
M0_INTERNAL void m0_be_log_store_module_setup(struct m0_be_log_store *ls, struct m0_be_log_store_cfg *ls_cfg, bool create_mode)
struct m0_module ls_module
M0_INTERNAL void m0_be_op_done(struct m0_be_op *op)
static m0_bindex_t offset
static m0_bindex_t be_log_store_phys_addr(struct m0_be_log_store *ls, m0_bindex_t position)
#define M0_BE_IO_CREDIT(reg_nr, reg_size, part_nr)
M0_INTERNAL bool m0_be_log_store_overwrites(struct m0_be_log_store *ls, m0_bindex_t index, m0_bcount_t size, m0_bindex_t position)
M0_INTERNAL int m0_be_log_io_allocate(struct m0_be_log_io *lio, struct m0_be_io_credit *iocred, uint32_t log_bshift)
M0_INTERNAL void m0_stob_domain_fini(struct m0_stob_domain *dom)
static void be_log_store_rbuf_arr_free(struct m0_be_log_store *ls)
M0_INTERNAL int m0_stob_create(struct m0_stob *stob, struct m0_dtx *dtx, const char *str_cfg)
int init(struct workload *w)
M0_INTERNAL void m0_be_op_reset(struct m0_be_op *op)
M0_INTERNAL int m0_be_log_io_init(struct m0_be_log_io *lio)
M0_INTERNAL int m0_stob_destroy(struct m0_stob *stob, struct m0_dtx *dtx)
M0_INTERNAL enum m0_stob_state m0_stob_state_get(struct m0_stob *stob)
M0_INTERNAL void m0_be_op_active(struct m0_be_op *op)
M0_INTERNAL int m0_stob_domain_init(const char *location, const char *str_cfg_init, struct m0_stob_domain **out)
M0_INTERNAL struct m0_buf * m0_be_log_store_rbuf_write_buf(struct m0_be_log_store *ls)
static int be_log_store_module_init(struct m0_be_log_store *ls, struct m0_be_log_store_cfg *ls_cfg, bool create_mode)
static void be_log_store_rbuf_fini(struct m0_be_log_store *ls)
static int64_t min64(int64_t a, int64_t b)
static const struct m0_modlev be_log_store_levels[]
M0_INTERNAL int m0_be_log_store_create(struct m0_be_log_store *ls, struct m0_be_log_store_cfg *ls_cfg)
M0_INTERNAL void m0_be_op_fini(struct m0_be_op *op)
M0_INTERNAL bool m0_stob_id_eq(const struct m0_stob_id *stob_id0, const struct m0_stob_id *stob_id1)
static int be_log_store_rbuf_init(struct m0_be_log_store *ls)
static void be_log_store_level_leave(struct m0_module *module)
int fini(struct workload *w)
M0_INTERNAL int m0_stob_find(const struct m0_stob_id *id, struct m0_stob **out)
#define M0_ASSERT_INFO(cond, fmt,...)
static int be_log_store_rbuf_alloc(struct m0_be_log_store *ls, struct m0_buf *buf)
M0_INTERNAL void m0_be_log_store_io_credit(struct m0_be_log_store *ls, struct m0_be_io_credit *accum)
M0_INTERNAL void * m0_alloc_aligned(size_t size, unsigned shift)
M0_INTERNAL int m0_be_log_store_io_window(struct m0_be_log_store *ls, m0_bindex_t offset, m0_bcount_t *length)
M0_INTERNAL void m0_be_log_io_fini(struct m0_be_log_io *lio)
M0_INTERNAL void m0_be_op_init(struct m0_be_op *op)
M0_INTERNAL void m0_be_io_add(struct m0_be_io *bio, struct m0_stob *stob, void *ptr_user, m0_bindex_t offset_stob, m0_bcount_t size)
M0_INTERNAL void m0_be_io_stob_assign(struct m0_be_io *bio, struct m0_stob *stob, m0_bindex_t offset, m0_bcount_t size)
static int be_log_store_buf_alloc_aligned(struct m0_be_log_store *ls, struct m0_buf *buf, m0_bcount_t size)
static uint64_t m0_align(uint64_t val, uint64_t alignment)
M0_INTERNAL void m0_be_log_store_destroy(struct m0_be_log_store *ls)
M0_INTERNAL void m0_module_fini(struct m0_module *module, int level)
M0_INTERNAL void m0_stob_put(struct m0_stob *stob)
M0_INTERNAL void m0_be_log_io_reset(struct m0_be_log_io *lio)
static uint64_t max64u(uint64_t a, uint64_t b)
struct m0_stob_id lsc_stob_id
M0_INTERNAL void m0_be_io_sort(struct m0_be_io *bio)
static void be_log_store_module_fini(struct m0_be_log_store *ls, bool destroy_mode)
M0_INTERNAL int m0_module_init(struct m0_module *module, int level)
#define M0_IMPOSSIBLE(fmt,...)
M0_INTERNAL uint32_t m0_be_log_store_bshift(struct m0_be_log_store *ls)