Change get_effective_cache_mode to operate on req instead of io

Signed-off-by: Michal Rakowski <michal.rakowski@intel.com>
This commit is contained in:
Michal Rakowski 2020-03-17 16:34:45 +01:00
parent d84942daa3
commit 2edd05c812
6 changed files with 66 additions and 86 deletions

View File

@ -153,14 +153,6 @@ static inline struct ocf_io *ocf_core_new_io(ocf_core_t core, ocf_queue_t queue,
io_class, flags); io_class, flags);
} }
/**
* @brief Submit ocf_io
*
* @param[in] io IO to be submitted
* @param[in] mode Cache mode to be enforced
*/
void ocf_core_submit_io_mode(struct ocf_io *io, ocf_cache_mode_t cache_mode);
/** /**
* @brief Submit ocf_io * @brief Submit ocf_io
* *

View File

@ -223,36 +223,50 @@ void ocf_seq_cutoff_update(ocf_core_t core, struct ocf_request *req)
core->seq_cutoff.bytes += req->byte_length; core->seq_cutoff.bytes += req->byte_length;
} }
ocf_cache_mode_t ocf_get_effective_cache_mode(ocf_cache_t cache, void ocf_resolve_effective_cache_mode(ocf_cache_t cache,
ocf_core_t core, struct ocf_io *io) ocf_core_t core, struct ocf_request *req)
{ {
ocf_cache_mode_t mode; if (req->d2c) {
req->cache_mode = ocf_req_cache_mode_d2c;
return;
}
if (cache->pt_unaligned_io && !ocf_req_is_4k(io->addr, io->bytes)) if (ocf_fallback_pt_is_on(cache)){
return ocf_cache_mode_pt; req->cache_mode = ocf_req_cache_mode_pt;
return;
}
mode = ocf_part_get_cache_mode(cache, if (cache->pt_unaligned_io && !ocf_req_is_4k(req->byte_position,
ocf_part_class2id(cache, io->io_class)); req->byte_length)) {
if (!ocf_cache_mode_is_valid(mode)) req->cache_mode = ocf_req_cache_mode_pt;
mode = cache->conf_meta->cache_mode; return;
}
if (ocf_seq_cutoff_check(core, io->dir, io->addr, io->bytes)) if (ocf_seq_cutoff_check(core, req->rw, req->byte_position,
mode = ocf_cache_mode_pt; req->byte_length)) {
req->cache_mode = ocf_req_cache_mode_pt;
return;
}
if (ocf_fallback_pt_is_on(cache)) req->cache_mode = ocf_part_get_cache_mode(cache,
mode = ocf_cache_mode_pt; ocf_part_class2id(cache, req->part_id));
if (!ocf_cache_mode_is_valid(req->cache_mode))
req->cache_mode = cache->conf_meta->cache_mode;
return mode; if (req->rw == OCF_WRITE &&
ocf_req_cache_mode_has_lazy_write(req->cache_mode) &&
ocf_req_set_dirty(req)) {
req->cache_mode = ocf_req_cache_mode_wt;
}
} }
int ocf_engine_hndl_req(struct ocf_request *req, int ocf_engine_hndl_req(struct ocf_request *req)
ocf_req_cache_mode_t req_cache_mode)
{ {
ocf_cache_t cache = req->cache; ocf_cache_t cache = req->cache;
OCF_CHECK_NULL(cache); OCF_CHECK_NULL(cache);
req->io_if = ocf_get_io_if(req_cache_mode); req->io_if = ocf_get_io_if(req->cache_mode);
if (!req->io_if) if (!req->io_if)
return -OCF_ERR_INVAL; return -OCF_ERR_INVAL;
@ -267,13 +281,12 @@ int ocf_engine_hndl_req(struct ocf_request *req,
return 0; return 0;
} }
int ocf_engine_hndl_fast_req(struct ocf_request *req, int ocf_engine_hndl_fast_req(struct ocf_request *req)
ocf_req_cache_mode_t req_cache_mode)
{ {
const struct ocf_io_if *io_if; const struct ocf_io_if *io_if;
int ret; int ret;
io_if = ocf_get_io_if(req_cache_mode); io_if = ocf_get_io_if(req->cache_mode);
if (!io_if) if (!io_if)
return -OCF_ERR_INVAL; return -OCF_ERR_INVAL;

View File

@ -40,8 +40,8 @@ struct ocf_io_if {
const char *name; const char *name;
}; };
ocf_cache_mode_t ocf_get_effective_cache_mode(ocf_cache_t cache, void ocf_resolve_effective_cache_mode(ocf_cache_t cache,
ocf_core_t core, struct ocf_io *io); ocf_core_t core, struct ocf_request *req);
const struct ocf_io_if *ocf_get_io_if(ocf_req_cache_mode_t cache_mode); const struct ocf_io_if *ocf_get_io_if(ocf_req_cache_mode_t cache_mode);
@ -74,14 +74,12 @@ bool ocf_seq_cutoff_check(ocf_core_t core, uint32_t dir, uint64_t addr,
struct ocf_request *ocf_engine_pop_req(struct ocf_cache *cache, struct ocf_request *ocf_engine_pop_req(struct ocf_cache *cache,
struct ocf_queue *q); struct ocf_queue *q);
int ocf_engine_hndl_req(struct ocf_request *req, int ocf_engine_hndl_req(struct ocf_request *req);
ocf_req_cache_mode_t req_cache_mode);
#define OCF_FAST_PATH_YES 7 #define OCF_FAST_PATH_YES 7
#define OCF_FAST_PATH_NO 13 #define OCF_FAST_PATH_NO 13
int ocf_engine_hndl_fast_req(struct ocf_request *req, int ocf_engine_hndl_fast_req(struct ocf_request *req);
ocf_req_cache_mode_t req_cache_mode);
void ocf_engine_hndl_discard_req(struct ocf_request *req); void ocf_engine_hndl_discard_req(struct ocf_request *req);

View File

@ -9,7 +9,6 @@
#include "ocf_io_priv.h" #include "ocf_io_priv.h"
#include "metadata/metadata.h" #include "metadata/metadata.h"
#include "engine/cache_engine.h" #include "engine/cache_engine.h"
#include "ocf_request.h"
#include "utils/utils_part.h" #include "utils/utils_part.h"
#include "ocf_request.h" #include "ocf_request.h"
#include "ocf_trace_priv.h" #include "ocf_trace_priv.h"
@ -165,12 +164,6 @@ static inline ocf_core_t ocf_volume_to_core(ocf_volume_t volume)
return core_volume->core; return core_volume->core;
} }
static inline int ocf_io_set_dirty(struct ocf_request *req)
{
req->dirty = !!ocf_refcnt_inc(&req->cache->refcnt.dirty);
return req->dirty ? 0 : -EBUSY;
}
static inline void dec_counter_if_req_was_dirty(struct ocf_request *req) static inline void dec_counter_if_req_was_dirty(struct ocf_request *req)
{ {
if (!req->dirty) if (!req->dirty)
@ -223,10 +216,9 @@ static void ocf_req_complete(struct ocf_request *req, int error)
ocf_io_put(&req->ioi.io); ocf_io_put(&req->ioi.io);
} }
void ocf_core_submit_io_mode(struct ocf_io *io, ocf_cache_mode_t cache_mode) void ocf_core_volume_submit_io(struct ocf_io *io)
{ {
struct ocf_request *req; struct ocf_request *req;
ocf_req_cache_mode_t req_cache_mode;
ocf_core_t core; ocf_core_t core;
ocf_cache_t cache; ocf_cache_t cache;
int ret; int ret;
@ -251,25 +243,11 @@ void ocf_core_submit_io_mode(struct ocf_io *io, ocf_cache_mode_t cache_mode)
return; return;
} }
/* TODO: instead of casting ocf_cache_mode_t to ocf_req_cache_mode_t req->part_id = ocf_part_class2id(cache, io->io_class);
we can resolve IO interface here and get rid of the latter. */
req_cache_mode = cache_mode;
if (cache_mode == ocf_cache_mode_none)
req_cache_mode = ocf_get_effective_cache_mode(cache, core, io);
if (io->dir == OCF_WRITE &&
ocf_req_cache_mode_has_lazy_write(req_cache_mode) &&
ocf_io_set_dirty(req)) {
req_cache_mode = ocf_req_cache_mode_wt;
}
if (req->d2c)
req_cache_mode = ocf_req_cache_mode_d2c;
req->core = core; req->core = core;
req->complete = ocf_req_complete; req->complete = ocf_req_complete;
req->part_id = ocf_part_class2id(cache, io->io_class);
ocf_resolve_effective_cache_mode(cache, core, req);
ocf_seq_cutoff_update(core, req); ocf_seq_cutoff_update(core, req);
@ -282,7 +260,7 @@ void ocf_core_submit_io_mode(struct ocf_io *io, ocf_cache_mode_t cache_mode)
ocf_io_get(io); ocf_io_get(io);
ret = ocf_engine_hndl_req(req, req_cache_mode); ret = ocf_engine_hndl_req(req);
if (ret) { if (ret) {
dec_counter_if_req_was_dirty(req); dec_counter_if_req_was_dirty(req);
ocf_io_end(io, ret); ocf_io_end(io, ret);
@ -292,7 +270,6 @@ void ocf_core_submit_io_mode(struct ocf_io *io, ocf_cache_mode_t cache_mode)
int ocf_core_submit_io_fast(struct ocf_io *io) int ocf_core_submit_io_fast(struct ocf_io *io)
{ {
struct ocf_request *req; struct ocf_request *req;
ocf_req_cache_mode_t req_cache_mode;
struct ocf_event_io trace_event; struct ocf_event_io trace_event;
ocf_core_t core; ocf_core_t core;
ocf_cache_t cache; ocf_cache_t cache;
@ -315,26 +292,29 @@ int ocf_core_submit_io_fast(struct ocf_io *io)
return 0; return 0;
} }
if (req->d2c) {
dec_counter_if_req_was_dirty(req);
return -OCF_ERR_IO;
}
ret = ocf_req_alloc_map(req); ret = ocf_req_alloc_map(req);
if (ret) { if (ret) {
ocf_io_end(io, -OCF_ERR_NO_MEM); ocf_io_end(io, -OCF_ERR_NO_MEM);
return 0; return 0;
} }
req_cache_mode = ocf_get_effective_cache_mode(cache, core, io); req->core = core;
req->complete = ocf_req_complete;
req->part_id = ocf_part_class2id(cache, io->io_class);
if (io->dir == OCF_WRITE && ocf_resolve_effective_cache_mode(cache, core, req);
ocf_req_cache_mode_has_lazy_write(req_cache_mode) &&
ocf_io_set_dirty(req)) {
req_cache_mode = ocf_req_cache_mode_wt;
}
switch (req_cache_mode) { switch (req->cache_mode) {
case ocf_req_cache_mode_pt: case ocf_req_cache_mode_pt:
return -OCF_ERR_IO; return -OCF_ERR_IO;
case ocf_req_cache_mode_wb: case ocf_req_cache_mode_wb:
case ocf_req_cache_mode_wo: case ocf_req_cache_mode_wo:
req_cache_mode = ocf_req_cache_mode_fast; req->cache_mode = ocf_req_cache_mode_fast;
break; break;
default: default:
if (cache->use_submit_io_fast) if (cache->use_submit_io_fast)
@ -342,18 +322,9 @@ int ocf_core_submit_io_fast(struct ocf_io *io)
if (io->dir == OCF_WRITE) if (io->dir == OCF_WRITE)
return -OCF_ERR_IO; return -OCF_ERR_IO;
req_cache_mode = ocf_req_cache_mode_fast; req->cache_mode = ocf_req_cache_mode_fast;
} }
if (req->d2c) {
dec_counter_if_req_was_dirty(req);
return -OCF_ERR_IO;
}
req->core = core;
req->complete = ocf_req_complete;
req->part_id = ocf_part_class2id(cache, io->io_class);
ocf_core_update_stats(core, io); ocf_core_update_stats(core, io);
if (cache->trace.trace_callback) { if (cache->trace.trace_callback) {
@ -365,7 +336,7 @@ int ocf_core_submit_io_fast(struct ocf_io *io)
ocf_io_get(io); ocf_io_get(io);
fast = ocf_engine_hndl_fast_req(req, req_cache_mode); fast = ocf_engine_hndl_fast_req(req);
if (fast != OCF_FAST_PATH_NO) { if (fast != OCF_FAST_PATH_NO) {
ocf_trace_push(io->io_queue, &trace_event, sizeof(trace_event)); ocf_trace_push(io->io_queue, &trace_event, sizeof(trace_event));
ocf_seq_cutoff_update(core, req); ocf_seq_cutoff_update(core, req);
@ -378,11 +349,6 @@ int ocf_core_submit_io_fast(struct ocf_io *io)
return -OCF_ERR_IO; return -OCF_ERR_IO;
} }
static void ocf_core_volume_submit_io(struct ocf_io *io)
{
ocf_core_submit_io_mode(io, ocf_cache_mode_none);
}
static void ocf_core_volume_submit_flush(struct ocf_io *io) static void ocf_core_volume_submit_flush(struct ocf_io *io)
{ {
struct ocf_request *req; struct ocf_request *req;

View File

@ -303,6 +303,12 @@ void ocf_req_put(struct ocf_request *req)
ocf_queue_put(queue); ocf_queue_put(queue);
} }
int ocf_req_set_dirty(struct ocf_request *req)
{
req->dirty = !!ocf_refcnt_inc(&req->cache->refcnt.dirty);
return req->dirty ? 0 : -OCF_ERR_AGAIN;
}
void ocf_req_clear_info(struct ocf_request *req) void ocf_req_clear_info(struct ocf_request *req)
{ {
ENV_BUG_ON(env_memset(&req->info, sizeof(req->info), 0)); ENV_BUG_ON(env_memset(&req->info, sizeof(req->info), 0));

View File

@ -8,6 +8,7 @@
#include "ocf_env.h" #include "ocf_env.h"
#include "ocf_io_priv.h" #include "ocf_io_priv.h"
#include "engine/cache_engine.h"
struct ocf_req_allocator; struct ocf_req_allocator;
@ -149,6 +150,8 @@ struct ocf_request {
ctx_data_t *cp_data; ctx_data_t *cp_data;
/*!< Copy of request data */ /*!< Copy of request data */
ocf_req_cache_mode_t cache_mode;
uint64_t byte_position; uint64_t byte_position;
/*!< LBA byte position of request in core domain */ /*!< LBA byte position of request in core domain */
@ -326,6 +329,8 @@ void ocf_req_clear_map(struct ocf_request *req);
*/ */
void ocf_req_hash(struct ocf_request *req); void ocf_req_hash(struct ocf_request *req);
int ocf_req_set_dirty(struct ocf_request *req);
/** /**
* @brief Clear OCF request * @brief Clear OCF request
* *