From patchwork Fri May 19 23:02:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Marzinski X-Patchwork-Id: 13248942 X-Patchwork-Delegate: christophe.varoqui@free.fr Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 43B6CC7EE2D for ; Fri, 19 May 2023 23:02:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1684537345; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=U8+5dgRAXlnfFn4s2XJyhTH7yCMLCHMJFNIAGMiLs3A=; b=atmVfDCe8XcCNAZcLyPwha8B+46hgXFjTfeIjRAcIx+U/JfTY59kofeXSLEJkvZs7qwj1o GCttlPf3d9vJQDl/1q7CsDeTwH1bdkTUgAE+BnmxVp6tAGQmNoc26wKteDEDiPcPiwOmaq 2h/Wo8kyLrB7Px/zb947xpka1omAEnA= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-207-zeF4KjSCMB-DLf26Li2CIg-1; Fri, 19 May 2023 19:02:22 -0400 X-MC-Unique: zeF4KjSCMB-DLf26Li2CIg-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 8344B1C041B7; Fri, 19 May 2023 23:02:20 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id A244140D1B60; Fri, 19 May 2023 23:02:17 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 6A3D119465B2; Fri, 19 May 2023 23:02:17 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 0B07719465A4 for ; Fri, 19 May 2023 23:02:16 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id E35DD492B0B; Fri, 19 May 2023 23:02:15 +0000 (UTC) Received: from octiron.msp.redhat.com (octiron.msp.redhat.com [10.15.80.209]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BAAF5492B0A; Fri, 19 May 2023 23:02:15 +0000 (UTC) Received: from octiron.msp.redhat.com (localhost.localdomain [127.0.0.1]) by octiron.msp.redhat.com (8.14.9/8.14.9) with ESMTP id 34JN2ELV023077; Fri, 19 May 2023 18:02:14 -0500 Received: (from bmarzins@localhost) by octiron.msp.redhat.com (8.14.9/8.14.9/Submit) id 34JN2D0U023076; Fri, 19 May 2023 18:02:13 -0500 From: Benjamin Marzinski To: Christophe Varoqui Date: Fri, 19 May 2023 18:02:08 -0500 Message-Id: <1684537332-23033-2-git-send-email-bmarzins@redhat.com> In-Reply-To: <1684537332-23033-1-git-send-email-bmarzins@redhat.com> References: <1684537332-23033-1-git-send-email-bmarzins@redhat.com> X-Scanned-By: MIMEDefang 3.1 on 10.11.54.10 Subject: [dm-devel] [PATCH 1/5] libmultipath: add group_by_tpg path_grouping_policy X-BeenThere: dm-devel@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: device-mapper development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: device-mapper development , Martin Wilck MIME-Version: 1.0 Errors-To: dm-devel-bounces@redhat.com Sender: "dm-devel" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.2 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com When we group paths by prio and the priority changes, paths can end up temporarily in the wrong path groups. This usually happens when some paths are down, so their priority can't be updated. To avoid this for ALUA paths, group them by their target port group instead. The path groups chosen by this policy won't always match with those chosen by group_by_prio, since it is possible for multiple ALUA target port groups to have the same priority. Signed-off-by: Benjamin Marzinski --- libmultipath/discovery.c | 1 + libmultipath/pgpolicies.c | 19 +++++++++++++++++++ libmultipath/pgpolicies.h | 4 +++- libmultipath/prioritizers/alua.c | 1 + libmultipath/propsel.c | 27 +++++++++++++++++++++++++-- libmultipath/structs.c | 1 + libmultipath/structs.h | 3 +++ multipath/main.c | 1 + multipath/multipath.conf.5 | 4 ++++ 9 files changed, 58 insertions(+), 3 deletions(-) diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c index 6865cd92..2dcafe5d 100644 --- a/libmultipath/discovery.c +++ b/libmultipath/discovery.c @@ -1051,6 +1051,7 @@ detect_alua(struct path * pp) return; } pp->tpgs = tpgs; + pp->tpg_id = ret; } int path_get_tpgs(struct path *pp) diff --git a/libmultipath/pgpolicies.c b/libmultipath/pgpolicies.c index 10b44d37..e14da8cc 100644 --- a/libmultipath/pgpolicies.c +++ b/libmultipath/pgpolicies.c @@ -25,6 +25,8 @@ int get_pgpolicy_id(char * str) return GROUP_BY_PRIO; if (0 == strncmp(str, "group_by_node_name", 18)) return GROUP_BY_NODE_NAME; + if (0 == strncmp(str, "group_by_tpg", 12)) + return GROUP_BY_TPG; return IOPOLICY_UNDEF; } @@ -49,6 +51,9 @@ int get_pgpolicy_name(char * buff, int len, int id) case GROUP_BY_NODE_NAME: s = "group_by_node_name"; break; + case GROUP_BY_TPG: + s = "group_by_tpg"; + break; default: s = "undefined"; break; @@ -191,6 +196,12 @@ prios_match(struct path *pp1, struct path *pp2) return (pp1->priority == pp2->priority); } +bool +tpg_match(struct path *pp1, struct path *pp2) +{ + return (pp1->tpg_id == pp2->tpg_id); +} + int group_by_match(struct multipath * mp, vector paths, bool (*path_match_fn)(struct path *, struct path *)) { @@ -279,6 +290,14 @@ int group_by_prio(struct multipath *mp, vector paths) return group_by_match(mp, paths, prios_match); } +/* + * One path group per alua target port group present in the path vector + */ +int group_by_tpg(struct multipath *mp, vector paths) +{ + return group_by_match(mp, paths, tpg_match); +} + int one_path_per_group(struct multipath *mp, vector paths) { int i; diff --git a/libmultipath/pgpolicies.h b/libmultipath/pgpolicies.h index 15927610..d3ab2f35 100644 --- a/libmultipath/pgpolicies.h +++ b/libmultipath/pgpolicies.h @@ -16,7 +16,8 @@ enum iopolicies { MULTIBUS, GROUP_BY_SERIAL, GROUP_BY_PRIO, - GROUP_BY_NODE_NAME + GROUP_BY_NODE_NAME, + GROUP_BY_TPG, }; int get_pgpolicy_id(char *); @@ -30,5 +31,6 @@ int one_group(struct multipath *, vector); int group_by_serial(struct multipath *, vector); int group_by_prio(struct multipath *, vector); int group_by_node_name(struct multipath *, vector); +int group_by_tpg(struct multipath *, vector); #endif diff --git a/libmultipath/prioritizers/alua.c b/libmultipath/prioritizers/alua.c index 0ab06e2b..4888a974 100644 --- a/libmultipath/prioritizers/alua.c +++ b/libmultipath/prioritizers/alua.c @@ -65,6 +65,7 @@ get_alua_info(struct path * pp, unsigned int timeout) return -ALUA_PRIO_NOT_SUPPORTED; return -ALUA_PRIO_RTPG_FAILED; } + pp->tpg_id = tpg; condlog(3, "%s: reported target port group is %i", pp->dev, tpg); rc = get_asymmetric_access_state(pp, tpg, timeout); if (rc < 0) { diff --git a/libmultipath/propsel.c b/libmultipath/propsel.c index a25cc921..841fa247 100644 --- a/libmultipath/propsel.c +++ b/libmultipath/propsel.c @@ -35,7 +35,8 @@ pgpolicyfn *pgpolicies[] = { one_group, group_by_serial, group_by_prio, - group_by_node_name + group_by_node_name, + group_by_tpg, }; #define do_set(var, src, dest, msg) \ @@ -249,10 +250,26 @@ out: return 0; } +static bool +verify_alua_prio(struct multipath *mp) +{ + int i; + struct path *pp; + + vector_foreach_slot(mp->paths, pp, i) { + const char *name = prio_name(&pp->prio); + if (strncmp(name, PRIO_ALUA, PRIO_NAME_LEN) && + strncmp(name, PRIO_SYSFS, PRIO_NAME_LEN)) + return false; + } + return true; +} + int select_pgpolicy(struct config *conf, struct multipath * mp) { const char *origin; char buff[POLICY_NAME_SIZE]; + int log_prio = 3; if (conf->pgpolicy_flag > 0) { mp->pgpolicy = conf->pgpolicy_flag; @@ -265,9 +282,15 @@ int select_pgpolicy(struct config *conf, struct multipath * mp) mp_set_conf(pgpolicy); mp_set_default(pgpolicy, DEFAULT_PGPOLICY); out: + if (mp->pgpolicy == GROUP_BY_TPG && !verify_alua_prio(mp)) { + mp->pgpolicy = DEFAULT_PGPOLICY; + origin = "(setting: emergency fallback - not all paths use alua prio)"; + log_prio = 1; + } mp->pgpolicyfn = pgpolicies[mp->pgpolicy]; get_pgpolicy_name(buff, POLICY_NAME_SIZE, mp->pgpolicy); - condlog(3, "%s: path_grouping_policy = %s %s", mp->alias, buff, origin); + condlog(log_prio, "%s: path_grouping_policy = %s %s", mp->alias, buff, + origin); return 0; } diff --git a/libmultipath/structs.c b/libmultipath/structs.c index 87e84d5d..39504dca 100644 --- a/libmultipath/structs.c +++ b/libmultipath/structs.c @@ -125,6 +125,7 @@ alloc_path (void) pp->sg_id.proto_id = PROTOCOL_UNSET; pp->fd = -1; pp->tpgs = TPGS_UNDEF; + pp->tpg_id = GROUP_ID_UNDEF; pp->priority = PRIO_UNDEF; pp->checkint = CHECKINT_UNDEF; checker_clear(&pp->checker); diff --git a/libmultipath/structs.h b/libmultipath/structs.h index a1208751..0eea19b4 100644 --- a/libmultipath/structs.h +++ b/libmultipath/structs.h @@ -317,6 +317,8 @@ struct hd_geometry { }; #endif +#define GROUP_ID_UNDEF -1 + struct path { char dev[FILE_NAME_SIZE]; char dev_t[BLK_DEV_SIZE]; @@ -372,6 +374,7 @@ struct path { /* configlet pointers */ vector hwe; struct gen_path generic_path; + int tpg_id; }; typedef int (pgpolicyfn) (struct multipath *, vector); diff --git a/multipath/main.c b/multipath/main.c index 90f940f1..b78f3162 100644 --- a/multipath/main.c +++ b/multipath/main.c @@ -157,6 +157,7 @@ usage (char * progname) " . group_by_serial one priority group per serial\n" " . group_by_prio one priority group per priority lvl\n" " . group_by_node_name one priority group per target node\n" + " . group_by_tpg one priority group per ALUA target port group\n" " -v lvl verbosity level:\n" " . 0 no output\n" " . 1 print created devmap names only\n" diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5 index b4dccd1b..b65a543d 100644 --- a/multipath/multipath.conf.5 +++ b/multipath/multipath.conf.5 @@ -233,6 +233,10 @@ per-multipath option in the configuration file. One priority group per target node name. Target node names are fetched in \fI/sys/class/fc_transport/target*/node_name\fR. .TP +.I group_by_tpg +One priority group per ALUA target port group. In order to use this policy, +all paths in the multipath device must have \fIprio\fR set to \fBalua\fR. +.TP The default is: \fBfailover\fR .RE . From patchwork Fri May 19 23:02:09 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Marzinski X-Patchwork-Id: 13248940 X-Patchwork-Delegate: christophe.varoqui@free.fr Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id D6DA8C77B7A for ; Fri, 19 May 2023 23:02:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1684537345; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=b+yXutruAvjs6jtv7j2ngJ1ZvdCnyOOw/sWMsNN5eXA=; b=iIi/1aOQlf0IYw+DAijySwZNS9kj/k9nqtVbI0izM2OR5afAAaFTlJxnozcSGWqnlih19d LBYYkNSneZeMwzPEhOZov5fSI00O10Idk+UX3r4PVIl1S/hpm/MGsORZe19m4U26M6iKHe 3MKslTPw42HYP637wpHcJu2Yw1KRN5k= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-168-Coh05ijhNEypxaRJ48zuXA-1; Fri, 19 May 2023 19:02:22 -0400 X-MC-Unique: Coh05ijhNEypxaRJ48zuXA-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 8324A1C041B6; Fri, 19 May 2023 23:02:20 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6F82840CFD45; Fri, 19 May 2023 23:02:18 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 43B0219465B7; Fri, 19 May 2023 23:02:18 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 059A319465A4 for ; Fri, 19 May 2023 23:02:17 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id CFAD040D1B60; Fri, 19 May 2023 23:02:16 +0000 (UTC) Received: from octiron.msp.redhat.com (octiron.msp.redhat.com [10.15.80.209]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B926940D1B61; Fri, 19 May 2023 23:02:16 +0000 (UTC) Received: from octiron.msp.redhat.com (localhost.localdomain [127.0.0.1]) by octiron.msp.redhat.com (8.14.9/8.14.9) with ESMTP id 34JN2FMj023081; Fri, 19 May 2023 18:02:15 -0500 Received: (from bmarzins@localhost) by octiron.msp.redhat.com (8.14.9/8.14.9/Submit) id 34JN2Ecd023080; Fri, 19 May 2023 18:02:14 -0500 From: Benjamin Marzinski To: Christophe Varoqui Date: Fri, 19 May 2023 18:02:09 -0500 Message-Id: <1684537332-23033-3-git-send-email-bmarzins@redhat.com> In-Reply-To: <1684537332-23033-1-git-send-email-bmarzins@redhat.com> References: <1684537332-23033-1-git-send-email-bmarzins@redhat.com> X-Scanned-By: MIMEDefang 3.1 on 10.11.54.2 Subject: [dm-devel] [PATCH 2/5] libmultipath: don't copy pgpolicy string in get_pgpolicy_name X-BeenThere: dm-devel@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: device-mapper development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: device-mapper development , Martin Wilck MIME-Version: 1.0 Errors-To: dm-devel-bounces@redhat.com Sender: "dm-devel" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com copying the value into a passed in buffer doesn't help any of the callers of this function. It's just wasted work. Signed-off-by: Benjamin Marzinski Reviewed-by: Martin Wilck --- libmultipath/dict.c | 6 +----- libmultipath/pgpolicies.c | 27 ++++++++------------------- libmultipath/pgpolicies.h | 2 +- libmultipath/propsel.c | 6 ++---- 4 files changed, 12 insertions(+), 29 deletions(-) diff --git a/libmultipath/dict.c b/libmultipath/dict.c index 2e9b45f9..dddd3cd6 100644 --- a/libmultipath/dict.c +++ b/libmultipath/dict.c @@ -1209,14 +1209,10 @@ set_pgpolicy(vector strvec, void *ptr, const char *file, int line_nr) int print_pgpolicy(struct strbuf *buff, long pgpolicy) { - char str[POLICY_NAME_SIZE]; - if (!pgpolicy) return 0; - get_pgpolicy_name(str, POLICY_NAME_SIZE, pgpolicy); - - return append_strbuf_quoted(buff, str); + return append_strbuf_quoted(buff, get_pgpolicy_name(pgpolicy)); } declare_def_handler(pgpolicy, set_pgpolicy) diff --git a/libmultipath/pgpolicies.c b/libmultipath/pgpolicies.c index e14da8cc..edc3c611 100644 --- a/libmultipath/pgpolicies.c +++ b/libmultipath/pgpolicies.c @@ -31,34 +31,23 @@ int get_pgpolicy_id(char * str) return IOPOLICY_UNDEF; } -int get_pgpolicy_name(char * buff, int len, int id) +const char *get_pgpolicy_name(int id) { - char * s; - switch (id) { case FAILOVER: - s = "failover"; - break; + return "failover"; case MULTIBUS: - s = "multibus"; - break; + return "multibus"; case GROUP_BY_SERIAL: - s = "group_by_serial"; - break; + return "group_by_serial"; case GROUP_BY_PRIO: - s = "group_by_prio"; - break; + return "group_by_prio"; case GROUP_BY_NODE_NAME: - s = "group_by_node_name"; - break; + return "group_by_node_name"; case GROUP_BY_TPG: - s = "group_by_tpg"; - break; - default: - s = "undefined"; - break; + return "group_by_tpg"; } - return snprintf(buff, len, "%s", s); + return "undefined"; /* IOPOLICY_UNDEF */ } diff --git a/libmultipath/pgpolicies.h b/libmultipath/pgpolicies.h index d3ab2f35..9e4ddda2 100644 --- a/libmultipath/pgpolicies.h +++ b/libmultipath/pgpolicies.h @@ -21,7 +21,7 @@ enum iopolicies { }; int get_pgpolicy_id(char *); -int get_pgpolicy_name (char *, int, int); +const char *get_pgpolicy_name (int); int group_paths(struct multipath *, int); /* * policies diff --git a/libmultipath/propsel.c b/libmultipath/propsel.c index 841fa247..d214281b 100644 --- a/libmultipath/propsel.c +++ b/libmultipath/propsel.c @@ -268,7 +268,6 @@ verify_alua_prio(struct multipath *mp) int select_pgpolicy(struct config *conf, struct multipath * mp) { const char *origin; - char buff[POLICY_NAME_SIZE]; int log_prio = 3; if (conf->pgpolicy_flag > 0) { @@ -288,9 +287,8 @@ out: log_prio = 1; } mp->pgpolicyfn = pgpolicies[mp->pgpolicy]; - get_pgpolicy_name(buff, POLICY_NAME_SIZE, mp->pgpolicy); - condlog(log_prio, "%s: path_grouping_policy = %s %s", mp->alias, buff, - origin); + condlog(log_prio, "%s: path_grouping_policy = %s %s", mp->alias, + get_pgpolicy_name(mp->pgpolicy), origin); return 0; } From patchwork Fri May 19 23:02:10 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Marzinski X-Patchwork-Id: 13248939 X-Patchwork-Delegate: christophe.varoqui@free.fr Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 205CEC7EE2A for ; Fri, 19 May 2023 23:02:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1684537345; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=p/KlWHnlVocXQpRIonQCWRdZci1WgnAXMDWLpCKCPtY=; b=CZiSbOOsitPK6RIa56aAwkIk5OGMnvX5GDlZwvPfZGWx5RzJQXJ5YEDpu+DKmAo9rjgVAc ppb/RAVQiGt+aoRaR9BNDWQCjEo+N2cPLyOBCYZRVAR6A/JqEPW2Hd8FwBHMB72YXuPlOJ se20HrWoqYipmbakH6r2lNuLkKrvyzE= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-312-Ek0nJPKGOWqDHW1EOoTbeg-1; Fri, 19 May 2023 19:02:21 -0400 X-MC-Unique: Ek0nJPKGOWqDHW1EOoTbeg-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id C2F801C04339; Fri, 19 May 2023 23:02:19 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id AD01B2166B25; Fri, 19 May 2023 23:02:19 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 9049E19465B9; Fri, 19 May 2023 23:02:19 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id DC78319465A4 for ; Fri, 19 May 2023 23:02:17 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id C114440D1B63; Fri, 19 May 2023 23:02:17 +0000 (UTC) Received: from octiron.msp.redhat.com (octiron.msp.redhat.com [10.15.80.209]) by smtp.corp.redhat.com (Postfix) with ESMTPS id AC8DC40D1B61; Fri, 19 May 2023 23:02:17 +0000 (UTC) Received: from octiron.msp.redhat.com (localhost.localdomain [127.0.0.1]) by octiron.msp.redhat.com (8.14.9/8.14.9) with ESMTP id 34JN2GEm023085; Fri, 19 May 2023 18:02:16 -0500 Received: (from bmarzins@localhost) by octiron.msp.redhat.com (8.14.9/8.14.9/Submit) id 34JN2FWh023084; Fri, 19 May 2023 18:02:15 -0500 From: Benjamin Marzinski To: Christophe Varoqui Date: Fri, 19 May 2023 18:02:10 -0500 Message-Id: <1684537332-23033-4-git-send-email-bmarzins@redhat.com> In-Reply-To: <1684537332-23033-1-git-send-email-bmarzins@redhat.com> References: <1684537332-23033-1-git-send-email-bmarzins@redhat.com> X-Scanned-By: MIMEDefang 3.1 on 10.11.54.2 Subject: [dm-devel] [PATCH 3/5] libmultipath: add ALUA tpg path wildcard X-BeenThere: dm-devel@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: device-mapper development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: device-mapper development , Martin Wilck MIME-Version: 1.0 Errors-To: dm-devel-bounces@redhat.com Sender: "dm-devel" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Make it possible to easily check a path's target port group. Signed-off-by: Benjamin Marzinski Reviewed-by: Martin Wilck --- libmultipath/print.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/libmultipath/print.c b/libmultipath/print.c index 3193dbe0..360308d2 100644 --- a/libmultipath/print.c +++ b/libmultipath/print.c @@ -782,6 +782,14 @@ snprint_path_vpd_data(struct strbuf *buff, const struct path * pp) return append_strbuf_str(buff, "[undef]"); } +static int +snprint_alua_tpg(struct strbuf *buff, const struct path * pp) +{ + if (pp->tpg_id < 0) + return append_strbuf_str(buff, "[undef]"); + return print_strbuf(buff, "0x%04x", pp->tpg_id); +} + static const struct multipath_data mpd[] = { {'n', "name", snprint_name}, {'w', "uuid", snprint_multipath_uuid}, @@ -836,6 +844,7 @@ static const struct path_data pd[] = { {'P', "protocol", snprint_path_protocol}, {'I', "init_st", snprint_initialized}, {'L', "LUN hex", snprint_path_lunhex}, + {'A', "TPG", snprint_alua_tpg}, }; static const struct pathgroup_data pgd[] = { From patchwork Fri May 19 23:02:11 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Marzinski X-Patchwork-Id: 13248937 X-Patchwork-Delegate: christophe.varoqui@free.fr Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 09453C77B75 for ; Fri, 19 May 2023 23:02:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1684537344; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=MIi81XOFTnGxZlHMJWJpXuSykpmIoHzkNHKXh5HGf4c=; b=d7jEhhLBY9y2gIJKVrBvhetrcwUVRRZokAT26ghji43eU+iCR/3+eGsaD/18xoq4/4T+EH jQ9zaZ0YygcreKGda6B+RLLndf9LoCUzjQiDb5cg6Ys1K6ARmEzx9hW/LbsavVLM+3/Oyk Pp14I5e6Dvy6wCSdL35WZfxIHej/U0w= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-649-C9O9L9dXMvOw1J8xq0Ykwg-1; Fri, 19 May 2023 19:02:22 -0400 X-MC-Unique: C9O9L9dXMvOw1J8xq0Ykwg-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 876D23C01DB4; Fri, 19 May 2023 23:02:20 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 751EB2166B25; Fri, 19 May 2023 23:02:20 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 6A21E19465B9; Fri, 19 May 2023 23:02:20 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id E5D2319465A4 for ; Fri, 19 May 2023 23:02:18 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id C89C32026D6A; Fri, 19 May 2023 23:02:18 +0000 (UTC) Received: from octiron.msp.redhat.com (octiron.msp.redhat.com [10.15.80.209]) by smtp.corp.redhat.com (Postfix) with ESMTPS id A38AC2026D49; Fri, 19 May 2023 23:02:18 +0000 (UTC) Received: from octiron.msp.redhat.com (localhost.localdomain [127.0.0.1]) by octiron.msp.redhat.com (8.14.9/8.14.9) with ESMTP id 34JN2H9S023089; Fri, 19 May 2023 18:02:17 -0500 Received: (from bmarzins@localhost) by octiron.msp.redhat.com (8.14.9/8.14.9/Submit) id 34JN2GZY023088; Fri, 19 May 2023 18:02:16 -0500 From: Benjamin Marzinski To: Christophe Varoqui Date: Fri, 19 May 2023 18:02:11 -0500 Message-Id: <1684537332-23033-5-git-send-email-bmarzins@redhat.com> In-Reply-To: <1684537332-23033-1-git-send-email-bmarzins@redhat.com> References: <1684537332-23033-1-git-send-email-bmarzins@redhat.com> X-Scanned-By: MIMEDefang 3.1 on 10.11.54.4 Subject: [dm-devel] [PATCH 4/5] multipath-tools tests: add tests for group_by_tpg policy X-BeenThere: dm-devel@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: device-mapper development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: device-mapper development , Martin Wilck MIME-Version: 1.0 Errors-To: dm-devel-bounces@redhat.com Sender: "dm-devel" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Signed-off-by: Benjamin Marzinski --- tests/pgpolicy.c | 201 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) diff --git a/tests/pgpolicy.c b/tests/pgpolicy.c index 43be831f..85fa30ce 100644 --- a/tests/pgpolicy.c +++ b/tests/pgpolicy.c @@ -32,6 +32,15 @@ struct multipath mp8, mp4, mp1, mp0, mp_null; struct path p8[8], p4[4], p1[1]; +static void set_tpg(struct path *pp, int *tpg, int size) +{ + int i; + + for (i = 0; i < size; i++) { + pp[i].tpg_id = tpg[i]; + } +} + static void set_priority(struct path *pp, int *prio, int size) { int i; @@ -639,6 +648,187 @@ static void test_group_by_prio_mixed_one_marginal8(void **state) verify_pathgroups(&mp8, p8, groups, group_size, group_marginal, 7); } +static void test_group_by_tpg_same8(void **state) +{ + int paths[] = {0,1,2,3,4,5,6,7}; + int *groups[] = {paths}; + int group_size[] = {8}; + + mp8.pgpolicyfn = group_by_tpg; + assert_int_equal(group_paths(&mp8, 0), 0); + verify_pathgroups(&mp8, p8, groups, group_size, NULL, 1); +} + +static void test_group_by_tpg_different8(void **state) +{ + int prio[] = {1,2,3,4,5,6,7,8}; + int tpg[] = {3,5,4,1,8,6,7,2}; + int paths[] = {7,6,5,4,3,2,1,0}; + int *groups[] = {&paths[0], &paths[1], &paths[2], &paths[3], + &paths[4], &paths[5], &paths[6], &paths[7]}; + int group_size[] = {1,1,1,1,1,1,1,1}; + + set_priority(p8, prio, 8); + set_tpg(p8, tpg, 8); + mp8.pgpolicyfn = group_by_tpg; + assert_int_equal(group_paths(&mp8, 0), 0); + verify_pathgroups(&mp8, p8, groups, group_size, NULL, 8); +} + +static void test_group_by_tpg_mixed8(void **state) +{ + int prio[] = {7,2,3,3,5,2,8,2}; + int tpg[] = {1,2,3,3,4,2,5,6}; + int group0[] = {6}; + int group1[] = {0}; + int group2[] = {4}; + int group3[] = {2,3}; + int group4[] = {1,5}; + int group5[] = {7}; + int *groups[] = {group0, group1, group2, group3, + group4, group5}; + int group_size[] = {1,1,1,2,2,1}; + + set_priority(p8, prio, 8); + set_tpg(p8, tpg, 8); + mp8.pgpolicyfn = group_by_tpg; + assert_int_equal(group_paths(&mp8, 0), 0); + verify_pathgroups(&mp8, p8, groups, group_size, NULL, 6); +} + +static void test_group_by_tpg_3_groups8(void **state) +{ + int prio[] = {1,2,2,1,2,1,1,2}; + int tpg[] = {1,2,2,1,3,1,1,3}; + int group0[] = {1,2}; + int group1[] = {4,7}; + int group2[] = {0,3,5,6}; + int *groups[] = {group0, group1, group2}; + int group_size[] = {2,2,4}; + + set_priority(p8, prio, 8); + set_tpg(p8, tpg, 8); + mp8.pgpolicyfn = group_by_tpg; + assert_int_equal(group_paths(&mp8, 0), 0); + verify_pathgroups(&mp8, p8, groups, group_size, NULL, 3); +} + +static void test_group_by_tpg_2_groups4(void **state) +{ + int prio[] = {2,1,1,2}; + int tpg[] = {1,2,2,1}; + int group0[] = {0,3}; + int group1[] = {1,2}; + int *groups[] = {group0, group1}; + int group_size[] = {2,2}; + + set_priority(p4, prio, 4); + set_tpg(p4, tpg, 4); + mp4.pgpolicyfn = group_by_tpg; + assert_int_equal(group_paths(&mp4, 0), 0); + verify_pathgroups(&mp4, p4, groups, group_size, NULL, 2); +} + +static void test_group_by_tpg1(void **state) +{ + int paths[] = {0}; + int *groups[] = {paths}; + int group_size[] = {1}; + + mp1.pgpolicyfn = group_by_tpg; + assert_int_equal(group_paths(&mp1, 0), 0); + verify_pathgroups(&mp1, p1, groups, group_size, NULL, 1); +} + +static void test_group_by_tpg0(void **state) +{ + mp0.pgpolicyfn = group_by_tpg; + assert_int_equal(group_paths(&mp0, 0), 0); + verify_pathgroups(&mp0, NULL, NULL, NULL, NULL, 0); +} + +static void test_group_by_tpg_null(void **state) +{ + mp_null.pgpolicyfn = group_by_tpg; + assert_int_equal(group_paths(&mp_null, 0), 0); + verify_pathgroups(&mp_null, NULL, NULL, NULL, NULL, 0); +} + +static void test_group_by_tpg_mixed_all_marginal8(void **state) +{ + int prio[] = {7,2,3,3,5,2,8,2}; + int tpg[] = {1,2,3,3,4,2,5,6}; + int marginal[] = {1,1,1,1,1,1,1,1}; + int group0[] = {6}; + int group1[] = {0}; + int group2[] = {4}; + int group3[] = {2,3}; + int group4[] = {1,5}; + int group5[] = {7}; + int *groups[] = {group0, group1, group2, group3, + group4, group5}; + int group_size[] = {1,1,1,2,2,1}; + int group_marginal[] = {1,1,1,1,1,1}; + + set_priority(p8, prio, 8); + set_tpg(p8, tpg, 8); + set_marginal(p8, marginal, 8); + mp8.pgpolicyfn = group_by_tpg; + assert_int_equal(group_paths(&mp8, 1), 0); + verify_pathgroups(&mp8, p8, groups, group_size, group_marginal, 6); +} + +static void test_group_by_tpg_mixed_half_marginal8(void **state) +{ + int prio[] = {7,1,3,3,3,2,8,2}; + int tpg[] = {1,2,3,4,5,6,7,6}; + int marginal[] = {0,0,0,1,0,1,1,1}; + int group0[] = {0}; + int group1[] = {2}; + int group2[] = {4}; + int group3[] = {1}; + int group4[] = {6}; + int group5[] = {3}; + int group6[] = {5,7}; + int *groups[] = {group0, group1, group2, group3, + group4, group5, group6}; + int group_size[] = {1,1,1,1,1,1,2}; + int group_marginal[] = {0,0,0,0,1,1,1}; + + set_priority(p8, prio, 8); + set_tpg(p8, tpg, 8); + set_marginal(p8, marginal, 8); + mp8.pgpolicyfn = group_by_tpg; + assert_int_equal(group_paths(&mp8, 1), 0); + verify_pathgroups(&mp8, p8, groups, group_size, group_marginal, 7); +} + +static void test_group_by_tpg_mixed_one_marginal8(void **state) +{ + int prio[] = {7,1,3,3,5,2,8,2}; + int tpg[] = {1,2,3,3,4,5,6,5}; + int marginal[] = {0,0,0,0,0,1,0,0}; + int group0[] = {6}; + int group1[] = {0}; + int group2[] = {4}; + int group3[] = {2,3}; + int group4[] = {7}; + int group5[] = {1}; + int group6[] = {5}; + int *groups[] = {group0, group1, group2, group3, + group4, group5, group6}; + int group_size[] = {1,1,1,2,1,1,1}; + int group_marginal[] = {0,0,0,0,0,0,1}; + + set_priority(p8, prio, 8); + set_tpg(p8, tpg, 8); + set_marginal(p8, marginal, 8); + mp8.pgpolicyfn = group_by_tpg; + assert_int_equal(group_paths(&mp8, 1), 0); + verify_pathgroups(&mp8, p8, groups, group_size, group_marginal, 7); +} + + static void test_group_by_node_name_same8(void **state) { char *node_name[] = {"a","a","a","a","a","a","a","a"}; @@ -1002,6 +1192,17 @@ int test_pgpolicies(void) setup_test(test_group_by_prio_mixed_all_marginal, 8), setup_test(test_group_by_prio_mixed_half_marginal, 8), setup_test(test_group_by_prio_mixed_one_marginal, 8), + setup_test(test_group_by_tpg_same, 8), + setup_test(test_group_by_tpg_different, 8), + setup_test(test_group_by_tpg_mixed, 8), + setup_test(test_group_by_tpg_3_groups, 8), + setup_test(test_group_by_tpg_2_groups, 4), + setup_test(test_group_by_tpg, 1), + setup_test(test_group_by_tpg, 0), + setup_test(test_group_by_tpg, _null), + setup_test(test_group_by_tpg_mixed_all_marginal, 8), + setup_test(test_group_by_tpg_mixed_half_marginal, 8), + setup_test(test_group_by_tpg_mixed_one_marginal, 8), setup_test(test_group_by_node_name_same, 8), setup_test(test_group_by_node_name_increasing, 8), setup_test(test_group_by_node_name_3_groups, 8), From patchwork Fri May 19 23:02:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Marzinski X-Patchwork-Id: 13248938 X-Patchwork-Delegate: christophe.varoqui@free.fr Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 138FFC7EE23 for ; Fri, 19 May 2023 23:02:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1684537345; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=OEET7OUAP9JIvKwNstwTizv0A/IOQVhftbxt02I69Qc=; b=aper7IbmWPMXNvZWoBkS8oCEnrtQliL84gx2EqmYz7YQYPXia2bIo4r48DF1FmCHMsLD4a brfP5AjoJEijNT7yNO3+jyUGfOFgImMMdDd+6tQW6+dtZhPuV4H+1fAQ12gAeWMrkpkqni dyOZl3MtYjkOBtMUn0RiVlQtTIZwbxw= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-107-ukgCfHjTPJOd_Nk44hOIfA-1; Fri, 19 May 2023 19:02:23 -0400 X-MC-Unique: ukgCfHjTPJOd_Nk44hOIfA-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 1291C280016E; Fri, 19 May 2023 23:02:21 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (unknown [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id F41FB40D1B60; Fri, 19 May 2023 23:02:20 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id BB3F219465B7; Fri, 19 May 2023 23:02:20 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id E001119465B9 for ; Fri, 19 May 2023 23:02:19 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id D3C3E4F2DE4; Fri, 19 May 2023 23:02:19 +0000 (UTC) Received: from octiron.msp.redhat.com (octiron.msp.redhat.com [10.15.80.209]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9D2DC4F2DE3; Fri, 19 May 2023 23:02:19 +0000 (UTC) Received: from octiron.msp.redhat.com (localhost.localdomain [127.0.0.1]) by octiron.msp.redhat.com (8.14.9/8.14.9) with ESMTP id 34JN2Iw1023093; Fri, 19 May 2023 18:02:18 -0500 Received: (from bmarzins@localhost) by octiron.msp.redhat.com (8.14.9/8.14.9/Submit) id 34JN2HBI023092; Fri, 19 May 2023 18:02:17 -0500 From: Benjamin Marzinski To: Christophe Varoqui Date: Fri, 19 May 2023 18:02:12 -0500 Message-Id: <1684537332-23033-6-git-send-email-bmarzins@redhat.com> In-Reply-To: <1684537332-23033-1-git-send-email-bmarzins@redhat.com> References: <1684537332-23033-1-git-send-email-bmarzins@redhat.com> X-Scanned-By: MIMEDefang 3.1 on 10.11.54.9 Subject: [dm-devel] [PATCH 5/5] libmultipath: add "detect_pgpolicy" config option X-BeenThere: dm-devel@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: device-mapper development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: device-mapper development , Martin Wilck MIME-Version: 1.0 Errors-To: dm-devel-bounces@redhat.com Sender: "dm-devel" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.2 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com This allows configuations to use "group_by_tpg" if alua is autodetected and another policy if it isn't, so they can work with detect_prio. Signed-off-by: Benjamin Marzinski --- libmultipath/config.c | 2 ++ libmultipath/config.h | 2 ++ libmultipath/configure.c | 1 + libmultipath/defaults.h | 1 + libmultipath/dict.c | 11 +++++++++++ libmultipath/hwtable.c | 1 + libmultipath/libmultipath.version | 10 +++------- libmultipath/propsel.c | 23 ++++++++++++++++++++++- libmultipath/propsel.h | 1 + libmultipath/structs.h | 7 +++++++ multipath/multipath.conf.5 | 12 ++++++++++++ 11 files changed, 63 insertions(+), 8 deletions(-) diff --git a/libmultipath/config.c b/libmultipath/config.c index 5c5c0726..2e742373 100644 --- a/libmultipath/config.c +++ b/libmultipath/config.c @@ -452,6 +452,7 @@ merge_hwe (struct hwentry * dst, struct hwentry * src) merge_num(retain_hwhandler); merge_num(detect_prio); merge_num(detect_checker); + merge_num(detect_pgpolicy); merge_num(deferred_remove); merge_num(delay_watch_checks); merge_num(delay_wait_checks); @@ -617,6 +618,7 @@ store_hwe (vector hwtable, struct hwentry * dhwe) hwe->retain_hwhandler = dhwe->retain_hwhandler; hwe->detect_prio = dhwe->detect_prio; hwe->detect_checker = dhwe->detect_checker; + hwe->detect_pgpolicy = dhwe->detect_pgpolicy; hwe->ghost_delay = dhwe->ghost_delay; hwe->vpd_vendor_id = dhwe->vpd_vendor_id; diff --git a/libmultipath/config.h b/libmultipath/config.h index 87947469..014c6849 100644 --- a/libmultipath/config.h +++ b/libmultipath/config.h @@ -76,6 +76,7 @@ struct hwentry { int retain_hwhandler; int detect_prio; int detect_checker; + int detect_pgpolicy; int deferred_remove; int delay_watch_checks; int delay_wait_checks; @@ -171,6 +172,7 @@ struct config { int retain_hwhandler; int detect_prio; int detect_checker; + int detect_pgpolicy; int force_sync; int deferred_remove; int processed_main_config; diff --git a/libmultipath/configure.c b/libmultipath/configure.c index 4a1c28bb..366b166f 100644 --- a/libmultipath/configure.c +++ b/libmultipath/configure.c @@ -304,6 +304,7 @@ int setup_map(struct multipath *mpp, char **params, struct vectors *vecs) pthread_cleanup_push(put_multipath_config, conf); select_pgfailback(conf, mpp); + select_detect_pgpolicy(conf, mpp); select_pgpolicy(conf, mpp); /* diff --git a/libmultipath/defaults.h b/libmultipath/defaults.h index a5e9ea0c..090baa5c 100644 --- a/libmultipath/defaults.h +++ b/libmultipath/defaults.h @@ -29,6 +29,7 @@ #define DEFAULT_RETAIN_HWHANDLER RETAIN_HWHANDLER_ON #define DEFAULT_DETECT_PRIO DETECT_PRIO_ON #define DEFAULT_DETECT_CHECKER DETECT_CHECKER_ON +#define DEFAULT_DETECT_PGPOLICY DETECT_PGPOLICY_OFF #define DEFAULT_DEFERRED_REMOVE DEFERRED_REMOVE_OFF #define DEFAULT_DELAY_CHECKS NU_NO #define DEFAULT_ERR_CHECKS NU_NO diff --git a/libmultipath/dict.c b/libmultipath/dict.c index dddd3cd6..edd4923d 100644 --- a/libmultipath/dict.c +++ b/libmultipath/dict.c @@ -868,6 +868,14 @@ declare_ovr_snprint(detect_checker, print_yes_no_undef) declare_hw_handler(detect_checker, set_yes_no_undef) declare_hw_snprint(detect_checker, print_yes_no_undef) +declare_def_handler(detect_pgpolicy, set_yes_no_undef) +declare_def_snprint_defint(detect_pgpolicy, print_yes_no_undef, + DEFAULT_DETECT_PGPOLICY) +declare_ovr_handler(detect_pgpolicy, set_yes_no_undef) +declare_ovr_snprint(detect_pgpolicy, print_yes_no_undef) +declare_hw_handler(detect_pgpolicy, set_yes_no_undef) +declare_hw_snprint(detect_pgpolicy, print_yes_no_undef) + declare_def_handler(force_sync, set_yes_no) declare_def_snprint(force_sync, print_yes_no) @@ -2112,6 +2120,7 @@ init_keywords(vector keywords) install_keyword("retain_attached_hw_handler", &def_retain_hwhandler_handler, &snprint_def_retain_hwhandler); install_keyword("detect_prio", &def_detect_prio_handler, &snprint_def_detect_prio); install_keyword("detect_checker", &def_detect_checker_handler, &snprint_def_detect_checker); + install_keyword("detect_pgpolicy", &def_detect_pgpolicy_handler, &snprint_def_detect_pgpolicy); install_keyword("force_sync", &def_force_sync_handler, &snprint_def_force_sync); install_keyword("strict_timing", &def_strict_timing_handler, &snprint_def_strict_timing); install_keyword("deferred_remove", &def_deferred_remove_handler, &snprint_def_deferred_remove); @@ -2202,6 +2211,7 @@ init_keywords(vector keywords) install_keyword("retain_attached_hw_handler", &hw_retain_hwhandler_handler, &snprint_hw_retain_hwhandler); install_keyword("detect_prio", &hw_detect_prio_handler, &snprint_hw_detect_prio); install_keyword("detect_checker", &hw_detect_checker_handler, &snprint_hw_detect_checker); + install_keyword("detect_pgpolicy", &hw_detect_pgpolicy_handler, &snprint_hw_detect_pgpolicy); install_keyword("deferred_remove", &hw_deferred_remove_handler, &snprint_hw_deferred_remove); install_keyword("delay_watch_checks", &hw_delay_watch_checks_handler, &snprint_hw_delay_watch_checks); install_keyword("delay_wait_checks", &hw_delay_wait_checks_handler, &snprint_hw_delay_wait_checks); @@ -2244,6 +2254,7 @@ init_keywords(vector keywords) install_keyword("retain_attached_hw_handler", &ovr_retain_hwhandler_handler, &snprint_ovr_retain_hwhandler); install_keyword("detect_prio", &ovr_detect_prio_handler, &snprint_ovr_detect_prio); install_keyword("detect_checker", &ovr_detect_checker_handler, &snprint_ovr_detect_checker); + install_keyword("detect_pgpolicy", &ovr_detect_pgpolicy_handler, &snprint_ovr_detect_pgpolicy); install_keyword("deferred_remove", &ovr_deferred_remove_handler, &snprint_ovr_deferred_remove); install_keyword("delay_watch_checks", &ovr_delay_watch_checks_handler, &snprint_ovr_delay_watch_checks); install_keyword("delay_wait_checks", &ovr_delay_wait_checks_handler, &snprint_ovr_delay_wait_checks); diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c index 65bca744..803230c1 100644 --- a/libmultipath/hwtable.c +++ b/libmultipath/hwtable.c @@ -67,6 +67,7 @@ .retain_hwhandler = RETAIN_HWHANDLER_ON, .detect_prio = DETECT_PRIO_ON, .detect_checker = DETECT_CHECKER_ON, + .detect_pgpolicy = DETECT_PGPOLICY_OFF, .deferred_remove = DEFERRED_REMOVE_OFF, .delay_watch_checks = DELAY_CHECKS_OFF, .delay_wait_checks = DELAY_CHECKS_OFF, diff --git a/libmultipath/libmultipath.version b/libmultipath/libmultipath.version index aba1a30e..8f72c452 100644 --- a/libmultipath/libmultipath.version +++ b/libmultipath/libmultipath.version @@ -43,7 +43,7 @@ LIBMPATHCOMMON_1.0.0 { put_multipath_config; }; -LIBMULTIPATH_18.0.0 { +LIBMULTIPATH_19.0.0 { global: /* symbols referenced by multipath and multipathd */ add_foreign; @@ -116,6 +116,7 @@ global: get_refwwid; get_state; get_udev_device; + get_uid; get_used_hwes; get_vpd_sgio; group_by_prio; @@ -141,6 +142,7 @@ global: pathcount; path_discovery; path_get_tpgs; + pathinfo; path_offline; print_all_paths; print_foreign_topology; @@ -235,9 +237,3 @@ global: local: *; }; - -LIBMULTIPATH_18.1.0 { -global: - get_uid; - pathinfo; -} LIBMULTIPATH_18.0.0; diff --git a/libmultipath/propsel.c b/libmultipath/propsel.c index d214281b..12f4825d 100644 --- a/libmultipath/propsel.c +++ b/libmultipath/propsel.c @@ -265,6 +265,21 @@ verify_alua_prio(struct multipath *mp) return true; } +int select_detect_pgpolicy(struct config *conf, struct multipath *mp) +{ + const char *origin; + + mp_set_ovr(detect_pgpolicy); + mp_set_hwe(detect_pgpolicy); + mp_set_conf(detect_pgpolicy); + mp_set_default(detect_pgpolicy, DEFAULT_DETECT_PGPOLICY); +out: + condlog(3, "%s: detect_pgpolicy = %s %s", mp->alias, + (mp->detect_pgpolicy == DETECT_PGPOLICY_ON)? "yes" : "no", + origin); + return 0; +} + int select_pgpolicy(struct config *conf, struct multipath * mp) { const char *origin; @@ -275,13 +290,19 @@ int select_pgpolicy(struct config *conf, struct multipath * mp) origin = cmdline_origin; goto out; } + if (mp->detect_pgpolicy == DETECT_PGPOLICY_ON && verify_alua_prio(mp)) { + mp->pgpolicy = GROUP_BY_TPG; + origin = autodetect_origin; + goto out; + } mp_set_mpe(pgpolicy); mp_set_ovr(pgpolicy); mp_set_hwe(pgpolicy); mp_set_conf(pgpolicy); mp_set_default(pgpolicy, DEFAULT_PGPOLICY); out: - if (mp->pgpolicy == GROUP_BY_TPG && !verify_alua_prio(mp)) { + if (mp->pgpolicy == GROUP_BY_TPG && origin != autodetect_origin && + !verify_alua_prio(mp)) { mp->pgpolicy = DEFAULT_PGPOLICY; origin = "(setting: emergency fallback - not all paths use alua prio)"; log_prio = 1; diff --git a/libmultipath/propsel.h b/libmultipath/propsel.h index 152ca44c..513ee6ac 100644 --- a/libmultipath/propsel.h +++ b/libmultipath/propsel.h @@ -1,5 +1,6 @@ int select_rr_weight (struct config *conf, struct multipath * mp); int select_pgfailback (struct config *conf, struct multipath * mp); +int select_detect_pgpolicy (struct config *conf, struct multipath * mp); int select_pgpolicy (struct config *conf, struct multipath * mp); int select_selector (struct config *conf, struct multipath * mp); int select_alias (struct config *conf, struct multipath * mp); diff --git a/libmultipath/structs.h b/libmultipath/structs.h index 0eea19b4..682a7e17 100644 --- a/libmultipath/structs.h +++ b/libmultipath/structs.h @@ -143,6 +143,12 @@ enum detect_checker_states { DETECT_CHECKER_ON = YNU_YES, }; +enum detect_pgpolicy_states { + DETECT_PGPOLICY_UNDEF = YNU_UNDEF, + DETECT_PGPOLICY_OFF = YNU_NO, + DETECT_PGPOLICY_ON = YNU_YES, +}; + enum deferred_remove_states { DEFERRED_REMOVE_UNDEF = YNU_UNDEF, DEFERRED_REMOVE_OFF = YNU_NO, @@ -389,6 +395,7 @@ enum prflag_value { struct multipath { char wwid[WWID_SIZE]; char alias_old[WWID_SIZE]; + int detect_pgpolicy; int pgpolicy; pgpolicyfn *pgpolicyfn; int nextpg; diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5 index b65a543d..9f8be510 100644 --- a/multipath/multipath.conf.5 +++ b/multipath/multipath.conf.5 @@ -242,6 +242,18 @@ The default is: \fBfailover\fR . . .TP +.B detect_pgpolicy +If set to \fIyes\fR and all path devcices are configured with either the +\fIalua\fR or \fIsysfs\fR prioritizer, the multipath device will automatically +use the \fIgroup_by_tpg\fR path_grouping_policy. If set to \fIno\fR, the +path_grouping_policy will be selected as usual. +.RS +.TP +The default is: \fIno\fR +.RE +. +. +.TP .B pg_timeout (Deprecated) This option is not supported any more, and the value is ignored. .