Skip to content

Commit 0987eeb

Browse files
committed
Configurable dirty ratio hysteresis
Signed-off-by: Daniel Madej <daniel.madej@huawei.com>
1 parent 7fc8aeb commit 0987eeb

File tree

2 files changed

+46
-22
lines changed

2 files changed

+46
-22
lines changed

inc/cleaning/alru.h

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ enum ocf_cleaning_alru_parameters {
1717
ocf_alru_stale_buffer_time,
1818
ocf_alru_flush_max_buffers,
1919
ocf_alru_activity_threshold,
20-
ocf_alru_dirty_ratio_trigger,
20+
ocf_alru_dirty_ratio_threshold,
21+
ocf_alru_dirty_ratio_inertia,
2122
};
2223

2324
/**
@@ -70,18 +71,29 @@ enum ocf_cleaning_alru_parameters {
7071
#define OCF_ALRU_DEFAULT_ACTIVITY_THRESHOLD 10000
7172

7273
/**
73-
* ALRU dirty ratio based cleaning trigger for a cache device
74+
* ALRU dirty ratio based cleaning trigger threshold for a cache device
7475
*/
7576

76-
/** Minimum dirty ratio trigger value */
77-
#define OCF_ALRU_MIN_DIRTY_RATIO_TRIGGER 0
78-
/** Maximum dirty ratio trigger value */
79-
#define OCF_ALRU_MAX_DIRTY_RATIO_TRIGGER 100
80-
/** Default dirty ratio trigger value */
81-
#define OCF_ALRU_DEFAULT_DIRTY_RATIO_TRIGGER \
82-
OCF_ALRU_MAX_DIRTY_RATIO_TRIGGER
83-
/** Default dirty ratio trigger inertia */
84-
#define OCF_ALRU_DEFAULT_TRIGGER_INERTIA 5
77+
/** Minimum dirty ratio trigger threshold value */
78+
#define OCF_ALRU_MIN_DIRTY_RATIO_THRESHOLD 0
79+
/** Maximum dirty ratio trigger threshold value */
80+
#define OCF_ALRU_MAX_DIRTY_RATIO_THRESHOLD 100
81+
/** Default dirty ratio trigger threshold value */
82+
#define OCF_ALRU_DEFAULT_DIRTY_RATIO_THRESHOLD \
83+
OCF_ALRU_MAX_DIRTY_RATIO_THRESHOLD
84+
85+
/**
86+
* ALRU dirty ratio based cleaning trigger inertia for a cache device
87+
* Cleaning triggered by exceeding dirty ratio threshold will stop
88+
* when dirty ratio drops below (threshold - inertia).
89+
*/
90+
91+
/** Minimum dirty ratio trigger inertia value */
92+
#define OCF_ALRU_MIN_DIRTY_RATIO_INERTIA 0
93+
/** Maximum dirty ratio trigger inertia value */
94+
#define OCF_ALRU_MAX_DIRTY_RATIO_INERTIA 100
95+
/** Default dirty ratio trigger inertia value */
96+
#define OCF_ALRU_DEFAULT_DIRTY_RATIO_INERTIA 5
8597
/**
8698
* @}
8799
*/

src/cleaning/alru.c

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -363,8 +363,9 @@ void cleaning_policy_alru_setup(struct ocf_cache *cache)
363363
config->stale_buffer_time = OCF_ALRU_DEFAULT_STALENESS_TIME;
364364
config->flush_max_buffers = OCF_ALRU_DEFAULT_FLUSH_MAX_BUFFERS;
365365
config->activity_threshold = OCF_ALRU_DEFAULT_ACTIVITY_THRESHOLD;
366-
config->dirty_trigger_threshold = OCF_ALRU_DEFAULT_DIRTY_RATIO_TRIGGER;
367-
config->dirty_trigger_inertia = OCF_ALRU_DEFAULT_TRIGGER_INERTIA;
366+
config->dirty_trigger_threshold
367+
= OCF_ALRU_DEFAULT_DIRTY_RATIO_THRESHOLD;
368+
config->dirty_trigger_inertia = OCF_ALRU_DEFAULT_DIRTY_RATIO_INERTIA;
368369
}
369370

370371
int cleaning_policy_alru_initialize(ocf_cache_t cache, int kick_cleaner)
@@ -632,19 +633,25 @@ int cleaning_policy_alru_set_cleaning_param(ocf_cache_t cache,
632633
"activity time threshold: %d\n",
633634
config->activity_threshold);
634635
break;
635-
case ocf_alru_dirty_ratio_trigger:
636+
case ocf_alru_dirty_ratio_threshold:
636637
OCF_CLEANING_CHECK_PARAM(cache, param_value,
637-
OCF_ALRU_MIN_DIRTY_RATIO_TRIGGER,
638-
OCF_ALRU_MAX_DIRTY_RATIO_TRIGGER,
638+
OCF_ALRU_MIN_DIRTY_RATIO_THRESHOLD,
639+
OCF_ALRU_MAX_DIRTY_RATIO_THRESHOLD,
639640
"dirty_trigger_threshold");
640641
config->dirty_trigger_threshold = param_value;
641642
ocf_cache_log(cache, log_info, "Write-back flush thread "
642643
"dirty ratio trigger threshold: %d\n",
643644
config->dirty_trigger_threshold);
644-
if (config->dirty_trigger_threshold
645-
< config->dirty_trigger_inertia)
646-
config->dirty_trigger_inertia
647-
= config->dirty_trigger_threshold;
645+
break;
646+
case ocf_alru_dirty_ratio_inertia:
647+
OCF_CLEANING_CHECK_PARAM(cache, param_value,
648+
OCF_ALRU_MIN_DIRTY_RATIO_INERTIA,
649+
OCF_ALRU_MAX_DIRTY_RATIO_INERTIA,
650+
"dirty_trigger_inertia");
651+
config->dirty_trigger_inertia = param_value;
652+
ocf_cache_log(cache, log_info, "Write-back flush thread "
653+
"dirty ratio trigger inertia: %d\n",
654+
config->dirty_trigger_inertia);
648655
break;
649656
default:
650657
return -OCF_ERR_INVAL;
@@ -673,9 +680,13 @@ int cleaning_policy_alru_get_cleaning_param(ocf_cache_t cache,
673680
case ocf_alru_activity_threshold:
674681
*param_value = config->activity_threshold;
675682
break;
676-
case ocf_alru_dirty_ratio_trigger:
683+
case ocf_alru_dirty_ratio_threshold:
677684
*param_value = config->dirty_trigger_threshold;
678685
break;
686+
break;
687+
case ocf_alru_dirty_ratio_inertia:
688+
*param_value = config->dirty_trigger_inertia;
689+
break;
679690
default:
680691
return -OCF_ERR_INVAL;
681692
}
@@ -729,7 +740,8 @@ static bool check_for_dirty_ratio(ocf_cache_t cache,
729740
struct alru_context *ctx;
730741
uint32_t threshold;
731742

732-
if (config->dirty_trigger_threshold == OCF_ALRU_MAX_DIRTY_RATIO_TRIGGER)
743+
if (config->dirty_trigger_threshold
744+
== OCF_ALRU_MAX_DIRTY_RATIO_THRESHOLD)
733745
return false;
734746

735747
if (ocf_cache_get_info(cache, &info))

0 commit comments

Comments
 (0)