diff --git a/src/eviction/lru.c b/src/eviction/lru.c index 01997d9..6d597cc 100644 --- a/src/eviction/lru.c +++ b/src/eviction/lru.c @@ -56,10 +56,12 @@ static void add_lru_head(ocf_cache_t cache, node->next = curr_head_index; node->prev = end_marker; curr_head->prev = collision_index; - node->hot = true; - if (!curr_head->hot) - list->last_hot = collision_index; - ++list->num_hot; + if (list->track_hot) { + node->hot = true; + if (!curr_head->hot) + list->last_hot = collision_index; + ++list->num_hot; + } list->head = collision_index; @@ -185,6 +187,9 @@ static void balance_lru_list(ocf_cache_t cache, unsigned target_hot_count = list->num_nodes / OCF_LRU_HOT_RATIO; struct lru_eviction_policy_meta *node; + if (!list->track_hot) + return; + if (target_hot_count == list->num_hot) return; @@ -834,13 +839,14 @@ void evp_lru_hot_cline(ocf_cache_t cache, ocf_cache_line_t cline) OCF_METADATA_EVICTION_WR_UNLOCK(cline); } -static inline void _lru_init(struct ocf_lru_list *list) +static inline void _lru_init(struct ocf_lru_list *list, bool track_hot) { list->num_nodes = 0; list->head = end_marker; list->tail = end_marker; list->num_hot = 0; list->last_hot = end_marker; + list->track_hot = track_hot; } void evp_lru_init_evp(ocf_cache_t cache, struct ocf_part *part) @@ -853,8 +859,12 @@ void evp_lru_init_evp(ocf_cache_t cache, struct ocf_part *part) clean_list = evp_lru_get_list(part, i, true); dirty_list = evp_lru_get_list(part, i, false); - _lru_init(clean_list); - _lru_init(dirty_list); + if (part->id == PARTITION_FREELIST) { + _lru_init(clean_list, false); + } else { + _lru_init(clean_list, true); + _lru_init(dirty_list, true); + } } env_atomic_set(&part->runtime->curr_size, 0); diff --git a/src/eviction/lru_structs.h b/src/eviction/lru_structs.h index 87d47e7..4ff2947 100644 --- a/src/eviction/lru_structs.h +++ b/src/eviction/lru_structs.h @@ -18,6 +18,7 @@ struct ocf_lru_list { uint32_t tail; uint32_t num_hot; uint32_t last_hot; + bool track_hot; }; struct lru_eviction_policy { diff --git a/tests/unit/tests/eviction/lru.c/lru.c b/tests/unit/tests/eviction/lru.c/lru.c index 3eac691..d8bee23 100644 --- a/tests/unit/tests/eviction/lru.c/lru.c +++ b/tests/unit/tests/eviction/lru.c/lru.c @@ -59,7 +59,7 @@ static void _lru_init_test01(void **state) print_test_description("test init\n"); - _lru_init(&l, end_marker); + _lru_init(&l, true); assert_int_equal(l.num_hot, 0); assert_int_equal(l.num_nodes, 0); @@ -94,7 +94,7 @@ static void _lru_init_test02(void **state) print_test_description("test add\n"); - _lru_init(&l, end_marker); + _lru_init(&l, true); for (i = 1; i <= 8; i++) { @@ -119,7 +119,7 @@ static void _lru_init_test03(void **state) print_test_description("remove head\n"); - _lru_init(&l, end_marker); + _lru_init(&l, true); for (i = 1; i <= 8; i++) { add_lru_head(NULL, &l, i, end_marker); @@ -155,7 +155,7 @@ static void _lru_init_test04(void **state) print_test_description("remove tail\n"); - _lru_init(&l, end_marker); + _lru_init(&l, true); for (i = 1; i <= 8; i++) { add_lru_head(NULL, &l, i, end_marker); @@ -193,7 +193,7 @@ static void _lru_init_test05(void **state) print_test_description("remove last hot\n"); - _lru_init(&l, end_marker); + _lru_init(&l, true); for (i = 1; i <= 8; i++) { add_lru_head(NULL, &l, i, end_marker); @@ -240,7 +240,7 @@ static void _lru_init_test06(void **state) print_test_description("remove middle hot\n"); - _lru_init(&l, end_marker); + _lru_init(&l, true); for (i = 1; i <= 8; i++) { add_lru_head(NULL, &l, i, end_marker);