Merge pull request #373 from arutk/wo_read_clean_secs_from_cache

WO: read clean sectors from cache
This commit is contained in:
Robert Baldyga 2020-05-27 22:49:41 +02:00 committed by GitHub
commit 08dd18dfa3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 15 deletions

View File

@ -141,6 +141,19 @@ bool ocf_engine_map_all_sec_clean(struct ocf_request *req, uint32_t line)
start, end);
}
static inline
bool ocf_engine_map_all_sec_valid(struct ocf_request *req, uint32_t line)
{
uint8_t start = ocf_map_line_start_sector(req, line);
uint8_t end = ocf_map_line_end_sector(req, line);
if (req->map[line].status != LOOKUP_HIT)
return false;
return metadata_test_valid_sec(req->cache, req->map[line].coll_idx,
start, end);
}
/**
* @brief Clean request (flush dirty data to the core device)
*

View File

@ -57,7 +57,7 @@ static int ocf_read_wo_cache_do(struct ocf_request *req)
uint32_t s, e, i;
uint64_t line;
struct ocf_map_info *entry;
bool dirty = false;
bool valid = false;
bool io = false;
uint64_t phys_prev, phys_curr = 0;
uint64_t io_start = 0;
@ -83,18 +83,17 @@ static int ocf_read_wo_cache_do(struct ocf_request *req)
}
/* try to seek directly to the last sector */
if (entry->status == LOOKUP_MISS ||
ocf_engine_map_all_sec_clean(req, line)) {
/* all sectors invalid or clean */
if (entry->status == LOOKUP_MISS) {
/* all sectors invalid */
i = e + 1;
increment = SECTORS_TO_BYTES(e - s + 1);
dirty = false;
valid = false;
}
else if (ocf_engine_map_all_sec_dirty(req, line)) {
/* all sectors dirty */
else if (ocf_engine_map_all_sec_valid(req, line)) {
/* all sectors valid */
i = e + 1;
increment = SECTORS_TO_BYTES(e - s + 1);
dirty = true;
valid = true;
} else {
/* need to iterate through CL sector by sector */
i = s;
@ -102,26 +101,26 @@ static int ocf_read_wo_cache_do(struct ocf_request *req)
do {
if (i <= e) {
dirty = metadata_test_dirty_one(cache,
valid = metadata_test_valid_one(cache,
entry->coll_idx, i);
increment = 0;
do {
++i;
increment += SECTORS_TO_BYTES(1);
} while (i <= e && metadata_test_dirty_one(
} while (i <= e && metadata_test_valid_one(
cache, entry->coll_idx, i)
== dirty);
== valid);
}
if (io && !dirty) {
/* end of sequential dirty region */
if (io && !valid) {
/* end of sequential valid region */
ocf_read_wo_cache_io(req, io_start,
offset - io_start);
io = false;
}
if (!io && dirty) {
/* beginning of sequential dirty region */
if (!io && valid) {
/* beginning of sequential valid region */
io = true;
io_start = offset;
}