From 136e50d9e4b70b52c4406ffe2de70877e102ae73 Mon Sep 17 00:00:00 2001 From: Michal Mielewczyk Date: Wed, 16 Oct 2024 15:31:00 +0200 Subject: [PATCH] Debug request tracing Signed-off-by: Michal Mielewczyk --- src/engine/cache_engine.c | 25 +++++++++++++++++++++++++ src/engine/cache_engine.h | 3 +++ src/engine/engine_common.c | 2 ++ src/engine/engine_discard.c | 2 ++ src/engine/engine_fast.c | 4 ++++ src/engine/engine_inv.c | 2 ++ src/engine/engine_pt.c | 5 +++++ src/engine/engine_rd.c | 2 ++ src/engine/engine_wa.c | 2 ++ src/engine/engine_wb.c | 4 +++- src/engine/engine_wi.c | 2 ++ src/engine/engine_wo.c | 2 ++ src/engine/engine_wt.c | 2 ++ src/ocf_request.h | 9 +++++++++ 14 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/engine/cache_engine.c b/src/engine/cache_engine.c index f7f160e0..93e741f5 100644 --- a/src/engine/cache_engine.c +++ b/src/engine/cache_engine.c @@ -41,6 +41,9 @@ enum ocf_io_if_type { OCF_IO_FAST_IF, OCF_IO_FLUSH_IF, OCF_IO_DISCARD_IF, + OCF_IO_REFRESH_IF, + OCF_IO_INVALIDATE_IF, + OCF_IO_RD_IF, OCF_IO_PRIV_MAX_IF, }; @@ -108,6 +111,18 @@ static const struct ocf_io_if IO_IFS[OCF_IO_PRIV_MAX_IF] = { }, .name = "Discard", }, + [OCF_IO_REFRESH_IF] = { + .cbs = { }, + .name = "Refresh", + }, + [OCF_IO_INVALIDATE_IF] = { + .cbs = { }, + .name = "Invalidate", + }, + [OCF_IO_RD_IF] = { + .cbs = { }, + .name = "Read generic", + }, }; static const struct ocf_io_if *cache_mode_io_if_map[ocf_req_cache_mode_max] = { @@ -118,8 +133,18 @@ static const struct ocf_io_if *cache_mode_io_if_map[ocf_req_cache_mode_max] = { [ocf_req_cache_mode_wo] = &IO_IFS[OCF_IO_WO_IF], [ocf_req_cache_mode_pt] = &IO_IFS[OCF_IO_PT_IF], [ocf_req_cache_mode_fast] = &IO_IFS[OCF_IO_FAST_IF], + [ocf_req_refresh] = &IO_IFS[OCF_IO_REFRESH_IF], + [ocf_req_cache_mode_discard] = &IO_IFS[OCF_IO_DISCARD_IF], + [ocf_req_cache_mode_invalidate] = &IO_IFS[OCF_IO_INVALIDATE_IF], + [ocf_req_cache_mode_rd] = &IO_IFS[OCF_IO_RD_IF], }; +void ocf_debug_request_trace(struct ocf_request *req, + ocf_req_cache_mode_t engine) +{ + req->engine_trace[req->engine_trace_counter++] = engine; +} + const char *ocf_get_io_iface_name(ocf_req_cache_mode_t cache_mode) { if (cache_mode == ocf_req_cache_mode_max) diff --git a/src/engine/cache_engine.h b/src/engine/cache_engine.h index f9c7c7d2..0f88583f 100644 --- a/src/engine/cache_engine.h +++ b/src/engine/cache_engine.h @@ -47,4 +47,7 @@ void ocf_engine_hndl_flush_req(struct ocf_request *req); void ocf_engine_hndl_discard_req(struct ocf_request *req); +void ocf_debug_request_trace(struct ocf_request *req, + ocf_req_cache_mode_t engine); + #endif diff --git a/src/engine/engine_common.c b/src/engine/engine_common.c index e25eb4f7..883101e9 100644 --- a/src/engine/engine_common.c +++ b/src/engine/engine_common.c @@ -599,6 +599,8 @@ static int _ocf_engine_refresh(struct ocf_request *req) { int result; + ocf_debug_request_trace(req, ocf_req_refresh); + /* Check under metadata RD lock */ ocf_hb_req_prot_lock_rd(req); diff --git a/src/engine/engine_discard.c b/src/engine/engine_discard.c index 250da03d..2579b9bf 100644 --- a/src/engine/engine_discard.c +++ b/src/engine/engine_discard.c @@ -211,6 +211,8 @@ int ocf_engine_discard(struct ocf_request *req) /* Get OCF request - increase reference counter */ ocf_req_get(req); + ocf_debug_request_trace(req, ocf_req_cache_mode_discard); + _ocf_discard_step(req); /* Put OCF request - decrease reference counter */ diff --git a/src/engine/engine_fast.c b/src/engine/engine_fast.c index b35788e5..768bbf42 100644 --- a/src/engine/engine_fast.c +++ b/src/engine/engine_fast.c @@ -99,6 +99,8 @@ int ocf_read_fast(struct ocf_request *req) /* Get OCF request - increase reference counter */ ocf_req_get(req); + ocf_debug_request_trace(req, ocf_req_cache_mode_fast); + /* Set resume handler */ req->engine_handler = _ocf_read_fast_do; @@ -165,6 +167,8 @@ int ocf_write_fast(struct ocf_request *req) /* Get OCF request - increase reference counter */ ocf_req_get(req); + ocf_debug_request_trace(req, ocf_req_cache_mode_fast); + /* Set resume handler */ req->engine_handler = ocf_write_wb_do; diff --git a/src/engine/engine_inv.c b/src/engine/engine_inv.c index 7a9ec5cc..b70332bd 100644 --- a/src/engine/engine_inv.c +++ b/src/engine/engine_inv.c @@ -40,6 +40,8 @@ static int _ocf_invalidate_do(struct ocf_request *req) ocf_purge_map_info(req); ocf_hb_req_prot_unlock_wr(req); + ocf_debug_request_trace(req, ocf_req_cache_mode_invalidate); + if (ocf_volume_is_atomic(&cache->device->volume) && req->info.flush_metadata) { /* Metadata flush IO */ diff --git a/src/engine/engine_pt.c b/src/engine/engine_pt.c index f15c0559..dc843a5c 100644 --- a/src/engine/engine_pt.c +++ b/src/engine/engine_pt.c @@ -47,6 +47,8 @@ int ocf_read_pt_do(struct ocf_request *req) /* Get OCF request - increase reference counter */ ocf_req_get(req); + ocf_debug_request_trace(req, ocf_req_cache_mode_pt); + if (req->info.dirty_any) { ocf_hb_req_prot_lock_rd(req); /* Need to clean, start it */ @@ -101,6 +103,9 @@ int ocf_read_pt(struct ocf_request *req) /* Get OCF request - increase reference counter */ ocf_req_get(req); + + ocf_debug_request_trace(req, ocf_req_cache_mode_pt); + /* Set resume handler */ req->engine_handler = ocf_read_pt_do; diff --git a/src/engine/engine_rd.c b/src/engine/engine_rd.c index bbc90cb2..bf5694d5 100644 --- a/src/engine/engine_rd.c +++ b/src/engine/engine_rd.c @@ -183,6 +183,8 @@ int ocf_read_generic(struct ocf_request *req) int lock = OCF_LOCK_NOT_ACQUIRED; struct ocf_cache *cache = req->cache; + ocf_debug_request_trace(req, ocf_req_cache_mode_rd); + if (env_atomic_read(&cache->pending_read_misses_list_blocked)) { /* There are conditions to bypass IO */ diff --git a/src/engine/engine_wa.c b/src/engine/engine_wa.c index c7813186..4c327bf5 100644 --- a/src/engine/engine_wa.c +++ b/src/engine/engine_wa.c @@ -23,6 +23,8 @@ int ocf_write_wa(struct ocf_request *req) /* Get OCF request - increase reference counter */ ocf_req_get(req); + ocf_debug_request_trace(req, ocf_req_cache_mode_wa); + ocf_req_hash(req); ocf_hb_req_prot_lock_rd(req); /*- Metadata RD access -----------------------*/ diff --git a/src/engine/engine_wb.c b/src/engine/engine_wb.c index 1860de46..71a5547f 100644 --- a/src/engine/engine_wb.c +++ b/src/engine/engine_wb.c @@ -127,6 +127,7 @@ int ocf_write_wb_do(struct ocf_request *req) /* Get OCF request - increase reference counter */ ocf_req_get(req); + ocf_debug_request_trace(req, ocf_req_cache_mode_wb); /* Submit IO */ _ocf_write_wb_submit(req); @@ -149,10 +150,11 @@ int ocf_write_wb(struct ocf_request *req) { int lock = OCF_LOCK_NOT_ACQUIRED; - /* Not sure if we need this. */ ocf_req_get(req); + ocf_debug_request_trace(req, ocf_req_cache_mode_wb); + /* Set resume handler */ req->engine_handler = ocf_write_wb_do; req->engine_cbs = &_wb_engine_callbacks; diff --git a/src/engine/engine_wi.c b/src/engine/engine_wi.c index a72c5924..e5977bdc 100644 --- a/src/engine/engine_wi.c +++ b/src/engine/engine_wi.c @@ -170,6 +170,8 @@ int ocf_write_wi(struct ocf_request *req) /* Get OCF request - increase reference counter */ ocf_req_get(req); + ocf_debug_request_trace(req, ocf_req_cache_mode_wi); + /* Set resume handler */ req->engine_handler = req->wi_second_pass ? ocf_write_wi_update_and_flush_metadata : diff --git a/src/engine/engine_wo.c b/src/engine/engine_wo.c index 16a93625..330a778a 100644 --- a/src/engine/engine_wo.c +++ b/src/engine/engine_wo.c @@ -207,6 +207,8 @@ int ocf_read_wo(struct ocf_request *req) /* Get OCF request - increase reference counter */ ocf_req_get(req); + ocf_debug_request_trace(req, ocf_req_cache_mode_wo); + /* Set resume call backs */ req->engine_handler = ocf_read_wo_do; diff --git a/src/engine/engine_wt.c b/src/engine/engine_wt.c index 303dc077..df296bef 100644 --- a/src/engine/engine_wt.c +++ b/src/engine/engine_wt.c @@ -189,6 +189,8 @@ int ocf_write_wt(struct ocf_request *req) /* Get OCF request - increase reference counter */ ocf_req_get(req); + ocf_debug_request_trace(req, ocf_req_cache_mode_wt); + /* Set resume handler */ req->engine_handler = _ocf_write_wt_do; req->engine_cbs = &_wt_engine_callbacks; diff --git a/src/ocf_request.h b/src/ocf_request.h index 36ab4d80..ce373eb2 100644 --- a/src/ocf_request.h +++ b/src/ocf_request.h @@ -28,6 +28,12 @@ typedef enum { /*!< Direct to Core - pass through to core without touching cacheline metadata */ + ocf_req_refresh, + ocf_req_cache_mode_discard, + ocf_req_cache_mode_invalidate, + ocf_req_cache_mode_rd, + /*!< Just for debug purposes */ + ocf_req_cache_mode_max, } ocf_req_cache_mode_t; @@ -320,6 +326,9 @@ struct ocf_request { uint32_t alock_rw; /*!< Read/Write mode for alock*/ + uint32_t engine_trace[128]; + uint8_t engine_trace_counter; + uint8_t *alock_status; /*!< Mapping for locked/unlocked alock entries */