Motr  M0
pd.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2015-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 
33 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_BE
34 #include "lib/trace.h"
35 
36 #include "be/pd.h"
37 
38 #include "lib/assert.h" /* M0_ASSERT */
39 #include "lib/memory.h" /* M0_ALLOC_ARR */
40 #include "lib/locality.h" /* m0_locality0_get */
41 
42 #include "be/op.h" /* m0_be_op */
43 #include "be/pool.h" /* m0_be_pool_item */
44 #include "be/ha.h" /* m0_be_io_err_send */
45 
46 #include "motr/magic.h" /* M0_BE_PD_IO_MAGIC */
47 
48 
49 struct m0_be_pd_io {
50  struct m0_be_pd *bpi_pd;
53  struct m0_be_op bpi_op;
55  uint64_t bpi_pool_magic;
56 };
57 
58 M0_BE_POOL_DESCR_DEFINE(pdio, "pd_io pool", static, struct m0_be_pd_io,
59  bpi_pool_item, bpi_pool_magic, M0_BE_PD_IO_MAGIC);
60 M0_BE_POOL_DEFINE(pdio, static, struct m0_be_pd_io);
61 
62 static void be_pd_io_move(struct m0_be_pd *pd,
63  struct m0_be_pd_io *pdio,
64  enum m0_be_pd_io_state state)
65 {
66  enum m0_be_pd_io_state prev[] = {
70  };
71 
72  M0_PRE((state == M0_BPD_IO_IDLE && pdio->bpi_state == M0_BPD_IO_IDLE) ||
73  prev[state] == pdio->bpi_state);
74 
75  pdio->bpi_state = state;
76 }
77 
78 static void be_pd_io_op_done(struct m0_be_op *op, void *param)
79 {
80  struct m0_be_pd_io *pdio = param;
81  struct m0_be_pd *pd = pdio->bpi_pd;
82 
83  be_pd_io_move(pd, pdio, M0_BPD_IO_DONE);
84 }
85 
86 M0_INTERNAL int m0_be_pd_init(struct m0_be_pd *pd,
87  struct m0_be_pd_cfg *pd_cfg)
88 {
89  struct m0_be_pd_io *pdio;
90  uint32_t i;
91  int rc;
92 
93  struct m0_be_pool_cfg io_pool_cfg = {
95  };
96 
97  pd->bpd_cfg = *pd_cfg;
99  M0_ASSERT(rc == 0);
100  rc = pdio_be_pool_init(&pd->bpd_io_pool, &io_pool_cfg);
101  M0_ASSERT(rc == 0);
103  M0_ASSERT(pd->bpd_io != NULL);
104  for (i = 0; i < pd->bpd_cfg.bpdc_seg_io_nr; ++i) {
105  pdio = &pd->bpd_io[i];
106  pdio->bpi_pd = pd;
107  pdio->bpi_state = M0_BPD_IO_IDLE;
108  rc = m0_be_io_init(&pdio->bpi_be_io);
109  M0_ASSERT(rc == 0);
110  rc = m0_be_io_allocate(&pdio->bpi_be_io,
111  &pd->bpd_cfg.bpdc_io_credit);
112  M0_ASSERT(rc == 0);
113  m0_be_op_init(&pdio->bpi_op);
115  pdio, M0_BOS_DONE);
116  pdio_be_pool_add(&pd->bpd_io_pool, pdio);
117  }
118  rc = m0_be_io_init(&pd->bpd_sync_io);
119  M0_ASSERT(rc == 0);
120  rc = m0_be_io_allocate(&pd->bpd_sync_io, &M0_BE_IO_CREDIT(2, 2, 2));
121  M0_ASSERT(rc == 0);
122  pd->bpd_sync_in_progress = false;
123  pd->bpd_sync_prev = m0_time_now();
124  return 0;
125 }
126 
127 M0_INTERNAL void m0_be_pd_fini(struct m0_be_pd *pd)
128 {
129  struct m0_be_pd_io *pdio;
130  uint32_t nr = 0;
131 
134  pdio = pdio_be_pool_del(&pd->bpd_io_pool);
135  while (pdio != NULL) {
137  ++nr;
138  m0_be_op_fini(&pdio->bpi_op);
140  m0_be_io_fini(&pdio->bpi_be_io);
141  pdio = pdio_be_pool_del(&pd->bpd_io_pool);
142  }
144  pdio_be_pool_fini(&pd->bpd_io_pool);
145  m0_free(pd->bpd_io);
147 }
148 
149 M0_INTERNAL void m0_be_pd_io_add(struct m0_be_pd *pd,
150  struct m0_be_pd_io *pdio,
151  struct m0_ext *ext,
152  struct m0_be_op *op)
153 {
154  M0_LOG(M0_DEBUG, "pd=%p pdio=%p ext=%p "EXT_F" op=%p",
155  pd, pdio, ext, EXT_P(ext != NULL ? ext : &M0_EXT(0, 0)), op);
156 
157  /*
158  * XXX move to TAKEN state here to avoid additional
159  * pre-allocation of be_op's.
160  */
162  m0_be_op_set_add(op, &pdio->bpi_op);
165  ext, &pdio->bpi_op);
167 }
168 
169 M0_INTERNAL void m0_be_pd_io_get(struct m0_be_pd *pd,
170  struct m0_be_pd_io **pdio,
171  struct m0_be_op *op)
172 {
173  pdio_be_pool_get(&pd->bpd_io_pool, pdio, op);
174 }
175 
176 M0_INTERNAL void m0_be_pd_io_put(struct m0_be_pd *pd,
177  struct m0_be_pd_io *pdio)
178 {
179  be_pd_io_move(pd, pdio, M0_BPD_IO_IDLE);
181  m0_be_op_reset(&pdio->bpi_op);
182  pdio_be_pool_put(&pd->bpd_io_pool, pdio);
183 }
184 
185 M0_INTERNAL struct m0_be_io *m0_be_pd_io_be_io(struct m0_be_pd_io *pdio)
186 {
187  return &pdio->bpi_be_io;
188 }
189 
190 static void be_pd_sync_run(struct m0_sm_group *grp, struct m0_sm_ast *ast)
191 {
192  struct m0_be_pd *pd = ast->sa_datum;
193  m0_time_t now;
194  int rc;
195 
197  now = m0_time_now();
198  pd->bpd_sync_runtime = now;
199  pd->bpd_sync_delay = now - pd->bpd_sync_delay;
200  pd->bpd_sync_prev = now - pd->bpd_sync_prev;
201 
203  if (rc != 0)
205 
206  now = m0_time_now();
207  pd->bpd_sync_runtime = now - pd->bpd_sync_runtime;
208  M0_LOG(M0_DEBUG, "runtime=%" PRId64 " delay=%" PRId64 " "
209  "prev=%" PRId64 " rc=%d",
211  pd->bpd_sync_prev = now;
212  pd->bpd_sync_in_progress = false;
214 }
215 
216 M0_INTERNAL void m0_be_pd_sync(struct m0_be_pd *pd,
217  m0_bindex_t pos,
218  struct m0_stob **stobs,
219  int nr,
220  struct m0_be_op *op)
221 {
222  struct m0_be_io *bio;
223  int i;
224 
225  M0_ENTRY("pd=%p pos=%" PRId64 " nr=%d op=%p", pd, pos, nr, op);
226  M0_PRE(nr <= 2);
228 
229  pd->bpd_sync_in_progress = true;
230  bio = &pd->bpd_sync_io;
231  m0_be_io_reset(bio);
232  for (i = 0; i < nr; ++i)
233  m0_be_io_add(bio, stobs[i], &pd->bpd_sync_read_to[i], 0, 1);
236  pd->bpd_sync_ast = (struct m0_sm_ast){
237  .sa_cb = &be_pd_sync_run,
238  .sa_datum = pd,
239  };
240  pd->bpd_sync_op = op;
241  pd->bpd_sync_delay = m0_time_now();
243 }
244 
245 #undef M0_TRACE_SUBSYSTEM
246 
249 /*
250  * Local variables:
251  * c-indentation-style: "K&R"
252  * c-basic-offset: 8
253  * tab-width: 8
254  * fill-column: 80
255  * scroll-step: 1
256  * End:
257  */
258 /*
259  * vim: tabstop=8 shiftwidth=8 noexpandtab textwidth=80 nowrap
260  */
static size_t nr
Definition: dump.c:1505
#define M0_PRE(cond)
#define M0_ALLOC_ARR(arr, nr)
Definition: memory.h:84
M0_INTERNAL int m0_be_pd_init(struct m0_be_pd *pd, struct m0_be_pd_cfg *pd_cfg)
Definition: pd.c:86
m0_be_pd_io_state
Definition: pd.h:47
M0_INTERNAL void m0_be_io_sync_enable(struct m0_be_io *bio)
Definition: io.c:631
#define NULL
Definition: misc.h:38
void(* sa_cb)(struct m0_sm_group *grp, struct m0_sm_ast *)
Definition: sm.h:506
static struct m0_sm_group * grp
Definition: bytecount.c:38
uint64_t m0_time_t
Definition: time.h:37
#define M0_LOG(level,...)
Definition: trace.h:167
m0_time_t bpd_sync_prev
Definition: pd.h:73
M0_INTERNAL void m0_sm_ast_post(struct m0_sm_group *grp, struct m0_sm_ast *ast)
Definition: sm.c:135
m0_time_t bpd_sync_delay
Definition: pd.h:71
struct m0_be_io_sched bpd_sched
Definition: pd.h:66
struct m0_be_pool bpd_io_pool
Definition: pd.h:68
M0_INTERNAL void m0_be_pd_io_get(struct m0_be_pd *pd, struct m0_be_pd_io **pdio, struct m0_be_op *op)
Definition: pd.c:169
struct m0_be_pd * bpi_pd
Definition: pd.c:50
uint64_t m0_bindex_t
Definition: types.h:80
uint32_t bpdc_seg_io_pending_max
Definition: pd.h:60
M0_INTERNAL struct m0_be_io * m0_be_pd_io_be_io(struct m0_be_pd_io *pdio)
Definition: pd.c:185
Definition: sm.h:504
M0_INTERNAL void m0_be_op_callback_set(struct m0_be_op *op, m0_be_op_cb_t cb, void *param, enum m0_be_op_state state)
Definition: op.c:239
#define M0_EXT(start, end)
Definition: ext.h:55
static void be_pd_sync_run(struct m0_sm_group *grp, struct m0_sm_ast *ast)
Definition: pd.c:190
op
Definition: libdemo.c:64
#define M0_ENTRY(...)
Definition: trace.h:170
static struct m0_sm_ast ast[NR]
Definition: locality.c:44
M0_INTERNAL void m0_be_io_configure(struct m0_be_io *bio, enum m0_stob_io_opcode opcode)
Definition: io.c:516
M0_INTERNAL void m0_be_io_err_send(uint32_t errcode, uint8_t location, uint8_t io_opcode)
Definition: ha.c:38
int i
Definition: dir.c:1033
struct m0_be_pd_io * bpd_io
Definition: pd.h:67
M0_INTERNAL void m0_be_io_fini(struct m0_be_io *bio)
Definition: io.c:224
M0_INTERNAL void m0_be_pd_io_add(struct m0_be_pd *pd, struct m0_be_pd_io *pdio, struct m0_ext *ext, struct m0_be_op *op)
Definition: pd.c:149
M0_INTERNAL int m0_be_io_sched_init(struct m0_be_io_sched *sched, struct m0_be_io_sched_cfg *cfg)
Definition: io_sched.c:51
void * sa_datum
Definition: sm.h:508
Definition: io.h:232
Definition: stob.h:163
#define M0_ASSERT(cond)
m0_time_t m0_time_now(void)
Definition: time.c:134
static void be_pd_io_op_done(struct m0_be_op *op, void *param)
Definition: pd.c:78
M0_BE_POOL_DEFINE(pdio, static, struct m0_be_pd_io)
M0_INTERNAL int m0_be_io_init(struct m0_be_io *bio)
Definition: io.c:175
struct m0_be_io_sched_cfg bpdc_sched
Definition: pd.h:58
M0_INTERNAL void m0_be_io_sched_lock(struct m0_be_io_sched *sched)
Definition: io_sched.c:70
M0_INTERNAL void m0_be_io_sched_fini(struct m0_be_io_sched *sched)
Definition: io_sched.c:64
M0_INTERNAL void m0_be_pd_sync(struct m0_be_pd *pd, m0_bindex_t pos, struct m0_stob **stobs, int nr, struct m0_be_op *op)
Definition: pd.c:216
M0_INTERNAL void m0_be_op_done(struct m0_be_op *op)
Definition: stubs.c:104
char bpd_sync_read_to[2]
Definition: pd.h:76
#define M0_BE_IO_CREDIT(reg_nr, reg_size, part_nr)
Definition: io.h:76
#define PRId64
Definition: types.h:57
#define EXT_P(x)
Definition: ext.h:86
#define M0_BE_OP_SYNC_RC(op_obj, action)
Definition: op.h:196
unsigned bplc_q_size
Definition: pool.h:45
M0_INTERNAL void m0_be_pd_io_put(struct m0_be_pd *pd, struct m0_be_pd_io *pdio)
Definition: pd.c:176
M0_INTERNAL void m0_be_op_reset(struct m0_be_op *op)
Definition: op.c:152
enum m0_be_pd_io_state bpi_state
Definition: pd.c:51
bool bpd_sync_in_progress
Definition: pd.h:75
#define EXT_F
Definition: ext.h:85
M0_INTERNAL void m0_be_op_active(struct m0_be_op *op)
Definition: stubs.c:100
M0_INTERNAL void m0_be_io_sched_unlock(struct m0_be_io_sched *sched)
Definition: io_sched.c:75
M0_INTERNAL void m0_be_pd_fini(struct m0_be_pd *pd)
Definition: pd.c:127
M0_INTERNAL struct m0_locality * m0_locality0_get(void)
Definition: locality.c:169
Definition: ext.h:37
struct m0_be_io bpd_sync_io
Definition: pd.h:74
struct m0_be_op * bpd_sync_op
Definition: pd.h:70
M0_INTERNAL int m0_be_io_allocate(struct m0_be_io *bio, struct m0_be_io_credit *iocred)
Definition: io.c:180
M0_INTERNAL void m0_be_io_deallocate(struct m0_be_io *bio)
Definition: io.c:215
struct m0_be_op bpi_op
Definition: pd.c:53
Definition: pd.h:64
m0_time_t bpd_sync_runtime
Definition: pd.h:72
M0_INTERNAL void m0_be_op_fini(struct m0_be_op *op)
Definition: stubs.c:92
struct m0_be_io_credit bpdc_io_credit
Definition: pd.h:61
M0_INTERNAL void m0_be_op_set_add(struct m0_be_op *parent, struct m0_be_op *child)
Definition: op.c:297
M0_INTERNAL void m0_be_io_sched_add(struct m0_be_io_sched *sched, struct m0_be_io *io, struct m0_ext *ext, struct m0_be_op *op)
Definition: io_sched.c:176
static void be_pd_io_move(struct m0_be_pd *pd, struct m0_be_pd_io *pdio, enum m0_be_pd_io_state state)
Definition: pd.c:62
struct m0_be_pool_item bpi_pool_item
Definition: pd.c:54
Definition: io.h:87
struct m0_be_pd_cfg bpd_cfg
Definition: pd.h:65
struct m0_be_io bpi_be_io
Definition: pd.c:52
M0_BE_POOL_DESCR_DEFINE(pdio, "pd_io pool", static, struct m0_be_pd_io, bpi_pool_item, bpi_pool_magic, M0_BE_PD_IO_MAGIC)
struct m0_sm_ast bpd_sync_ast
Definition: pd.h:77
uint32_t bpdc_seg_io_nr
Definition: pd.h:59
Definition: io.h:229
Definition: pd.c:49
Definition: op.h:59
Definition: op.h:74
M0_INTERNAL void m0_be_op_init(struct m0_be_op *op)
Definition: stubs.c:87
void m0_free(void *data)
Definition: memory.c:146
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)
Definition: io.c:280
M0_INTERNAL void m0_be_io_launch(struct m0_be_io *bio, struct m0_be_op *op)
Definition: io.c:599
M0_INTERNAL void m0_be_io_reset(struct m0_be_io *bio)
Definition: io.c:651
int32_t rc
Definition: trigger_fop.h:47
uint64_t bpi_pool_magic
Definition: pd.c:55