Skip to content

Commit 0ed191f

Browse files
committed
fixup! :Introduce optimistic fast path for engine_rd
Signed-off-by: Michal Mielewczyk <[email protected]>
1 parent 4caf2f3 commit 0ed191f

File tree

3 files changed

+68
-50
lines changed

3 files changed

+68
-50
lines changed

src/engine/engine_rd.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ int ocf_read_generic(struct ocf_request *req)
259259
return 0;
260260
}
261261

262-
bool ocf_read_generic_fast(struct ocf_request *req)
262+
int ocf_read_generic_try_fast(struct ocf_request *req)
263263
{
264264
struct ocf_alock *c = ocf_cache_line_concurrency(req->cache);
265265

@@ -277,6 +277,8 @@ bool ocf_read_generic_fast(struct ocf_request *req)
277277
if (ocf_engine_is_mapped(req) && ocf_engine_is_hit(req) &&
278278
ocf_cl_lock_line_fast(c, req, OCF_READ) == OCF_LOCK_ACQUIRED) {
279279

280+
OCF_DEBUG_RQ(req, "Submit read generic fast");
281+
280282
ocf_req_get(req);
281283
ocf_engine_set_hot(req);
282284
ocf_hb_req_prot_unlock_rd(req);
@@ -289,14 +291,13 @@ bool ocf_read_generic_fast(struct ocf_request *req)
289291

290292
ocf_read_generic_submit_hit(req);
291293

292-
ocf_req_get(req);
293-
ocf_read_generic_submit_hit(req);
294294
/* Update statistics */
295295
ocf_engine_update_request_stats(req);
296296
ocf_engine_update_block_stats(req);
297-
return true;
297+
return OCF_FAST_PATH_YES;
298298
} else {
299299
ocf_hb_req_prot_unlock_rd(req);
300-
return false;
300+
OCF_DEBUG_RQ(req, "Failed to read generic fast");
301+
return OCF_FAST_PATH_NO;
301302
}
302303
}

src/engine/engine_rd.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@
99
int ocf_read_generic(struct ocf_request *req);
1010

1111
void ocf_read_generic_submit_hit(struct ocf_request *req);
12-
bool ocf_read_generic_fast(struct ocf_request *req);
12+
int ocf_read_generic_try_fast(struct ocf_request *req);
1313

1414
#endif /* ENGINE_RD_H_ */

src/ocf_core.c

Lines changed: 61 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -221,62 +221,79 @@ static void ocf_req_complete(struct ocf_request *req, int error)
221221
ocf_io_put(&req->ioi.io);
222222
}
223223

224-
static int ocf_core_submit_io_fast(struct ocf_io *io, struct ocf_request *req,
225-
ocf_core_t core, ocf_cache_t cache)
224+
static inline int _ocf_core_submit_io_fast_rd_generic(struct ocf_io *io,
225+
struct ocf_request *req)
226226
{
227-
ocf_req_cache_mode_t original_cache_mode;
228-
int fast;
229-
230-
if (req->d2c) {
231-
return -OCF_ERR_IO;
232-
}
227+
int res;
233228

234229
switch (req->cache_mode) {
235-
case ocf_req_cache_mode_wt:
236-
case ocf_req_cache_mode_wa:
237-
case ocf_req_cache_mode_wi:
238-
if (io->dir == OCF_READ && req->core_line_count <= MAX_FAST_PATH_CACHE_LINES) {
239-
if (ocf_read_generic_fast(req))
240-
return 0;
241-
ocf_req_clear_map(req);
242-
}
243-
break;
244-
245-
case ocf_req_cache_mode_wb:
246-
case ocf_req_cache_mode_wo:
247-
if (io->dir == OCF_READ && req->core_line_count <= MAX_FAST_PATH_CACHE_LINES)
248-
return ocf_read_generic_fast(req) ? 0 : -OCF_ERR_IO;
249-
break;
250-
default:
251-
break;
230+
case ocf_req_cache_mode_wt:
231+
case ocf_req_cache_mode_wa:
232+
case ocf_req_cache_mode_wi:
233+
case ocf_req_cache_mode_wb:
234+
case ocf_req_cache_mode_wo:
235+
res = ocf_read_generic_try_fast(req);
236+
break;
237+
default:
238+
break;
252239
}
253240

254-
original_cache_mode = req->cache_mode;
241+
if (res == OCF_FAST_PATH_NO)
242+
ocf_req_clear_map(req);
243+
244+
return res;
245+
}
255246

247+
static inline ocf_req_cache_mode_t _ocf_core_req_resolve_fast_mode(
248+
ocf_cache_t cache, struct ocf_request *req)
249+
{
256250
switch (req->cache_mode) {
257-
case ocf_req_cache_mode_pt:
258-
return -OCF_ERR_IO;
259-
case ocf_req_cache_mode_wb:
260-
case ocf_req_cache_mode_wo:
261-
if (io->dir == OCF_WRITE)
262-
req->cache_mode = ocf_req_cache_mode_fast;
263-
break;
264-
default:
265-
if (cache->use_submit_io_fast)
251+
case ocf_req_cache_mode_wb:
252+
case ocf_req_cache_mode_wo:
253+
return ocf_req_cache_mode_fast;
254+
default:
266255
break;
256+
}
267257

268-
if (io->dir == OCF_WRITE)
269-
return -OCF_ERR_IO;
258+
if (!cache->use_submit_io_fast)
259+
return ocf_req_cache_mode_max;
270260

271-
req->cache_mode = ocf_req_cache_mode_fast;
261+
return ocf_req_cache_mode_fast;
262+
}
263+
264+
static int ocf_core_submit_io_fast(struct ocf_io *io, struct ocf_request *req,
265+
ocf_cache_t cache)
266+
{
267+
ocf_req_cache_mode_t original_mode, resolved_mode;
268+
int ret;
269+
270+
if (req->d2c) {
271+
return OCF_FAST_PATH_NO;
272272
}
273273

274-
fast = ocf_engine_hndl_fast_req(req);
275-
if (fast != OCF_FAST_PATH_NO)
276-
return 0;
274+
if (req->cache_mode == ocf_req_cache_mode_pt)
275+
return OCF_FAST_PATH_NO;
276+
277+
/* If a read request isn't too big for a lookup in submission context,
278+
check it is a read-hit and if cache line lock could be acquired
279+
without waiting. If so, submit immediately */
280+
if (req->rw == OCF_READ) {
281+
if (req->core_line_count <= MAX_FAST_PATH_CACHE_LINES)
282+
return _ocf_core_submit_io_fast_rd_generic(io, req);
283+
}
284+
285+
resolved_mode = _ocf_core_req_resolve_fast_mode(cache, req);
286+
if (resolved_mode == ocf_req_cache_mode_max)
287+
return OCF_FAST_PATH_NO;
288+
289+
original_mode = req->cache_mode;
290+
req->cache_mode = resolved_mode;
291+
292+
ret = ocf_engine_hndl_fast_req(req);
293+
if (ret == OCF_FAST_PATH_NO)
294+
req->cache_mode = original_mode;
277295

278-
req->cache_mode = original_cache_mode;
279-
return -OCF_ERR_IO;
296+
return ret;
280297
}
281298

282299
static void ocf_core_volume_submit_io(struct ocf_io *io)
@@ -321,7 +338,7 @@ static void ocf_core_volume_submit_io(struct ocf_io *io)
321338
/* Prevent race condition */
322339
ocf_req_get(req);
323340

324-
if (!ocf_core_submit_io_fast(io, req, core, cache)) {
341+
if (ocf_core_submit_io_fast(io, req, cache) == OCF_FAST_PATH_YES) {
325342
ocf_core_seq_cutoff_update(core, req);
326343
ocf_req_put(req);
327344
return;

0 commit comments

Comments
 (0)