From 2b68b839565e38d8b73f1ec79cc6c84f7f3bade4 Mon Sep 17 00:00:00 2001 From: Christophe Varoqui Date: Tue, 1 Feb 2011 00:21:17 +0100 Subject: [PATCH] Support different 'minio' values for rq and bio based dm-multipath rq based dm-multipath wants a low minio value for optimal performance (1-2?) whereas bio-based dm-multipath wants a greater value (128-1000) Introduce a internal DEFAULT_MINIO_RQ set to 1, and new configuration parameter name 'rr_min_io_rq' useable in 'default', 'device' and 'multipath' sections. The internal hardware table entries also have the new 'minio_rq' field. When dm-multipath driver version is detected >= 1.1.0, only the rr_min_io_rq (cf), minio_rq (hwe) and DEFAULT_MINIO_RQ (default) are used. Else, preserve the legacy behaviour. --- libmultipath/config.c | 7 +++- libmultipath/config.h | 4 +++ libmultipath/defaults.h | 1 + libmultipath/devmapper.c | 81 +++++++++++++++++++++++++++++++++++-------- libmultipath/devmapper.h | 1 + libmultipath/dict.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++ libmultipath/hwtable.c | 52 ++++++++++++++++++++++++++++ libmultipath/propsel.c | 40 +++++++++++++++++++-- 8 files changed, 258 insertions(+), 18 deletions(-) diff --git a/libmultipath/config.c b/libmultipath/config.c index 00acf96..f8ba4aa 100644 --- a/libmultipath/config.c +++ b/libmultipath/config.c @@ -19,6 +19,7 @@ #include "blacklist.h" #include "defaults.h" #include "prio.h" +#include "devmapper.h" static int hwe_strmatch (struct hwentry *hwe1, struct hwentry *hwe2) @@ -292,6 +293,7 @@ merge_hwe (struct hwentry * hwe1, struct hwentry * hwe2) merge_num(rr_weight); merge_num(no_path_retry); merge_num(minio); + merge_num(minio_rq); return 0; } @@ -345,6 +347,7 @@ store_hwe (vector hwtable, struct hwentry * dhwe) hwe->rr_weight = dhwe->rr_weight; hwe->no_path_retry = dhwe->no_path_retry; hwe->minio = dhwe->minio; + hwe->minio_rq = dhwe->minio_rq; if (dhwe->bl_product && !(hwe->bl_product = set_param_str(dhwe->bl_product))) goto out; @@ -454,8 +457,10 @@ load_config (char * file) if (!conf->verbosity) conf->verbosity = DEFAULT_VERBOSITY; + conf->dmrq = dm_drv_get_rq(); conf->dev_type = DEV_NONE; - conf->minio = 1000; + conf->minio = DEFAULT_MINIO; + conf->minio_rq = DEFAULT_MINIO_RQ; conf->max_fds = 0; conf->bindings_file = DEFAULT_BINDINGS_FILE; conf->bindings_read_only = 0; diff --git a/libmultipath/config.h b/libmultipath/config.h index 3877520..46cd32a 100644 --- a/libmultipath/config.h +++ b/libmultipath/config.h @@ -32,6 +32,7 @@ struct hwentry { int rr_weight; int no_path_retry; int minio; + int minio_rq; int pg_timeout; int flush_on_last_del; int fast_io_fail; @@ -50,6 +51,7 @@ struct mpentry { int rr_weight; int no_path_retry; int minio; + int minio_rq; int pg_timeout; int flush_on_last_del; int attribute_flags; @@ -59,6 +61,7 @@ struct mpentry { }; struct config { + int dmrq; int verbosity; int dry_run; int list; @@ -67,6 +70,7 @@ struct config { int pgpolicy; enum devtypes dev_type; int minio; + int minio_rq; int checkint; int max_checkint; int pgfailback; diff --git a/libmultipath/defaults.h b/libmultipath/defaults.h index 77526dd..aa5d538 100644 --- a/libmultipath/defaults.h +++ b/libmultipath/defaults.h @@ -6,6 +6,7 @@ #define DEFAULT_FEATURES "0" #define DEFAULT_HWHANDLER "0" #define DEFAULT_MINIO 1000 +#define DEFAULT_MINIO_RQ 1 #define DEFAULT_PGPOLICY FAILOVER #define DEFAULT_FAILBACK -FAILBACK_MANUAL #define DEFAULT_RR_WEIGHT RR_WEIGHT_NONE diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c index 4a25563..edd7692 100644 --- a/libmultipath/devmapper.c +++ b/libmultipath/devmapper.c @@ -72,6 +72,12 @@ dm_init(void) { dm_log_init_verbose(conf ? conf->verbosity + 3 : 0); } +#define VERSION_GE(v, minv) ( \ + (v[0] > minv[0]) || \ + ((v[0] == minv[0]) && (v[1] > minv[1])) || \ + ((v[0] == minv[0]) && (v[1] == minv[1]) && (v[2] >= minv[2])) \ +) + static int dm_libprereq (void) { @@ -83,9 +89,7 @@ dm_libprereq (void) condlog(3, "libdevmapper version %s", version); sscanf(version, "%d.%d.%d ", &v[0], &v[1], &v[2]); - if ((v[0] > minv[0]) || - ((v[0] == minv[0]) && (v[1] > minv[1])) || - ((v[0] == minv[0]) && (v[1] == minv[1]) && (v[2] >= minv[2]))) + if VERSION_GE(v, minv) return 0; condlog(0, "libdevmapper version must be >= %d.%.2d.%.2d", minv[0], minv[1], minv[2]); @@ -93,17 +97,16 @@ dm_libprereq (void) } static int -dm_drvprereq (char * str) +dm_drv_version (unsigned int * version, char * str) { int r = 2; struct dm_task *dmt; struct dm_versions *target; struct dm_versions *last_target; - int minv[3] = {1, 0, 3}; unsigned int *v; if (!(dmt = dm_task_create(DM_DEVICE_LIST_VERSIONS))) - return 3; + return 1; dm_task_no_open_count(dmt); @@ -123,23 +126,71 @@ dm_drvprereq (char * str) } while (last_target != target); if (r == 2) { - condlog(0, "DM multipath kernel driver not loaded"); + condlog(0, "DM %s kernel driver not loaded", str); goto out; } v = target->version; - if ((v[0] > minv[0]) || - ((v[0] == minv[0]) && (v[1] > minv[1])) || - ((v[0] == minv[0]) && (v[1] == minv[1]) && (v[2] >= minv[2]))) { - r = 0; - goto out; - } - condlog(0, "DM multipath kernel driver must be >= %u.%.2u.%.2u", - minv[0], minv[1], minv[2]); + version[0] = v[0]; + version[1] = v[1]; + version[2] = v[2]; + r = 0; out: dm_task_destroy(dmt); return r; } +int +dm_drv_get_rq (void) +{ + unsigned int minv_dmrq[3] = {1, 1, 0}; + unsigned int *v; + + v = zalloc(3); + if (!v) + return 0; + + if (dm_drv_version(v, TGT_MPATH)) { + /* in doubt return least capable */ + return 0; + } + + /* test request based multipath capability */ + if VERSION_GE(v, minv_dmrq) { + condlog(3, "activate request-based multipathing mode " + "(driver >= v%u.%u.%u)", + minv_dmrq[0], minv_dmrq[1], minv_dmrq[2]); + return 1; + } + return 0; +} + +static int +dm_drvprereq (char * str) +{ + unsigned int minv[3] = {1, 0, 3}; + unsigned int *v; + + v = zalloc(3); + if (!v) + return 0; + + if (dm_drv_version(v, str)) { + /* in doubt return not capable */ + return 1; + } + + /* test request based multipath capability */ + condlog(3, "DM multipath kernel driver v%u.%u.%u", + v[0], v[1], v[2]); + + if VERSION_GE(v, minv) + return 1; + + condlog(0, "DM multipath kernel driver must be >= v%u.%u.%u", + minv[0], minv[1], minv[2]); + return 0; +} + extern int dm_prereq (void) { diff --git a/libmultipath/devmapper.h b/libmultipath/devmapper.h index d2dd572..1322e22 100644 --- a/libmultipath/devmapper.h +++ b/libmultipath/devmapper.h @@ -8,6 +8,7 @@ void dm_init(void); int dm_prereq (void); +int dm_drv_get_rq (void); int dm_simplecmd_flush (int, const char *, int); int dm_simplecmd_noflush (int, const char *); int dm_addmap_create (struct multipath *mpp); diff --git a/libmultipath/dict.c b/libmultipath/dict.c index c5c085d..fdeaec2 100644 --- a/libmultipath/dict.c +++ b/libmultipath/dict.c @@ -208,6 +208,22 @@ def_minio_handler(vector strvec) } static int +def_minio_rq_handler(vector strvec) +{ + char * buff; + + buff = set_value(strvec); + + if (!buff) + return 1; + + conf->minio_rq = atoi(buff); + FREE(buff); + + return 0; +} + +static int get_sys_max_fds(int *max_fds) { FILE *file; @@ -992,6 +1008,26 @@ hw_minio_handler(vector strvec) } static int +hw_minio_rq_handler(vector strvec) +{ + struct hwentry *hwe = VECTOR_LAST_SLOT(conf->hwtable); + char * buff; + + if (!hwe) + return 1; + + buff = set_value(strvec); + + if (!buff) + return 1; + + hwe->minio_rq = atoi(buff); + FREE(buff); + + return 0; +} + +static int hw_pg_timeout_handler(vector strvec) { int pg_timeout; @@ -1324,6 +1360,26 @@ mp_minio_handler(vector strvec) } static int +mp_minio_rq_handler(vector strvec) +{ + struct mpentry *mpe = VECTOR_LAST_SLOT(conf->mptable); + char * buff; + + if (!mpe) + return 1; + + buff = set_value(strvec); + + if (!buff) + return 1; + + mpe->minio_rq = atoi(buff); + FREE(buff); + + return 0; +} + +static int mp_pg_timeout_handler(vector strvec) { int pg_timeout; @@ -1524,6 +1580,17 @@ snprint_mp_rr_min_io (char * buff, int len, void * data) } static int +snprint_mp_rr_min_io_rq (char * buff, int len, void * data) +{ + struct mpentry * mpe = (struct mpentry *)data; + + if (!mpe->minio_rq) + return 0; + + return snprintf(buff, len, "%u", mpe->minio_rq); +} + +static int snprint_mp_pg_timeout (char * buff, int len, void * data) { struct mpentry * mpe = (struct mpentry *)data; @@ -1768,6 +1835,17 @@ snprint_hw_rr_min_io (char * buff, int len, void * data) } static int +snprint_hw_rr_min_io_rq (char * buff, int len, void * data) +{ + struct hwentry * hwe = (struct hwentry *)data; + + if (!hwe->minio_rq) + return 0; + + return snprintf(buff, len, "%u", hwe->minio_rq); +} + +static int snprint_hw_pg_timeout (char * buff, int len, void * data) { struct hwentry * hwe = (struct hwentry *)data; @@ -1957,6 +2035,15 @@ snprint_def_rr_min_io (char * buff, int len, void * data) } static int +snprint_def_rr_min_io_rq (char * buff, int len, void * data) +{ + if (!conf->minio_rq) + return 0; + + return snprintf(buff, len, "%u", conf->minio_rq); +} + +static int snprint_max_fds (char * buff, int len, void * data) { if (!conf->max_fds) @@ -2128,6 +2215,7 @@ init_keywords(void) install_keyword("alias_prefix", &def_alias_prefix_handler, &snprint_def_alias_prefix); install_keyword("failback", &default_failback_handler, &snprint_def_failback); install_keyword("rr_min_io", &def_minio_handler, &snprint_def_rr_min_io); + install_keyword("rr_min_io_rq", &def_minio_rq_handler, &snprint_def_rr_min_io_rq); install_keyword("max_fds", &max_fds_handler, &snprint_max_fds); install_keyword("rr_weight", &def_weight_handler, &snprint_def_rr_weight); install_keyword("no_path_retry", &def_no_path_retry_handler, &snprint_def_no_path_retry); @@ -2195,6 +2283,7 @@ init_keywords(void) install_keyword("rr_weight", &hw_weight_handler, &snprint_hw_rr_weight); install_keyword("no_path_retry", &hw_no_path_retry_handler, &snprint_hw_no_path_retry); install_keyword("rr_min_io", &hw_minio_handler, &snprint_hw_rr_min_io); + install_keyword("rr_min_io_rq", &hw_minio_rq_handler, &snprint_hw_rr_min_io_rq); install_keyword("pg_timeout", &hw_pg_timeout_handler, &snprint_hw_pg_timeout); install_keyword("flush_on_last_del", &hw_flush_on_last_del_handler, &snprint_hw_flush_on_last_del); install_keyword("fast_io_fail_tmo", &hw_fast_io_fail_handler, &snprint_hw_fast_io_fail); @@ -2212,6 +2301,7 @@ init_keywords(void) install_keyword("rr_weight", &mp_weight_handler, &snprint_mp_rr_weight); install_keyword("no_path_retry", &mp_no_path_retry_handler, &snprint_mp_no_path_retry); install_keyword("rr_min_io", &mp_minio_handler, &snprint_mp_rr_min_io); + install_keyword("rr_min_io_rq", &mp_minio_rq_handler, &snprint_mp_rr_min_io_rq); install_keyword("pg_timeout", &mp_pg_timeout_handler, &snprint_mp_pg_timeout); install_keyword("flush_on_last_del", &mp_flush_on_last_del_handler, &snprint_mp_flush_on_last_del); install_keyword("mode", &mp_mode_handler, &snprint_mp_mode); diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c index 18c704c..9e6888e 100644 --- a/libmultipath/hwtable.c +++ b/libmultipath/hwtable.c @@ -35,6 +35,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_QUEUE, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = TUR, .prio_name = DEFAULT_PRIO, .prio_args = NULL, @@ -57,6 +58,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = DEFAULT_CHECKER, .prio_name = DEFAULT_PRIO, .prio_args = NULL, @@ -79,6 +81,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = DEFAULT_CHECKER, .prio_name = DEFAULT_PRIO, .prio_args = NULL, @@ -95,6 +98,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = HP_SW, .prio_name = PRIO_HP_SW, .prio_args = NULL, @@ -111,6 +115,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = 12, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = DIRECTIO, .prio_name = DEFAULT_PRIO, .prio_args = NULL, @@ -232,6 +237,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = 12, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = TUR, .prio_name = DEFAULT_PRIO, .prio_args = NULL, @@ -254,6 +260,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = DIRECTIO, .prio_name = DEFAULT_PRIO, .prio_args = NULL, @@ -276,6 +283,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = DIRECTIO, .prio_name = DEFAULT_PRIO, .prio_args = NULL, @@ -293,6 +301,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = (300 / DEFAULT_CHECKINT), .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = EMC_CLARIION, .prio_name = PRIO_EMC, .prio_args = NULL, @@ -310,6 +319,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = 5, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .prio_name = DEFAULT_PRIO, .prio_args = NULL, }, @@ -331,6 +341,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = DIRECTIO, .prio_name = DEFAULT_PRIO, .prio_args = NULL, @@ -348,6 +359,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = 5, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = TUR, .prio_name = DEFAULT_PRIO, .prio_args = NULL, @@ -370,6 +382,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = TUR, .prio_name = DEFAULT_PRIO, .prio_args = NULL, @@ -386,6 +399,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = TUR, .prio_name = PRIO_HDS, .prio_args = NULL, @@ -408,6 +422,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = DIRECTIO, .prio_name = DEFAULT_PRIO, .prio_args = NULL, @@ -425,6 +440,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = 300, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = RDAC, .prio_name = PRIO_RDAC, .prio_args = NULL, @@ -442,6 +458,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = 300, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = RDAC, .prio_name = PRIO_RDAC, .prio_args = NULL, @@ -459,6 +476,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = 300, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = RDAC, .prio_name = PRIO_RDAC, .prio_args = NULL, @@ -476,6 +494,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_QUEUE, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = RDAC, .prio_name = PRIO_RDAC, .prio_args = NULL, @@ -492,6 +511,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = 15, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = RDAC, .prio_name = PRIO_RDAC, .prio_args = NULL, @@ -509,6 +529,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_QUEUE, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = RDAC, .prio_name = PRIO_RDAC, .prio_args = NULL, @@ -526,6 +547,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_QUEUE, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = RDAC, .prio_name = PRIO_RDAC, .prio_args = NULL, @@ -543,6 +565,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_QUEUE, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = RDAC, .prio_name = PRIO_RDAC, .prio_args = NULL, @@ -560,6 +583,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_QUEUE, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = RDAC, .prio_name = PRIO_RDAC, .prio_args = NULL, @@ -577,6 +601,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = TUR, .prio_name = DEFAULT_PRIO, .prio_args = NULL, @@ -594,6 +619,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = TUR, .prio_name = DEFAULT_PRIO, .prio_args = NULL, @@ -611,6 +637,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = TUR, .prio_name = DEFAULT_PRIO, .prio_args = NULL, @@ -628,6 +655,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = TUR, .prio_name = PRIO_ALUA, .prio_args = NULL, @@ -645,6 +673,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = TUR, .prio_name = DEFAULT_PRIO, .prio_args = NULL, @@ -662,6 +691,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = TUR, .prio_name = PRIO_ALUA, .prio_args = NULL, @@ -680,6 +710,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = DIRECTIO, .prio_name = DEFAULT_PRIO, .prio_args = NULL, @@ -698,6 +729,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = DIRECTIO, .prio_name = DEFAULT_PRIO, .prio_args = NULL, @@ -715,6 +747,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = TUR, .prio_name = PRIO_ALUA, .prio_args = NULL, @@ -738,6 +771,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = (300 / DEFAULT_CHECKINT), .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = DIRECTIO, .prio_name = DEFAULT_PRIO, .prio_args = NULL, @@ -755,6 +789,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = (300 / DEFAULT_CHECKINT), .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = TUR, .prio_name = DEFAULT_PRIO, .prio_args = NULL, @@ -772,6 +807,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = (300 / DEFAULT_CHECKINT), .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = TUR, .prio_name = PRIO_ALUA, .prio_args = NULL, @@ -789,6 +825,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = 15, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = RDAC, .prio_name = PRIO_RDAC, .prio_args = NULL, @@ -806,6 +843,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = 15, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = RDAC, .prio_name = PRIO_RDAC, .prio_args = NULL, @@ -823,6 +861,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = 15, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = RDAC, .prio_name = PRIO_RDAC, .prio_args = NULL, @@ -840,6 +879,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = 15, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = RDAC, .prio_name = PRIO_RDAC, .prio_args = NULL, @@ -928,6 +968,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = TUR, .prio_name = PRIO_ALUA, .prio_args = NULL, @@ -951,6 +992,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = DIRECTIO, .prio_name = DEFAULT_PRIO, .prio_args = NULL, @@ -967,6 +1009,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_QUEUE, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = RDAC, .prio_name = PRIO_RDAC, .prio_args = NULL, @@ -983,6 +1026,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = 15, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = RDAC, .prio_name = PRIO_RDAC, .prio_args = NULL, @@ -1005,6 +1049,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = TUR, .prio_name = PRIO_RDAC, .prio_args = NULL, @@ -1027,6 +1072,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = DIRECTIO, .prio_name = DEFAULT_PRIO, .prio_args = NULL, @@ -1043,6 +1089,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_UNDEF, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = DEFAULT_CHECKER, .prio_name = DEFAULT_PRIO, }, @@ -1080,6 +1127,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_QUEUE, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = RDAC, .prio_name = PRIO_RDAC, .prio_args = NULL, @@ -1097,6 +1145,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_QUEUE, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = RDAC, .prio_name = PRIO_RDAC, .prio_args = NULL, @@ -1114,6 +1163,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = 15, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = RDAC, .prio_name = PRIO_RDAC, .prio_args = NULL, @@ -1131,6 +1181,7 @@ static struct hwentry default_hw[] = { .rr_weight = RR_WEIGHT_NONE, .no_path_retry = NO_PATH_RETRY_QUEUE, .minio = DEFAULT_MINIO, + .minio_rq = DEFAULT_MINIO_RQ, .checker_name = RDAC, .prio_name = PRIO_RDAC, .prio_args = NULL, @@ -1150,6 +1201,7 @@ static struct hwentry default_hw[] = { .rr_weight = 0, .no_path_retry = 0, .minio = 0, + .minio_rq = 0, .checker_name = NULL, .prio_name = NULL, .prio_args = NULL, diff --git a/libmultipath/propsel.c b/libmultipath/propsel.c index 5e67019..2055d2a 100644 --- a/libmultipath/propsel.c +++ b/libmultipath/propsel.c @@ -418,8 +418,35 @@ select_no_path_retry(struct multipath *mp) return 0; } -extern int -select_minio (struct multipath * mp) +int +select_minio_rq (struct multipath * mp) +{ + if (mp->mpe && mp->mpe->minio_rq) { + mp->minio = mp->mpe->minio_rq; + condlog(3, "%s: minio = %i rq (LUN setting)", + mp->alias, mp->minio); + return 0; + } + if (mp->hwe && mp->hwe->minio_rq) { + mp->minio = mp->hwe->minio_rq; + condlog(3, "%s: minio = %i rq (controller setting)", + mp->alias, mp->minio); + return 0; + } + if (conf->minio) { + mp->minio = conf->minio_rq; + condlog(3, "%s: minio = %i rq (config file default)", + mp->alias, mp->minio); + return 0; + } + mp->minio = DEFAULT_MINIO_RQ; + condlog(3, "%s: minio = %i rq (internal default)", + mp->alias, mp->minio); + return 0; +} + +int +select_minio_bio (struct multipath * mp) { if (mp->mpe && mp->mpe->minio) { mp->minio = mp->mpe->minio; @@ -446,6 +473,15 @@ select_minio (struct multipath * mp) } extern int +select_minio (struct multipath * mp) +{ + if (conf->dmrq) + return select_minio_rq(mp); + else + return select_minio_bio(mp); +} + +extern int select_pg_timeout(struct multipath *mp) { if (mp->mpe && mp->mpe->pg_timeout != PGTIMEOUT_UNDEF) { -- 2.7.4