Merge pull request #342 from mmichal10/fix-metadata-flush

Fix metadata flush
This commit is contained in:
Michał Wysoczański 2020-01-24 17:59:58 +01:00 committed by GitHub
commit fabd41250b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 75 additions and 68 deletions

View File

@ -200,49 +200,47 @@ static inline bool metadata_test_and_clear_dirty_sec(
/* /*
* Marks given cache line's bits as clean * Marks given cache line's bits as clean
* *
* @return true if the cache line was dirty and became clean * @return true if any cache line's sector was dirty and became clean
* @return false for other cases * @return false for other cases
*/ */
static inline bool metadata_clear_dirty_sec_changed( static inline bool metadata_clear_dirty_sec_changed(
struct ocf_cache *cache, ocf_cache_line_t line, struct ocf_cache *cache, ocf_cache_line_t line,
uint8_t start, uint8_t stop) uint8_t start, uint8_t stop, bool *line_is_clean)
{ {
bool was_dirty, is_dirty = false; bool sec_changed;
OCF_METADATA_BITS_LOCK_WR(); OCF_METADATA_BITS_LOCK_WR();
was_dirty = cache->metadata.iface.test_dirty(cache, line, sec_changed = cache->metadata.iface.test_dirty(cache, line,
cache->metadata.settings.sector_start, start, stop, false);
cache->metadata.settings.sector_end, *line_is_clean = !cache->metadata.iface.clear_dirty(cache, line,
false);
if (was_dirty) {
is_dirty = cache->metadata.iface.clear_dirty(cache, line,
start, stop); start, stop);
}
OCF_METADATA_BITS_UNLOCK_WR(); OCF_METADATA_BITS_UNLOCK_WR();
return was_dirty && !is_dirty; return sec_changed;
} }
/* /*
* Marks given cache line's bits as dirty * Marks given cache line's bits as dirty
* *
* @return true if the cache line was clean and became dirty * @return true if any cache line's sector became dirty
* @return false if the cache line was dirty before marking bits * @return false for other cases
*/ */
static inline bool metadata_set_dirty_sec_changed( static inline bool metadata_set_dirty_sec_changed(
struct ocf_cache *cache, ocf_cache_line_t line, struct ocf_cache *cache, ocf_cache_line_t line,
uint8_t start, uint8_t stop) uint8_t start, uint8_t stop, bool *line_was_dirty)
{ {
bool was_dirty; bool sec_changed;
OCF_METADATA_BITS_LOCK_WR(); OCF_METADATA_BITS_LOCK_WR();
was_dirty = cache->metadata.iface.set_dirty(cache, line, start, stop); sec_changed = !cache->metadata.iface.test_dirty(cache, line,
start, stop, true);
*line_was_dirty = cache->metadata.iface.set_dirty(cache, line, start,
stop);
OCF_METADATA_BITS_UNLOCK_WR(); OCF_METADATA_BITS_UNLOCK_WR();
return !was_dirty; return sec_changed;
} }
/******************************************************************************* /*******************************************************************************

View File

@ -102,8 +102,13 @@ void set_cache_line_clean(struct ocf_cache *cache, uint8_t start_bit,
ocf_cache_line_t line = req->map[map_idx].coll_idx; ocf_cache_line_t line = req->map[map_idx].coll_idx;
ocf_part_id_t part_id = ocf_metadata_get_partition_id(cache, line); ocf_part_id_t part_id = ocf_metadata_get_partition_id(cache, line);
uint8_t evp_type = cache->conf_meta->eviction_policy_type; uint8_t evp_type = cache->conf_meta->eviction_policy_type;
bool line_is_clean;
if (metadata_clear_dirty_sec_changed(cache, line, start_bit, end_bit)) { if (metadata_clear_dirty_sec_changed(cache, line, start_bit, end_bit,
&line_is_clean)) {
ocf_metadata_flush_mark(cache, req, map_idx, CLEAN, start_bit,
end_bit);
if (line_is_clean) {
/* /*
* Update the number of dirty cached data for that * Update the number of dirty cached data for that
* core object * core object
@ -128,9 +133,9 @@ void set_cache_line_clean(struct ocf_cache *cache, uint8_t start_bit,
evict_policy_ops[evp_type].clean_cline(cache, part_id, line); evict_policy_ops[evp_type].clean_cline(cache, part_id, line);
ocf_purge_cleaning_policy(cache, line); ocf_purge_cleaning_policy(cache, line);
ocf_metadata_flush_mark(cache, req, map_idx, CLEAN, start_bit,
end_bit);
} }
}
} }
void set_cache_line_dirty(struct ocf_cache *cache, uint8_t start_bit, void set_cache_line_dirty(struct ocf_cache *cache, uint8_t start_bit,
@ -139,8 +144,13 @@ void set_cache_line_dirty(struct ocf_cache *cache, uint8_t start_bit,
ocf_cache_line_t line = req->map[map_idx].coll_idx; ocf_cache_line_t line = req->map[map_idx].coll_idx;
ocf_part_id_t part_id = ocf_metadata_get_partition_id(cache, line); ocf_part_id_t part_id = ocf_metadata_get_partition_id(cache, line);
uint8_t evp_type = cache->conf_meta->eviction_policy_type; uint8_t evp_type = cache->conf_meta->eviction_policy_type;
bool line_was_dirty;
if (metadata_set_dirty_sec_changed(cache, line, start_bit, end_bit)) { if (metadata_set_dirty_sec_changed(cache, line, start_bit, end_bit,
&line_was_dirty)) {
ocf_metadata_flush_mark(cache, req, map_idx, DIRTY, start_bit,
end_bit);
if (!line_was_dirty) {
/* /*
* If this is first dirty cline set dirty timestamp * If this is first dirty cline set dirty timestamp
*/ */
@ -161,10 +171,9 @@ void set_cache_line_dirty(struct ocf_cache *cache, uint8_t start_bit,
if (likely(evict_policy_ops[evp_type].dirty_cline)) if (likely(evict_policy_ops[evp_type].dirty_cline))
evict_policy_ops[evp_type].dirty_cline(cache, part_id, line); evict_policy_ops[evp_type].dirty_cline(cache, part_id, line);
ocf_metadata_flush_mark(cache, req, map_idx, DIRTY, start_bit,
end_bit);
} }
}
ocf_cleaning_set_hot_cache_line(cache, line); ocf_cleaning_set_hot_cache_line(cache, line);
} }