From b97bb6f53b43c98b67f39f75b23dfff91c8d85eb Mon Sep 17 00:00:00 2001 From: Adam Rutkowski Date: Tue, 4 Jun 2019 13:29:45 -0400 Subject: [PATCH] Add function to check for lazy write cache mode (WO or WB) Signed-off-by: Adam Rutkowski --- inc/ocf_mngt.h | 11 +++++++++++ src/engine/cache_engine.h | 7 +++++++ src/mngt/ocf_mngt_cache.c | 4 +++- src/ocf_core.c | 9 +++++++-- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/inc/ocf_mngt.h b/inc/ocf_mngt.h index c82ee2c..dae9e25 100644 --- a/inc/ocf_mngt.h +++ b/inc/ocf_mngt.h @@ -695,6 +695,17 @@ typedef void (*ocf_mngt_cache_save_end_t)(ocf_cache_t cache, void ocf_mngt_cache_save(ocf_cache_t cache, ocf_mngt_cache_save_end_t cmpl, void *priv); +/** + * @brief Determines whether given cache mode has write-back semantics, i.e. it + * allows for writes to be serviced in cache and lazily propagated to core. + * + * @param[in] mode input cache mode + */ +static inline bool ocf_mngt_cache_mode_has_lazy_write(ocf_cache_mode_t mode) +{ + return mode == ocf_cache_mode_wb || mode == ocf_cache_mode_wo; +} + /** * @brief Set cache mode in given cache * diff --git a/src/engine/cache_engine.h b/src/engine/cache_engine.h index d31fe44..17c36f7 100644 --- a/src/engine/cache_engine.h +++ b/src/engine/cache_engine.h @@ -59,6 +59,13 @@ static inline bool ocf_cache_mode_is_valid(ocf_cache_mode_t mode) return mode >= ocf_cache_mode_wt && mode < ocf_cache_mode_max; } +static inline bool ocf_req_cache_mode_has_lazy_write(ocf_req_cache_mode_t mode) +{ + return ocf_cache_mode_is_valid((ocf_cache_mode_t)mode) && + ocf_mngt_cache_mode_has_lazy_write( + (ocf_cache_mode_t)mode); +} + void ocf_seq_cutoff_update(ocf_core_t core, struct ocf_request *req); bool ocf_fallback_pt_is_on(ocf_cache_t cache); diff --git a/src/mngt/ocf_mngt_cache.c b/src/mngt/ocf_mngt_cache.c index d95668d..fca2ab8 100644 --- a/src/mngt/ocf_mngt_cache.c +++ b/src/mngt/ocf_mngt_cache.c @@ -2147,8 +2147,10 @@ static int _cache_mngt_set_cache_mode(ocf_cache_t cache, ocf_cache_mode_t mode) cache->conf_meta->cache_mode = mode; - if (mode_old == ocf_cache_mode_wb) + if (ocf_mngt_cache_mode_has_lazy_write(mode_old) && + !ocf_mngt_cache_mode_has_lazy_write(mode)) { _cache_mngt_update_initial_dirty_clines(cache); + } ocf_cache_log(cache, log_info, "Changing cache mode from '%s' to '%s' " "successful\n", ocf_get_io_iface_name(mode_old), diff --git a/src/ocf_core.c b/src/ocf_core.c index f6d66da..33a6628 100644 --- a/src/ocf_core.c +++ b/src/ocf_core.c @@ -251,7 +251,9 @@ void ocf_core_submit_io_mode(struct ocf_io *io, ocf_cache_mode_t cache_mode) if (cache_mode == ocf_cache_mode_none) req_cache_mode = ocf_get_effective_cache_mode(cache, core, io); - if (req_cache_mode == ocf_req_cache_mode_wb && + + if (io->dir == OCF_WRITE && + ocf_req_cache_mode_has_lazy_write(req_cache_mode) && ocf_io_set_dirty(cache, core_io)) { req_cache_mode = ocf_req_cache_mode_wt; } @@ -319,7 +321,9 @@ int ocf_core_submit_io_fast(struct ocf_io *io) } req_cache_mode = ocf_get_effective_cache_mode(cache, core, io); - if (req_cache_mode == ocf_req_cache_mode_wb && + + if (io->dir == OCF_WRITE && + ocf_req_cache_mode_has_lazy_write(req_cache_mode) && ocf_io_set_dirty(cache, core_io)) { req_cache_mode = ocf_req_cache_mode_wt; } @@ -328,6 +332,7 @@ int ocf_core_submit_io_fast(struct ocf_io *io) case ocf_req_cache_mode_pt: return -OCF_ERR_IO; case ocf_req_cache_mode_wb: + case ocf_req_cache_mode_wo: req_cache_mode = ocf_req_cache_mode_fast; break; default: