From 2761540326394949addf2f66fdde80a20f621e2f Mon Sep 17 00:00:00 2001 From: Rafal Stefanowski Date: Thu, 1 Feb 2024 13:44:25 +0100 Subject: [PATCH 1/2] Report cache and core errors separately Signed-off-by: Rafal Stefanowski Signed-off-by: Michal Mielewczyk --- src/ocf_request.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ocf_request.h b/src/ocf_request.h index 3ea539fe..5492822d 100644 --- a/src/ocf_request.h +++ b/src/ocf_request.h @@ -192,6 +192,12 @@ struct ocf_request { int error; /*!< This filed indicates an error for OCF request */ + int cache_error; + /*!< Indicator of forward IO cache device error */ + + int core_error; + /*!< Indicator of forward IO core device error */ + ocf_part_id_t part_id; /*!< Targeted partition of requests */ From 194e5a9172792266b9c576d5e86cab00012ad1b0 Mon Sep 17 00:00:00 2001 From: Rafal Stefanowski Date: Wed, 28 Aug 2024 11:02:39 +0200 Subject: [PATCH 2/2] Use cache_error and core_error flags only in WT Signed-off-by: Rafal Stefanowski Signed-off-by: Michal Mielewczyk Signed-off-by: Robert Baldyga --- src/engine/engine_d2c.c | 4 +--- src/engine/engine_pt.c | 4 +--- src/engine/engine_rd.c | 1 - src/engine/engine_wi.c | 1 - src/engine/engine_wo.c | 1 - src/engine/engine_wt.c | 26 +++++++++++--------------- src/ocf_request.h | 5 ++++- 7 files changed, 17 insertions(+), 25 deletions(-) diff --git a/src/engine/engine_d2c.c b/src/engine/engine_d2c.c index 31730283..02cd21e7 100644 --- a/src/engine/engine_d2c.c +++ b/src/engine/engine_d2c.c @@ -21,10 +21,8 @@ static void _ocf_d2c_completion(struct ocf_request *req, int error) OCF_DEBUG_RQ(req, "Completion"); - if (req->error) { - req->info.core_error = 1; + if (req->error) ocf_core_stats_core_error_update(req->core, req->rw); - } /* Complete request */ req->complete(req, req->error); diff --git a/src/engine/engine_pt.c b/src/engine/engine_pt.c index fe249bd8..eec4afc2 100644 --- a/src/engine/engine_pt.c +++ b/src/engine/engine_pt.c @@ -28,10 +28,8 @@ static void _ocf_read_pt_complete(struct ocf_request *req, int error) OCF_DEBUG_RQ(req, "Completion"); - if (req->error) { - req->info.core_error = 1; + if (req->error) ocf_core_stats_core_error_update(req->core, OCF_READ); - } /* Complete request */ req->complete(req, req->error); diff --git a/src/engine/engine_rd.c b/src/engine/engine_rd.c index 3cf67c75..4721768a 100644 --- a/src/engine/engine_rd.c +++ b/src/engine/engine_rd.c @@ -78,7 +78,6 @@ static void _ocf_read_generic_miss_complete(struct ocf_request *req, int error) */ req->complete(req, req->error); - req->info.core_error = 1; ocf_core_stats_core_error_update(req->core, OCF_READ); ctx_data_free(cache->owner, req->cp_data); diff --git a/src/engine/engine_wi.c b/src/engine/engine_wi.c index 4ebb39e2..d2bf8cc6 100644 --- a/src/engine/engine_wi.c +++ b/src/engine/engine_wi.c @@ -107,7 +107,6 @@ static void _ocf_write_wi_core_complete(struct ocf_request *req, int error) { if (error) { req->error = error; - req->info.core_error = 1; ocf_core_stats_core_error_update(req->core, OCF_WRITE); } diff --git a/src/engine/engine_wo.c b/src/engine/engine_wo.c index 9414bda9..ea2c4edb 100644 --- a/src/engine/engine_wo.c +++ b/src/engine/engine_wo.c @@ -156,7 +156,6 @@ static void _ocf_read_wo_core_complete(struct ocf_request *req, int error) { if (error) { req->error |= error; - req->info.core_error = 1; ocf_core_stats_core_error_update(req->core, OCF_READ); } diff --git a/src/engine/engine_wt.c b/src/engine/engine_wt.c index 4dcce9bd..b4a8d7f9 100644 --- a/src/engine/engine_wt.c +++ b/src/engine/engine_wt.c @@ -68,7 +68,7 @@ static void _ocf_write_wt_do_flush_metadata_compl(struct ocf_request *req, ocf_req_unlock_wr(ocf_cache_line_concurrency(req->cache), req); - req->complete(req, req->info.core_error ? req->error : 0); + req->complete(req, error); ocf_req_put(req); } @@ -100,14 +100,9 @@ static void _ocf_write_wt_req_complete(struct ocf_request *req) OCF_DEBUG_RQ(req, "Completion"); - if (req->error) { - /* An error occured */ - - /* Complete request */ - req->complete(req, req->info.core_error ? req->error : 0); - + if (req->info.cache_error || req->info.core_error) { + req->complete(req, req->error); ocf_engine_invalidate(req); - return; } @@ -117,9 +112,7 @@ static void _ocf_write_wt_req_complete(struct ocf_request *req) OCF_QUEUE_ALLOW_SYNC | OCF_QUEUE_PRIO_HIGH); } else { ocf_req_unlock_wr(ocf_cache_line_concurrency(req->cache), req); - - req->complete(req, req->info.core_error ? req->error : 0); - + req->complete(req, 0); ocf_req_put(req); } } @@ -127,11 +120,14 @@ static void _ocf_write_wt_req_complete(struct ocf_request *req) static void _ocf_write_wt_cache_complete(struct ocf_request *req, int error) { if (error) { - req->error = req->error ?: error; + /* Cache error code is not propagated further to the user here + * because data could be successfully written to the core device + * despite the cache IO error. + * Error flag is set though to indicate that the error occurred + * and to invalidate the request in completion. */ + req->info.cache_error = 1; ocf_core_stats_cache_error_update(req->core, OCF_WRITE); - - if (req->error) - inc_fallback_pt_error_counter(req->cache); + inc_fallback_pt_error_counter(req->cache); } _ocf_write_wt_req_complete(req); diff --git a/src/ocf_request.h b/src/ocf_request.h index 5492822d..2ce0f532 100644 --- a/src/ocf_request.h +++ b/src/ocf_request.h @@ -55,8 +55,11 @@ struct ocf_req_info { uint32_t cleaning_required : 1; /*!< Eviction failed, need to request cleaning */ + uint32_t cache_error : 1; + /*!< Error occurred during I/O on cache device */ + uint32_t core_error : 1; - /*!< Error occured during I/O on core device */ + /*!< Error occurred during I/O on core device */ uint32_t cleaner_cache_line_lock : 1; /*!< Cleaner flag - acquire cache line lock */