Handle promotion policy selection in casadm

Signed-off-by: Jan Musial <jan.musial@intel.com>
This commit is contained in:
Jan Musial 2019-09-16 09:47:00 +02:00
parent 9598fa76f1
commit fd24803b74
4 changed files with 128 additions and 0 deletions

View File

@ -265,6 +265,12 @@ static struct name_to_val_mapping cleaning_policy_names[] = {
{ NULL } { NULL }
}; };
static struct name_to_val_mapping promotion_policy_names[] = {
{ .short_name = "always", .value = ocf_promotion_always },
{ .short_name = "nhit", .value = ocf_promotion_nhit },
{ NULL}
};
static struct name_to_val_mapping metadata_mode_names[] = { static struct name_to_val_mapping metadata_mode_names[] = {
{ .short_name = "normal", .value = CAS_METADATA_MODE_NORMAL }, { .short_name = "normal", .value = CAS_METADATA_MODE_NORMAL },
{ .short_name = "atomic", .value = CAS_METADATA_MODE_ATOMIC }, { .short_name = "atomic", .value = CAS_METADATA_MODE_ATOMIC },
@ -434,6 +440,16 @@ inline const char *cleaning_policy_to_name(uint8_t policy)
return val_to_short_name(policy, cleaning_policy_names, "Unknown"); return val_to_short_name(policy, cleaning_policy_names, "Unknown");
} }
inline int validate_str_promotion_policy(const char *s)
{
return validate_str_val_mapping(s, promotion_policy_names, -1);
}
inline const char *promotion_policy_to_name(uint8_t policy)
{
return val_to_short_name(policy, promotion_policy_names, "Unknown");
}
const char *metadata_mode_to_name(uint8_t metadata_mode) const char *metadata_mode_to_name(uint8_t metadata_mode)
{ {
return val_to_short_name(metadata_mode, metadata_mode_names, "Invalid"); return val_to_short_name(metadata_mode, metadata_mode_names, "Invalid");
@ -707,6 +723,7 @@ struct cache_device *get_cache_device(const struct kcas_cache_info *info)
cache->flushed = info->info.flushed; cache->flushed = info->info.flushed;
cache->eviction_policy = info->info.eviction_policy; cache->eviction_policy = info->info.eviction_policy;
cache->cleaning_policy = info->info.cleaning_policy; cache->cleaning_policy = info->info.cleaning_policy;
cache->promotion_policy = info->info.promotion_policy;
cache->size = info->info.cache_line_size; cache->size = info->info.cache_line_size;
if ((info->info.state & (1 << ocf_cache_state_running)) == 0) { if ((info->info.state & (1 << ocf_cache_state_running)) == 0) {

View File

@ -44,6 +44,7 @@ struct cache_device {
int mode; int mode;
int eviction_policy; int eviction_policy;
int cleaning_policy; int cleaning_policy;
int promotion_policy;
int dirty; int dirty;
int flushed; int flushed;
unsigned size; unsigned size;
@ -92,6 +93,7 @@ enum metadata_mode_t {
const char *eviction_policy_to_name(uint8_t policy); const char *eviction_policy_to_name(uint8_t policy);
const char *cleaning_policy_to_name(uint8_t policy); const char *cleaning_policy_to_name(uint8_t policy);
const char *promotion_policy_to_name(uint8_t policy);
const char *cache_mode_to_name(uint8_t cache_mode); const char *cache_mode_to_name(uint8_t cache_mode);
const char *get_cache_state_name(int cache_state); const char *get_cache_state_name(int cache_state);
const char *get_core_state_name(int core_state); const char *get_core_state_name(int core_state);
@ -256,6 +258,7 @@ int validate_path(const char *path, int exist);
int validate_str_cache_mode(const char *s); int validate_str_cache_mode(const char *s);
int validate_str_ev_policy(const char *s); int validate_str_ev_policy(const char *s);
int validate_str_cln_policy(const char *s); int validate_str_cln_policy(const char *s);
int validate_str_promotion_policy(const char *s);
int validate_str_meta_variant(const char *s); int validate_str_meta_variant(const char *s);
int validate_str_stats_filters(const char* s); int validate_str_stats_filters(const char* s);
int validate_str_output_format(const char* s); int validate_str_output_format(const char* s);

View File

@ -50,6 +50,7 @@ struct command_args{
int cache_state_flush; int cache_state_flush;
int flush_data; int flush_data;
int cleaning_policy_type; int cleaning_policy_type;
int promotion_policy_type;
int script_subcmd; int script_subcmd;
int try_add; int try_add;
int update_path; int update_path;
@ -75,6 +76,7 @@ static struct command_args command_args_values = {
.cache_state_flush = UNDEFINED, /* three state logic: YES NO UNDEFINED */ .cache_state_flush = UNDEFINED, /* three state logic: YES NO UNDEFINED */
.flush_data = 1, .flush_data = 1,
.cleaning_policy_type = 0, .cleaning_policy_type = 0,
.promotion_policy_type = 0,
.script_subcmd = -1, .script_subcmd = -1,
.try_add = false, .try_add = false,
.update_path = false, .update_path = false,
@ -560,6 +562,12 @@ static char *cleaning_policy_type_values[] = {
NULL, NULL,
}; };
static char *promotion_policy_type_values[] = {
[ocf_promotion_always] = "always",
[ocf_promotion_nhit] = "nhit",
NULL,
};
static struct cas_param cas_cache_params[] = { static struct cas_param cas_cache_params[] = {
/* Cleaning policy type */ /* Cleaning policy type */
[cache_param_cleaning_policy_type] = { [cache_param_cleaning_policy_type] = {
@ -588,6 +596,20 @@ static struct cas_param cas_cache_params[] = {
[cache_param_cleaning_acp_flush_max_buffers] = { [cache_param_cleaning_acp_flush_max_buffers] = {
.name = "Flush max buffers" , .name = "Flush max buffers" ,
}, },
/* Promotion policy type */
[cache_param_promotion_policy_type] = {
.name = "Promotion policy type",
.value_names = promotion_policy_type_values,
},
/*Promotion policy NHIT params */
[cache_param_promotion_nhit_insertion_threshold] = {
.name = "Insertion threshold",
},
[cache_param_promotion_nhit_trigger_threshold] = {
.name = "Policy trigger [%]",
},
{0}, {0},
}; };
@ -614,6 +636,15 @@ static struct cas_param cas_cache_params[] = {
#define CLEANING_ACP_MAX_BUFFERS_DESC "Number of cache lines flushed in single ACP cleaning thread iteration" \ #define CLEANING_ACP_MAX_BUFFERS_DESC "Number of cache lines flushed in single ACP cleaning thread iteration" \
" <%d-%d> (default: %d)" " <%d-%d> (default: %d)"
#define PROMOTION_POLICY_TYPE_DESC "Promotion policy type. "\
"Available policy types: {always|nhit}"
#define PROMOTION_NHIT_TRIGGER_DESC "Cache occupancy value over which NHIT promotion is active " \
"<%d-%d>[%] (default: %d%)"
#define PROMOTION_NHIT_THRESHOLD_DESC "Number of requests for given core line " \
"after which NHIT policy allows insertion into cache <%d-%d> (default: %d)"
static cli_namespace set_param_namespace = { static cli_namespace set_param_namespace = {
.short_name = 'n', .short_name = 'n',
.long_name = "name", .long_name = "name",
@ -627,6 +658,21 @@ static cli_namespace set_param_namespace = {
{'p', "policy", CLEANING_POLICY_TYPE_DESC, 1, "POLICY", 0}, {'p', "policy", CLEANING_POLICY_TYPE_DESC, 1, "POLICY", 0},
CACHE_PARAMS_NS_END() CACHE_PARAMS_NS_END()
CACHE_PARAMS_NS_BEGIN("promotion", "Promotion policy parameters")
{'p', "policy", PROMOTION_POLICY_TYPE_DESC, 1, "POLICY", 0},
CACHE_PARAMS_NS_END()
CACHE_PARAMS_NS_BEGIN("promotion-nhit", "Promotion policy NHIT parameters")
{'t', "threshold", PROMOTION_NHIT_THRESHOLD_DESC, 1, "NUMBER",
CLI_OPTION_RANGE_INT | CLI_OPTION_DEFAULT_INT,
OCF_NHIT_MIN_THRESHOLD, OCF_NHIT_MAX_THRESHOLD,
OCF_NHIT_THRESHOLD_DEFAULT},
{'o', "trigger", PROMOTION_NHIT_TRIGGER_DESC, 1, "NUMBER",
CLI_OPTION_RANGE_INT | CLI_OPTION_DEFAULT_INT,
OCF_NHIT_MIN_TRIGGER, OCF_NHIT_MAX_TRIGGER,
OCF_NHIT_TRIGGER_DEFAULT},
CACHE_PARAMS_NS_END()
CACHE_PARAMS_NS_BEGIN("cleaning-alru", "Cleaning policy ALRU parameters") CACHE_PARAMS_NS_BEGIN("cleaning-alru", "Cleaning policy ALRU parameters")
{'w', "wake-up", CLEANING_ALRU_WAKE_UP_DESC, 1, "NUMBER", {'w', "wake-up", CLEANING_ALRU_WAKE_UP_DESC, 1, "NUMBER",
CLI_OPTION_RANGE_INT | CLI_OPTION_DEFAULT_INT, CLI_OPTION_RANGE_INT | CLI_OPTION_DEFAULT_INT,
@ -772,6 +818,49 @@ int set_param_cleaning_acp_handle_option(char *opt, const char **arg)
SET_CACHE_PARAM(cache_param_cleaning_acp_flush_max_buffers, SET_CACHE_PARAM(cache_param_cleaning_acp_flush_max_buffers,
strtoul(arg[0], NULL, 10)); strtoul(arg[0], NULL, 10));
}
return FAILURE;
}
int set_param_promotion_handle_option(char *opt, const char **arg)
{
if (!strcmp(opt, "policy")) {
if (!strcmp("always", arg[0])) {
SET_CACHE_PARAM(cache_param_promotion_policy_type,
ocf_promotion_always);
} else if (!strcmp("nhit", arg[0])) {
SET_CACHE_PARAM(cache_param_promotion_policy_type,
ocf_promotion_nhit);
} else {
cas_printf(LOG_ERR, "Error: Invalid policy name.\n");
return FAILURE;
}
} else {
return FAILURE;
}
return SUCCESS;
}
int set_param_promotion_nhit_handle_option(char *opt, const char **arg)
{
if (!strcmp(opt, "threshold")) {
if (validate_str_num(arg[0], "threshold",
OCF_NHIT_MIN_THRESHOLD, OCF_NHIT_MAX_THRESHOLD)) {
return FAILURE;
}
SET_CACHE_PARAM(cache_param_promotion_nhit_insertion_threshold,
strtoul(arg[0], NULL, 10));
} else if (!strcmp(opt, "trigger")) {
if (validate_str_num(arg[0], "trigger",
OCF_NHIT_MIN_TRIGGER, OCF_NHIT_MAX_THRESHOLD)) {
return FAILURE;
}
SET_CACHE_PARAM(cache_param_promotion_nhit_trigger_threshold,
strtoul(arg[0], NULL, 10));
} else { } else {
return FAILURE; return FAILURE;
} }
@ -793,6 +882,12 @@ int set_param_namespace_handle_option(char *namespace, char *opt, const char **a
} else if (!strcmp(namespace, "cleaning-acp")) { } else if (!strcmp(namespace, "cleaning-acp")) {
return cache_param_handle_option_generic(opt, arg, return cache_param_handle_option_generic(opt, arg,
set_param_cleaning_acp_handle_option); set_param_cleaning_acp_handle_option);
} else if (!strcmp(namespace, "promotion")) {
return cache_param_handle_option_generic(opt, arg,
set_param_promotion_handle_option);
} else if (!strcmp(namespace, "promotion-nhit")) {
return cache_param_handle_option_generic(opt, arg,
set_param_promotion_nhit_handle_option);
} else { } else {
return FAILURE; return FAILURE;
} }
@ -831,6 +926,8 @@ static cli_namespace get_param_namespace = {
GET_CACHE_PARAMS_NS("cleaning", "Cleaning policy parameters") GET_CACHE_PARAMS_NS("cleaning", "Cleaning policy parameters")
GET_CACHE_PARAMS_NS("cleaning-alru", "Cleaning policy ALRU parameters") GET_CACHE_PARAMS_NS("cleaning-alru", "Cleaning policy ALRU parameters")
GET_CACHE_PARAMS_NS("cleaning-acp", "Cleaning policy ACP parameters") GET_CACHE_PARAMS_NS("cleaning-acp", "Cleaning policy ACP parameters")
GET_CACHE_PARAMS_NS("promotion", "Promotion policy parameters")
GET_CACHE_PARAMS_NS("promotion-nhit", "Promotion policy NHIT parameters")
{0}, {0},
}, },
@ -872,6 +969,15 @@ int get_param_namespace_handle_option(char *namespace, char *opt, const char **a
SELECT_CACHE_PARAM(cache_param_cleaning_acp_flush_max_buffers); SELECT_CACHE_PARAM(cache_param_cleaning_acp_flush_max_buffers);
return cache_param_handle_option_generic(opt, arg, return cache_param_handle_option_generic(opt, arg,
get_param_handle_option); get_param_handle_option);
} else if (!strcmp(namespace, "promotion")) {
SELECT_CACHE_PARAM(cache_param_promotion_policy_type);
return cache_param_handle_option_generic(opt, arg,
get_param_handle_option);
} else if (!strcmp(namespace, "promotion-nhit")) {
SELECT_CACHE_PARAM(cache_param_promotion_nhit_insertion_threshold);
SELECT_CACHE_PARAM(cache_param_promotion_nhit_trigger_threshold);
return cache_param_handle_option_generic(opt, arg,
get_param_handle_option);
} else { } else {
return FAILURE; return FAILURE;
} }

View File

@ -548,6 +548,8 @@ int cache_stats_conf(int ctrl_fd, const struct kcas_cache_info *cache_info,
eviction_policy_to_name(cache_info->info.eviction_policy)); eviction_policy_to_name(cache_info->info.eviction_policy));
print_kv_pair(outfile, "Cleaning Policy", "%s", print_kv_pair(outfile, "Cleaning Policy", "%s",
cleaning_policy_to_name(cache_info->info.cleaning_policy)); cleaning_policy_to_name(cache_info->info.cleaning_policy));
print_kv_pair(outfile, "Promotion Policy", "%s",
promotion_policy_to_name(cache_info->info.promotion_policy));
print_kv_pair(outfile, "Cache line size", "%llu, [KiB]", print_kv_pair(outfile, "Cache line size", "%llu, [KiB]",
cache_info->info.cache_line_size / KiB); cache_info->info.cache_line_size / KiB);