From 6bb1d214896835dbef5fea2881621b24e79a0c4d Mon Sep 17 00:00:00 2001 From: Adam Rutkowski Date: Wed, 12 Jun 2019 18:50:34 -0400 Subject: [PATCH] Do not repartition cachelines in WO read WO cache mode should not repartition cachelines nor affect cacheline status in any way when servicing read. Reading data from the cache is just an internal optimization. Also WO cache mode is designed to be used with partitioning based on write life-time hints and read requests do not carry write lifetime hint by definition. Signed-off-by: Adam Rutkowski --- src/engine/engine_rd.c | 12 ++++++------ src/engine/engine_rd.h | 2 +- src/engine/engine_wo.c | 36 ++++++++++++++---------------------- 3 files changed, 21 insertions(+), 29 deletions(-) diff --git a/src/engine/engine_rd.c b/src/engine/engine_rd.c index ed9a5aa..0a58a9e 100644 --- a/src/engine/engine_rd.c +++ b/src/engine/engine_rd.c @@ -101,7 +101,7 @@ static void _ocf_read_generic_miss_complete(struct ocf_request *req, int error) } } -static inline void _ocf_read_generic_submit_hit(struct ocf_request *req) +void ocf_read_generic_submit_hit(struct ocf_request *req) { env_atomic_set(&req->req_remaining, ocf_engine_io_count(req)); @@ -135,7 +135,7 @@ err_alloc: _ocf_read_generic_miss_complete(req, -OCF_ERR_NO_MEM); } -int ocf_read_generic_do(struct ocf_request *req) +static int _ocf_read_generic_do(struct ocf_request *req) { struct ocf_cache *cache = req->cache; @@ -191,7 +191,7 @@ int ocf_read_generic_do(struct ocf_request *req) /* Submit IO */ if (ocf_engine_is_hit(req)) - _ocf_read_generic_submit_hit(req); + ocf_read_generic_submit_hit(req); else _ocf_read_generic_submit_miss(req); @@ -206,8 +206,8 @@ int ocf_read_generic_do(struct ocf_request *req) } static const struct ocf_io_if _io_if_read_generic_resume = { - .read = ocf_read_generic_do, - .write = ocf_read_generic_do, + .read = _ocf_read_generic_do, + .write = _ocf_read_generic_do, .resume = ocf_engine_on_resume, }; @@ -294,7 +294,7 @@ int ocf_read_generic(struct ocf_request *req) OCF_DEBUG_RQ(req, "NO LOCK"); } else { /* Lock was acquired can perform IO */ - ocf_read_generic_do(req); + _ocf_read_generic_do(req); } } else { OCF_DEBUG_RQ(req, "LOCK ERROR %d", lock); diff --git a/src/engine/engine_rd.h b/src/engine/engine_rd.h index 4881bf3..56373b5 100644 --- a/src/engine/engine_rd.h +++ b/src/engine/engine_rd.h @@ -8,6 +8,6 @@ int ocf_read_generic(struct ocf_request *req); -int ocf_read_generic_do(struct ocf_request *req); +void ocf_read_generic_submit_hit(struct ocf_request *req); #endif /* ENGINE_RD_H_ */ diff --git a/src/engine/engine_wo.c b/src/engine/engine_wo.c index 764d3c6..13f09fa 100644 --- a/src/engine/engine_wo.c +++ b/src/engine/engine_wo.c @@ -167,38 +167,30 @@ static void _ocf_read_wo_core_complete(struct ocf_request *req, int error) int ocf_read_wo_do(struct ocf_request *req) { - ocf_cache_t cache = req->cache; - - if (ocf_engine_is_hit(req)) { - /* read hit - just fetch the data from cache using standard read path - */ - ocf_read_generic_do(req); - return 0; - } - ocf_req_get(req); - if (req->info.re_part) { - OCF_DEBUG_RQ(req, "Re-Part"); + /* Lack of cacheline repartitioning here is deliberate. WO cache mode + * reads should not affect cacheline status as reading data from the + * cache is just an internal optimization. Also WO cache mode is + * designed to be used with partitioning based on write life-time hints + * and read requests do not carry write lifetime hint by definition. + */ - OCF_METADATA_LOCK_WR(); + if (ocf_engine_is_hit(req)) { + /* read hit - just fetch the data from cache */ + OCF_DEBUG_RQ(req, "Submit cache hit"); + ocf_read_generic_submit_hit(req); + } else { - /* Probably some cache lines are assigned into wrong - * partition. Need to move it to new one - */ - ocf_part_move(req); - - OCF_METADATA_UNLOCK_WR(); + OCF_DEBUG_RQ(req, "Submit core"); + ocf_submit_volume_req(&req->core->volume, req, + _ocf_read_wo_core_complete); } - OCF_DEBUG_RQ(req, "Submit core"); - ocf_submit_volume_req(&req->core->volume, req, _ocf_read_wo_core_complete); - ocf_engine_update_request_stats(req); ocf_engine_update_block_stats(req); ocf_req_put(req); - return 0; }