From a2b300d465aeef513220db06ff12c2a7964e1087 Mon Sep 17 00:00:00 2001 From: Robert Baldyga Date: Wed, 14 Jul 2021 13:04:03 +0200 Subject: [PATCH] Avoid stack overflow when pending read misses list is blocked Signed-off-by: Robert Baldyga --- src/engine/engine_pt.c | 3 ++- src/engine/engine_rd.c | 1 + src/ocf_request.h | 3 +++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/engine/engine_pt.c b/src/engine/engine_pt.c index e0465ba..422010a 100644 --- a/src/engine/engine_pt.c +++ b/src/engine/engine_pt.c @@ -120,7 +120,8 @@ int ocf_read_pt(struct ocf_request *req) /* Traverse request to check if there are mapped cache lines */ ocf_engine_traverse(req); - if (req->seq_cutoff && ocf_engine_is_dirty_all(req)) { + if (req->seq_cutoff && ocf_engine_is_dirty_all(req) && + !req->bf_blocked) { use_cache = true; } else { if (ocf_engine_mapped_count(req)) { diff --git a/src/engine/engine_rd.c b/src/engine/engine_rd.c index 5ce9c68..3e04b1a 100644 --- a/src/engine/engine_rd.c +++ b/src/engine/engine_rd.c @@ -224,6 +224,7 @@ int ocf_read_generic(struct ocf_request *req) if (env_atomic_read(&cache->pending_read_misses_list_blocked)) { /* There are conditions to bypass IO */ + req->bf_blocked = true; ocf_get_io_if(ocf_cache_mode_pt)->read(req); return 0; } diff --git a/src/ocf_request.h b/src/ocf_request.h index eec5cdb..a624487 100644 --- a/src/ocf_request.h +++ b/src/ocf_request.h @@ -185,6 +185,9 @@ struct ocf_request { uint8_t seq_cutoff : 1; /*!< Sequential cut off set for this request */ + uint8_t bf_blocked : 1; + /*!< Backfill pending read misses list blocked */ + uint8_t wi_second_pass : 1; /*!< Set after first pass of WI write is completed */