All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/9] multipath-tools: avoid I/O during uevent processing
@ 2019-03-15 16:11 Martin Wilck
  2019-03-15 16:11 ` [PATCH 1/9] libmultipath: add sysfs_get_inquiry() Martin Wilck
                   ` (8 more replies)
  0 siblings, 9 replies; 14+ messages in thread
From: Martin Wilck @ 2019-03-15 16:11 UTC (permalink / raw)
  To: Christophe Varoqui, Benjamin Marzinski; +Cc: dm-devel, Martin Wilck

Hi Christophe, hi Ben,

the bulk of this series attempts to avoid unnecessary I/O for "multipath -u"
calls from udev rules. I came up with it in a recent attempt to debug
avoid "multipath -u" hangups during boot. I found that the detect_alua()
call in the get_refwwid->pathinfo->scsi_ioctl_pathinfo call sequence would
cause an sg ioctl to be sent for every "multipath -u" invocation. That's
obvious nonsense, we don't need to detect ALUA capabilities to find out
if a device is a potential multipath member.

So, rather than setting pp->tpgs in pathinfo, I resorted to a "lazy"
approach where ALUA capabilities are probed when they are needed, no
sooner. I also cleaned up the ALUA code a bit (still some more to go),
and made it attempt to read INQUIRY data from sysfs (this is fine for
the ALUA prioritizer - it only needs to bypass sysfs for the RTPG calls).

Martin Wilck (9):
  libmultipath: add sysfs_get_inquiry()
  libmultipath: alua: make API more consistent
  libmultipath: alua: try to retrieve inquiry data from sysfs
  libmultipath: constify sysfs_get_timeout()
  libmultipath: detect_alua(): use system timeout
  libmultipath: lazy tpgs probing
  libmultipath: don't link alua_rtpg.o twice
  libmultipath: check_rdac(): pre-check in hwtable
  libmultipath: hwtable: add Lenovo DE series

 libmultipath/discovery.c              | 46 +++++++++++++++++++--------
 libmultipath/discovery.h              | 10 +++---
 libmultipath/hwtable.c                | 20 ++++++++++++
 libmultipath/prioritizers/Makefile    |  3 --
 libmultipath/prioritizers/alua.c      |  4 +--
 libmultipath/prioritizers/alua_rtpg.c | 45 ++++++++++++++++++++------
 libmultipath/prioritizers/alua_rtpg.h |  7 ++--
 libmultipath/propsel.c                | 31 ++++++++++++------
 multipathd/main.c                     |  7 ++--
 9 files changed, 126 insertions(+), 47 deletions(-)

-- 
2.21.0

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH 1/9] libmultipath: add sysfs_get_inquiry()
  2019-03-15 16:11 [PATCH 0/9] multipath-tools: avoid I/O during uevent processing Martin Wilck
@ 2019-03-15 16:11 ` Martin Wilck
  2019-03-15 16:11 ` [PATCH 2/9] libmultipath: alua: make API more consistent Martin Wilck
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 14+ messages in thread
From: Martin Wilck @ 2019-03-15 16:11 UTC (permalink / raw)
  To: Christophe Varoqui, Benjamin Marzinski; +Cc: dm-devel, Martin Wilck

Provide a utility function to retrieve inquiry data from
sysfs, like we do for VPDs.

Signed-off-by: Martin Wilck <mwilck@suse.com>
---
 libmultipath/discovery.c | 23 ++++++++++++++++++-----
 libmultipath/discovery.h |  6 ++++--
 2 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index 10bd8cd6..65d651d4 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -218,12 +218,11 @@ declare_sysfs_get_str(vendor);
 declare_sysfs_get_str(model);
 declare_sysfs_get_str(rev);
 
-ssize_t
-sysfs_get_vpd (struct udev_device * udev, int pg,
-	       unsigned char * buff, size_t len)
+static ssize_t
+sysfs_get_binary (struct udev_device * udev, const char *attrname,
+		  unsigned char *buff, size_t len)
 {
 	ssize_t attr_len;
-	char attrname[9];
 	const char * devname;
 
 	if (!udev) {
@@ -232,7 +231,6 @@ sysfs_get_vpd (struct udev_device * udev, int pg,
 	}
 
 	devname = udev_device_get_sysname(udev);
-	sprintf(attrname, "vpd_pg%02x", pg);
 	attr_len = sysfs_bin_attr_get_value(udev, attrname, buff, len);
 	if (attr_len < 0) {
 		condlog(3, "%s: attribute %s not found in sysfs",
@@ -242,6 +240,21 @@ sysfs_get_vpd (struct udev_device * udev, int pg,
 	return attr_len;
 }
 
+ssize_t sysfs_get_vpd(struct udev_device * udev, unsigned char pg,
+		      unsigned char *buff, size_t len)
+{
+	char attrname[9];
+
+	snprintf(attrname, sizeof(attrname), "vpd_pg%02x", pg);
+	return sysfs_get_binary(udev, attrname, buff, len);
+}
+
+ssize_t sysfs_get_inquiry(struct udev_device * udev,
+			  unsigned char *buff, size_t len)
+{
+	return sysfs_get_binary(udev, "inquiry", buff, len);
+}
+
 int
 sysfs_get_timeout(struct path *pp, unsigned int *timeout)
 {
diff --git a/libmultipath/discovery.h b/libmultipath/discovery.h
index 9aacf75b..7cacbb6c 100644
--- a/libmultipath/discovery.h
+++ b/libmultipath/discovery.h
@@ -48,8 +48,10 @@ int sysfs_get_host_pci_name(const struct path *pp, char *pci_name);
 int sysfs_get_iscsi_ip_address(const struct path *pp, char *ip_address);
 int sysfs_get_host_adapter_name(const struct path *pp,
 				char *adapter_name);
-ssize_t sysfs_get_vpd (struct udev_device * udev, int pg, unsigned char * buff,
-		       size_t len);
+ssize_t sysfs_get_vpd (struct udev_device *udev, unsigned char pg,
+		       unsigned char *buff, size_t len);
+ssize_t sysfs_get_inquiry(struct udev_device *udev,
+			  unsigned char *buff, size_t len);
 int sysfs_get_asymmetric_access_state(struct path *pp,
 				      char *buff, int buflen);
 int get_uid(struct path * pp, int path_state, struct udev_device *udev);
-- 
2.21.0

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 2/9] libmultipath: alua: make API more consistent
  2019-03-15 16:11 [PATCH 0/9] multipath-tools: avoid I/O during uevent processing Martin Wilck
  2019-03-15 16:11 ` [PATCH 1/9] libmultipath: add sysfs_get_inquiry() Martin Wilck
@ 2019-03-15 16:11 ` Martin Wilck
  2019-03-15 16:11 ` [PATCH 3/9] libmultipath: alua: try to retrieve inquiry data from sysfs Martin Wilck
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 14+ messages in thread
From: Martin Wilck @ 2019-03-15 16:11 UTC (permalink / raw)
  To: Christophe Varoqui, Benjamin Marzinski; +Cc: dm-devel, Martin Wilck

Let all alua functions take "const struct path *" as first
argument.

Signed-off-by: Martin Wilck <mwilck@suse.com>
---
 libmultipath/discovery.c              |  4 ++--
 libmultipath/prioritizers/alua.c      |  4 ++--
 libmultipath/prioritizers/alua_rtpg.c | 28 +++++++++++++++++----------
 libmultipath/prioritizers/alua_rtpg.h |  7 ++++---
 libmultipath/propsel.c                |  2 +-
 5 files changed, 27 insertions(+), 18 deletions(-)

diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index 65d651d4..6b4a420b 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -839,12 +839,12 @@ detect_alua(struct path * pp, struct config *conf)
 	int tpgs;
 	unsigned int timeout = conf->checker_timeout;
 
-	if ((tpgs = get_target_port_group_support(pp->fd, timeout)) <= 0) {
+	if ((tpgs = get_target_port_group_support(pp, timeout)) <= 0) {
 		pp->tpgs = TPGS_NONE;
 		return;
 	}
 	ret = get_target_port_group(pp, timeout);
-	if (ret < 0 || get_asymmetric_access_state(pp->fd, ret, timeout) < 0) {
+	if (ret < 0 || get_asymmetric_access_state(pp, ret, timeout) < 0) {
 		pp->tpgs = TPGS_NONE;
 		return;
 	}
diff --git a/libmultipath/prioritizers/alua.c b/libmultipath/prioritizers/alua.c
index b24e2d48..0ab06e2b 100644
--- a/libmultipath/prioritizers/alua.c
+++ b/libmultipath/prioritizers/alua.c
@@ -58,7 +58,7 @@ get_alua_info(struct path * pp, unsigned int timeout)
 
 	tpg = get_target_port_group(pp, timeout);
 	if (tpg < 0) {
-		rc = get_target_port_group_support(pp->fd, timeout);
+		rc = get_target_port_group_support(pp, timeout);
 		if (rc < 0)
 			return -ALUA_PRIO_TPGS_FAILED;
 		if (rc == TPGS_NONE)
@@ -66,7 +66,7 @@ get_alua_info(struct path * pp, unsigned int timeout)
 		return -ALUA_PRIO_RTPG_FAILED;
 	}
 	condlog(3, "%s: reported target port group is %i", pp->dev, tpg);
-	rc = get_asymmetric_access_state(pp->fd, tpg, timeout);
+	rc = get_asymmetric_access_state(pp, tpg, timeout);
 	if (rc < 0) {
 		condlog(2, "%s: get_asymmetric_access_state returned %d",
 			__func__, rc);
diff --git a/libmultipath/prioritizers/alua_rtpg.c b/libmultipath/prioritizers/alua_rtpg.c
index 811ce7a2..d9215a88 100644
--- a/libmultipath/prioritizers/alua_rtpg.c
+++ b/libmultipath/prioritizers/alua_rtpg.c
@@ -135,9 +135,9 @@ scsi_error(struct sg_io_hdr *hdr, int opcode)
 /*
  * Helper function to setup and run a SCSI inquiry command.
  */
-int
-do_inquiry(int fd, int evpd, unsigned int codepage,
-	   void *resp, int resplen, unsigned int timeout)
+static int
+do_inquiry_sg(int fd, int evpd, unsigned int codepage,
+	      void *resp, int resplen, unsigned int timeout)
 {
 	struct inquiry_command	cmd;
 	struct sg_io_hdr	hdr;
@@ -185,18 +185,24 @@ retry:
 	return 0;
 }
 
+int do_inquiry(const struct path *pp, int evpd, unsigned int codepage,
+	       void *resp, int resplen, unsigned int timeout)
+{
+	return do_inquiry_sg(pp->fd, evpd, codepage, resp, resplen, timeout);
+}
+
 /*
  * This function returns the support for target port groups by evaluating the
  * data returned by the standard inquiry command.
  */
 int
-get_target_port_group_support(int fd, unsigned int timeout)
+get_target_port_group_support(const struct path *pp, unsigned int timeout)
 {
 	struct inquiry_data	inq;
 	int			rc;
 
 	memset((unsigned char *)&inq, 0, sizeof(inq));
-	rc = do_inquiry(fd, 0, 0x00, &inq, sizeof(inq), timeout);
+	rc = do_inquiry(pp, 0, 0x00, &inq, sizeof(inq), timeout);
 	if (!rc) {
 		rc = inquiry_data_get_tpgs(&inq);
 	}
@@ -205,7 +211,7 @@ get_target_port_group_support(int fd, unsigned int timeout)
 }
 
 static int
-get_sysfs_pg83(struct path *pp, unsigned char *buff, int buflen)
+get_sysfs_pg83(const struct path *pp, unsigned char *buff, int buflen)
 {
 	struct udev_device *parent = pp->udev;
 
@@ -224,7 +230,7 @@ get_sysfs_pg83(struct path *pp, unsigned char *buff, int buflen)
 }
 
 int
-get_target_port_group(struct path * pp, unsigned int timeout)
+get_target_port_group(const struct path * pp, unsigned int timeout)
 {
 	unsigned char		*buf;
 	struct vpd83_data *	vpd83;
@@ -245,7 +251,7 @@ get_target_port_group(struct path * pp, unsigned int timeout)
 	rc = get_sysfs_pg83(pp, buf, buflen);
 
 	if (rc < 0) {
-		rc = do_inquiry(pp->fd, 1, 0x83, buf, buflen, timeout);
+		rc = do_inquiry(pp, 1, 0x83, buf, buflen, timeout);
 		if (rc < 0)
 			goto out;
 
@@ -263,7 +269,7 @@ get_target_port_group(struct path * pp, unsigned int timeout)
 			}
 			buflen = scsi_buflen;
 			memset(buf, 0, buflen);
-			rc = do_inquiry(pp->fd, 1, 0x83, buf, buflen, timeout);
+			rc = do_inquiry(pp, 1, 0x83, buf, buflen, timeout);
 			if (rc < 0)
 				goto out;
 		}
@@ -341,7 +347,8 @@ retry:
 }
 
 int
-get_asymmetric_access_state(int fd, unsigned int tpg, unsigned int timeout)
+get_asymmetric_access_state(const struct path *pp, unsigned int tpg,
+			    unsigned int timeout)
 {
 	unsigned char		*buf;
 	struct rtpg_data *	tpgd;
@@ -349,6 +356,7 @@ get_asymmetric_access_state(int fd, unsigned int tpg, unsigned int timeout)
 	int			rc;
 	int			buflen;
 	uint64_t		scsi_buflen;
+	int fd = pp->fd;
 
 	buflen = 4096;
 	buf = (unsigned char *)malloc(buflen);
diff --git a/libmultipath/prioritizers/alua_rtpg.h b/libmultipath/prioritizers/alua_rtpg.h
index 35cffaf3..675709ff 100644
--- a/libmultipath/prioritizers/alua_rtpg.h
+++ b/libmultipath/prioritizers/alua_rtpg.h
@@ -22,8 +22,9 @@
 #define RTPG_RTPG_FAILED			3
 #define RTPG_TPG_NOT_FOUND			4
 
-int get_target_port_group_support(int fd, unsigned int timeout);
-int get_target_port_group(struct path * pp, unsigned int timeout);
-int get_asymmetric_access_state(int fd, unsigned int tpg, unsigned int timeout);
+int get_target_port_group_support(const struct path *pp, unsigned int timeout);
+int get_target_port_group(const struct path *pp, unsigned int timeout);
+int get_asymmetric_access_state(const struct path *pp,
+				unsigned int tpg, unsigned int timeout);
 
 #endif /* __RTPG_H__ */
diff --git a/libmultipath/propsel.c b/libmultipath/propsel.c
index 98068f34..624dc6ef 100644
--- a/libmultipath/propsel.c
+++ b/libmultipath/propsel.c
@@ -632,7 +632,7 @@ out:
 		unsigned int timeout = conf->checker_timeout;
 
 		if(!pp->tpgs &&
-		   (tpgs = get_target_port_group_support(pp->fd, timeout)) >= 0)
+		   (tpgs = get_target_port_group_support(pp, timeout)) >= 0)
 			pp->tpgs = tpgs;
 	}
 	condlog(3, "%s: prio = %s %s", pp->dev, prio_name(p), origin);
-- 
2.21.0

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 3/9] libmultipath: alua: try to retrieve inquiry data from sysfs
  2019-03-15 16:11 [PATCH 0/9] multipath-tools: avoid I/O during uevent processing Martin Wilck
  2019-03-15 16:11 ` [PATCH 1/9] libmultipath: add sysfs_get_inquiry() Martin Wilck
  2019-03-15 16:11 ` [PATCH 2/9] libmultipath: alua: make API more consistent Martin Wilck
@ 2019-03-15 16:11 ` Martin Wilck
  2019-03-15 16:11 ` [PATCH 4/9] libmultipath: constify sysfs_get_timeout() Martin Wilck
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 14+ messages in thread
From: Martin Wilck @ 2019-03-15 16:11 UTC (permalink / raw)
  To: Christophe Varoqui, Benjamin Marzinski
  Cc: NetApp RDAC team, dm-devel, Martin Wilck, Steve.Schremmer,
	Hannes Reinecke

This can avoid IO while configuring the path prioritizer.
The alua prioritizer avoids reading from sysfs for a reason
(see commit 7e2f46d3), but this applies only to RTPG / STPG,
not to INQUIRY calls.

Cc: Steve.Schremmer@netapp.com
Cc: NetApp RDAC team <ng-eseries-upstream-maintainers@netapp.com>
Cc: Hannes Reinecke <hare@suse.com>
Signed-off-by: Martin Wilck <mwilck@suse.com>
---
 libmultipath/prioritizers/alua_rtpg.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/libmultipath/prioritizers/alua_rtpg.c b/libmultipath/prioritizers/alua_rtpg.c
index d9215a88..271a019d 100644
--- a/libmultipath/prioritizers/alua_rtpg.c
+++ b/libmultipath/prioritizers/alua_rtpg.c
@@ -188,6 +188,23 @@ retry:
 int do_inquiry(const struct path *pp, int evpd, unsigned int codepage,
 	       void *resp, int resplen, unsigned int timeout)
 {
+	struct udev_device *ud;
+
+	ud = udev_device_get_parent_with_subsystem_devtype(pp->udev, "scsi",
+							   "scsi_device");
+	if (ud != NULL) {
+		int rc;
+
+		if (!evpd)
+			rc = sysfs_get_inquiry(ud, resp, resplen);
+		else
+			rc = sysfs_get_vpd(ud, codepage, resp, resplen);
+
+		if (rc >= 0) {
+			PRINT_HEX((unsigned char *) resp, resplen);
+			return 0;
+		}
+	}
 	return do_inquiry_sg(pp->fd, evpd, codepage, resp, resplen, timeout);
 }
 
-- 
2.21.0

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 4/9] libmultipath: constify sysfs_get_timeout()
  2019-03-15 16:11 [PATCH 0/9] multipath-tools: avoid I/O during uevent processing Martin Wilck
                   ` (2 preceding siblings ...)
  2019-03-15 16:11 ` [PATCH 3/9] libmultipath: alua: try to retrieve inquiry data from sysfs Martin Wilck
@ 2019-03-15 16:11 ` Martin Wilck
  2019-03-15 16:11 ` [PATCH 5/9] libmultipath: detect_alua(): use system timeout Martin Wilck
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 14+ messages in thread
From: Martin Wilck @ 2019-03-15 16:11 UTC (permalink / raw)
  To: Christophe Varoqui, Benjamin Marzinski; +Cc: dm-devel, Martin Wilck

Signed-off-by: Martin Wilck <mwilck@suse.com>
---
 libmultipath/discovery.c | 2 +-
 libmultipath/discovery.h | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index 6b4a420b..270dedc9 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -256,7 +256,7 @@ ssize_t sysfs_get_inquiry(struct udev_device * udev,
 }
 
 int
-sysfs_get_timeout(struct path *pp, unsigned int *timeout)
+sysfs_get_timeout(const struct path *pp, unsigned int *timeout)
 {
 	const char *attr = NULL;
 	const char *subsys;
diff --git a/libmultipath/discovery.h b/libmultipath/discovery.h
index 7cacbb6c..a9a28add 100644
--- a/libmultipath/discovery.h
+++ b/libmultipath/discovery.h
@@ -43,7 +43,7 @@ int store_pathinfo (vector pathvec, struct config *conf,
 		    struct udev_device *udevice, int flag,
 		    struct path **pp_ptr);
 int sysfs_set_scsi_tmo (struct multipath *mpp, int checkint);
-int sysfs_get_timeout(struct path *pp, unsigned int *timeout);
+int sysfs_get_timeout(const struct path *pp, unsigned int *timeout);
 int sysfs_get_host_pci_name(const struct path *pp, char *pci_name);
 int sysfs_get_iscsi_ip_address(const struct path *pp, char *ip_address);
 int sysfs_get_host_adapter_name(const struct path *pp,
-- 
2.21.0

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 5/9] libmultipath: detect_alua(): use system timeout
  2019-03-15 16:11 [PATCH 0/9] multipath-tools: avoid I/O during uevent processing Martin Wilck
                   ` (3 preceding siblings ...)
  2019-03-15 16:11 ` [PATCH 4/9] libmultipath: constify sysfs_get_timeout() Martin Wilck
@ 2019-03-15 16:11 ` Martin Wilck
  2019-03-15 16:11 ` [PATCH 6/9] libmultipath: lazy tpgs probing Martin Wilck
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 14+ messages in thread
From: Martin Wilck @ 2019-03-15 16:11 UTC (permalink / raw)
  To: Christophe Varoqui, Benjamin Marzinski; +Cc: dm-devel, Martin Wilck

This is not the path checker - we don't need to use the
configured checker timeout here. This makes it possible to
call this function without a current (struct config *).

Signed-off-by: Martin Wilck <mwilck@suse.com>
---
 libmultipath/discovery.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index 270dedc9..b2a43e86 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -833,11 +833,14 @@ get_serial (char * str, int maxlen, int fd)
 }
 
 static void
-detect_alua(struct path * pp, struct config *conf)
+detect_alua(struct path * pp)
 {
 	int ret;
 	int tpgs;
-	unsigned int timeout = conf->checker_timeout;
+	unsigned int timeout;
+
+	if (sysfs_get_timeout(pp, &timeout) <= 0)
+		timeout = DEF_TIMEOUT;
 
 	if ((tpgs = get_target_port_group_support(pp, timeout)) <= 0) {
 		pp->tpgs = TPGS_NONE;
@@ -1519,7 +1522,7 @@ scsi_ioctl_pathinfo (struct path * pp, struct config *conf, int mask)
 	const char *attr_path = NULL;
 
 	if (pp->tpgs == TPGS_UNDEF)
-		detect_alua(pp, conf);
+		detect_alua(pp);
 
 	if (!(mask & DI_SERIAL))
 		return;
-- 
2.21.0

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 6/9] libmultipath: lazy tpgs probing
  2019-03-15 16:11 [PATCH 0/9] multipath-tools: avoid I/O during uevent processing Martin Wilck
                   ` (4 preceding siblings ...)
  2019-03-15 16:11 ` [PATCH 5/9] libmultipath: detect_alua(): use system timeout Martin Wilck
@ 2019-03-15 16:11 ` Martin Wilck
  2019-03-15 16:11 ` [PATCH 7/9] libmultipath: don't link alua_rtpg.o twice Martin Wilck
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 14+ messages in thread
From: Martin Wilck @ 2019-03-15 16:11 UTC (permalink / raw)
  To: Christophe Varoqui, Benjamin Marzinski; +Cc: dm-devel, Martin Wilck

Provide a "getter" function that can be used to probe tpgs lazily.
This way we don't need to send an RTPG in the pathinfo() call
chain (e.g. in "multipath -u").

Moreover, in select_prio(), in the case where the alua checker
was statically configured, rather then calling into the alua
code directly, use get_tpgs(), which does all the proper error
checking, and fall back to const if it fails.

Signed-off-by: Martin Wilck <mwilck@suse.com>
---
 libmultipath/discovery.c | 10 +++++++---
 libmultipath/discovery.h |  2 +-
 libmultipath/propsel.c   | 23 ++++++++++++++---------
 multipathd/main.c        |  7 ++++---
 4 files changed, 26 insertions(+), 16 deletions(-)

diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index b2a43e86..b51a37b2 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -854,6 +854,13 @@ detect_alua(struct path * pp)
 	pp->tpgs = tpgs;
 }
 
+int path_get_tpgs(struct path *pp)
+{
+	if (pp->tpgs == TPGS_UNDEF)
+		detect_alua(pp);
+	return pp->tpgs;
+}
+
 #define DEFAULT_SGIO_LEN 254
 
 /* Query VPD page @pg. Returns number of INQUIRY bytes
@@ -1521,9 +1528,6 @@ scsi_ioctl_pathinfo (struct path * pp, struct config *conf, int mask)
 	struct udev_device *parent;
 	const char *attr_path = NULL;
 
-	if (pp->tpgs == TPGS_UNDEF)
-		detect_alua(pp);
-
 	if (!(mask & DI_SERIAL))
 		return;
 
diff --git a/libmultipath/discovery.h b/libmultipath/discovery.h
index a9a28add..01789339 100644
--- a/libmultipath/discovery.h
+++ b/libmultipath/discovery.h
@@ -31,7 +31,7 @@
 struct config;
 
 int path_discovery (vector pathvec, int flag);
-
+int path_get_tpgs(struct path *pp); /* This function never returns TPGS_UNDEF */
 int do_tur (char *);
 int path_offline (struct path *);
 int get_state (struct path * pp, struct config * conf, int daemon, int state);
diff --git a/libmultipath/propsel.c b/libmultipath/propsel.c
index 624dc6ef..d5fbd94e 100644
--- a/libmultipath/propsel.c
+++ b/libmultipath/propsel.c
@@ -490,7 +490,7 @@ int select_checker(struct config *conf, struct path *pp)
 		if (check_rdac(pp)) {
 			ckr_name = RDAC;
 			goto out;
-		} else if (pp->tpgs > 0) {
+		} else if (path_get_tpgs(pp) != TPGS_NONE) {
 			ckr_name = TUR;
 			goto out;
 		}
@@ -552,6 +552,7 @@ detect_prio(struct config *conf, struct path * pp)
 	struct prio *p = &pp->prio;
 	char buff[512];
 	char *default_prio;
+	int tpgs;
 
 	switch(pp->bus) {
 	case SYSFS_BUS_NVME:
@@ -560,9 +561,10 @@ detect_prio(struct config *conf, struct path * pp)
 		default_prio = PRIO_ANA;
 		break;
 	case SYSFS_BUS_SCSI:
-		if (pp->tpgs <= 0)
+		tpgs = path_get_tpgs(pp);
+		if (tpgs == TPGS_NONE)
 			return;
-		if ((pp->tpgs == 2 || !check_rdac(pp)) &&
+		if ((tpgs == TPGS_EXPLICIT || !check_rdac(pp)) &&
 		    sysfs_get_asymmetric_access_state(pp, buff, 512) >= 0)
 			default_prio = PRIO_SYSFS;
 		else
@@ -607,6 +609,7 @@ int select_prio(struct config *conf, struct path *pp)
 	const char *origin;
 	struct mpentry * mpe;
 	struct prio * p = &pp->prio;
+	int log_prio = 3;
 
 	if (pp->detect_prio == DETECT_PRIO_ON) {
 		detect_prio(conf, pp);
@@ -628,14 +631,16 @@ out:
 	 * fetch tpgs mode for alua, if its not already obtained
 	 */
 	if (!strncmp(prio_name(p), PRIO_ALUA, PRIO_NAME_LEN)) {
-		int tpgs = 0;
-		unsigned int timeout = conf->checker_timeout;
+		int tpgs = path_get_tpgs(pp);
 
-		if(!pp->tpgs &&
-		   (tpgs = get_target_port_group_support(pp, timeout)) >= 0)
-			pp->tpgs = tpgs;
+		if (tpgs == TPGS_NONE) {
+			prio_get(conf->multipath_dir,
+				 p, DEFAULT_PRIO, DEFAULT_PRIO_ARGS);
+			origin = "(setting: emergency fallback - alua failed)";
+			log_prio = 1;
+		}
 	}
-	condlog(3, "%s: prio = %s %s", pp->dev, prio_name(p), origin);
+	condlog(log_prio, "%s: prio = %s %s", pp->dev, prio_name(p), origin);
 	condlog(3, "%s: prio args = \"%s\" %s", pp->dev, prio_args(p), origin);
 	return 0;
 }
diff --git a/multipathd/main.c b/multipathd/main.c
index fb520b64..269a96ec 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -936,7 +936,8 @@ ev_add_path (struct path * pp, struct vectors * vecs, int need_do_map)
 	}
 	if (mpp && mpp->wait_for_udev &&
 	    (pathcount(mpp, PATH_UP) > 0 ||
-	     (pathcount(mpp, PATH_GHOST) > 0 && pp->tpgs != TPGS_IMPLICIT &&
+	     (pathcount(mpp, PATH_GHOST) > 0 &&
+	      path_get_tpgs(pp) != TPGS_IMPLICIT &&
 	      mpp->ghost_delay_tick <= 0))) {
 		/* if wait_for_udev is set and valid paths exist */
 		condlog(3, "%s: delaying path addition until %s is fully initialized",
@@ -2106,8 +2107,8 @@ check_path (struct vectors * vecs, struct path * pp, int ticks)
 	 * paths if there are no other active paths in map.
 	 */
 	disable_reinstate = (newstate == PATH_GHOST &&
-			    pp->mpp->nr_active == 0 &&
-			    pp->tpgs == TPGS_IMPLICIT) ? 1 : 0;
+			     pp->mpp->nr_active == 0 &&
+			     path_get_tpgs(pp) == TPGS_IMPLICIT) ? 1 : 0;
 
 	pp->chkrstate = newstate;
 	if (newstate != pp->state) {
-- 
2.21.0

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 7/9] libmultipath: don't link alua_rtpg.o twice
  2019-03-15 16:11 [PATCH 0/9] multipath-tools: avoid I/O during uevent processing Martin Wilck
                   ` (5 preceding siblings ...)
  2019-03-15 16:11 ` [PATCH 6/9] libmultipath: lazy tpgs probing Martin Wilck
@ 2019-03-15 16:11 ` Martin Wilck
  2019-03-15 16:11 ` [PATCH 8/9] libmultipath: check_rdac(): pre-check in hwtable Martin Wilck
  2019-03-15 16:11 ` [PATCH 9/9] libmultipath: hwtable: add Lenovo DE series Martin Wilck
  8 siblings, 0 replies; 14+ messages in thread
From: Martin Wilck @ 2019-03-15 16:11 UTC (permalink / raw)
  To: Christophe Varoqui, Benjamin Marzinski; +Cc: dm-devel, Martin Wilck

We link this already to libmultipath.so. Therefore, no need
to link ti to libprioalua.so, too.

Signed-off-by: Martin Wilck <mwilck@suse.com>
---
 libmultipath/prioritizers/Makefile | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/libmultipath/prioritizers/Makefile b/libmultipath/prioritizers/Makefile
index 4d80c20c..9d0fe03c 100644
--- a/libmultipath/prioritizers/Makefile
+++ b/libmultipath/prioritizers/Makefile
@@ -28,9 +28,6 @@ endif
 
 all: $(LIBS)
 
-libprioalua.so: alua.o alua_rtpg.o
-	$(CC) $(LDFLAGS) $(SHARED_FLAGS) -o $@ $^
-
 libpriopath_latency.so: path_latency.o  ../checkers/libsg.o
 	$(CC) $(LDFLAGS) $(SHARED_FLAGS) -o $@ $^ -lm
 
-- 
2.21.0

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 8/9] libmultipath: check_rdac(): pre-check in hwtable
  2019-03-15 16:11 [PATCH 0/9] multipath-tools: avoid I/O during uevent processing Martin Wilck
                   ` (6 preceding siblings ...)
  2019-03-15 16:11 ` [PATCH 7/9] libmultipath: don't link alua_rtpg.o twice Martin Wilck
@ 2019-03-15 16:11 ` Martin Wilck
  2019-03-15 16:11 ` [PATCH 9/9] libmultipath: hwtable: add Lenovo DE series Martin Wilck
  8 siblings, 0 replies; 14+ messages in thread
From: Martin Wilck @ 2019-03-15 16:11 UTC (permalink / raw)
  To: Christophe Varoqui, Benjamin Marzinski
  Cc: NetApp RDAC team, dm-devel, Martin Wilck, Steve.Schremmer,
	Hannes Reinecke

Currently check_rdac() always runs an SG_IO for VPD 0xc9 to check
if the storage supports RDAC. This is an extra IO, and may cause
annoying error messages on the storage side for non-RDAC arrays.
Do the RDAC override only for arrays that have legacy configuration
to use the rdac checker.

Cc: Steve.Schremmer@netapp.com
Cc: NetApp RDAC team <ng-eseries-upstream-maintainers@netapp.com>
Cc: Hannes Reinecke <hare@suse.com>
Signed-off-by: Martin Wilck <mwilck@suse.com>
---
 libmultipath/propsel.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/libmultipath/propsel.c b/libmultipath/propsel.c
index d5fbd94e..2eb6fc2a 100644
--- a/libmultipath/propsel.c
+++ b/libmultipath/propsel.c
@@ -470,9 +470,17 @@ check_rdac(struct path * pp)
 {
 	int len;
 	char buff[44];
+	const char *checker_name = NULL;
+	/* dummy, for do_set_from_hwe */
+	const char *origin __attribute__((unused));
 
 	if (pp->bus != SYSFS_BUS_SCSI)
 		return 0;
+	/* Avoid ioctl if this is likely not an RDAC array */
+	do_set_from_hwe(checker_name, pp, checker_name, NULL);
+out:    /* for do_set_from_hwe */
+	if (!checker_name || strcmp(checker_name, RDAC))
+		return 0;
 	len = get_vpd_sgio(pp->fd, 0xC9, buff, 44);
 	if (len <= 0)
 		return 0;
-- 
2.21.0

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH 9/9] libmultipath: hwtable: add Lenovo DE series
  2019-03-15 16:11 [PATCH 0/9] multipath-tools: avoid I/O during uevent processing Martin Wilck
                   ` (7 preceding siblings ...)
  2019-03-15 16:11 ` [PATCH 8/9] libmultipath: check_rdac(): pre-check in hwtable Martin Wilck
@ 2019-03-15 16:11 ` Martin Wilck
  2019-03-15 16:21   ` Xose Vazquez Perez
  2019-03-15 16:33   ` Schremmer, Steven
  8 siblings, 2 replies; 14+ messages in thread
From: Martin Wilck @ 2019-03-15 16:11 UTC (permalink / raw)
  To: Christophe Varoqui, Benjamin Marzinski
  Cc: NetApp RDAC team, dm-devel, xose.vazquez, Martin Wilck, Steve.Schremmer

I got this from Steven.

Cc: Steve.Schremmer@netapp.com
Cc: NetApp RDAC team <ng-eseries-upstream-maintainers@netapp.com>
Cc: xose.vazquez@gmail.com
Signed-off-by: Martin Wilck <mwilck@suse.com>
---
 libmultipath/hwtable.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c
index d3a8d9ba..fd9afc75 100644
--- a/libmultipath/hwtable.c
+++ b/libmultipath/hwtable.c
@@ -701,6 +701,26 @@ static struct hwentry default_hw[] = {
 		.no_path_retry = (300 / DEFAULT_CHECKINT),
 		.prio_name     = PRIO_ALUA,
 	},
+        /*
+         * Lenovo
+         */
+        {
+                /*
+		 * DE Series
+		 *
+		 * Maintainer: Steve Schremmer <Steve.Schremmer@netapp.com>
+		 */
+                .vendor        = "LENOVO",
+                .product       = "DE_Series",
+                .bl_product    = "Universal Xport",
+                .pgpolicy      = GROUP_BY_PRIO,
+                .checker_name  = RDAC,
+                .features      = "2 pg_init_retries 50",
+                .hwhandler     = "1 rdac",
+                .prio_name     = PRIO_RDAC,
+                .pgfailback    = -FAILBACK_IMMEDIATE,
+                .no_path_retry = 30,
+        },
 	/*
 	 * NetApp
 	 */
-- 
2.21.0

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH 9/9] libmultipath: hwtable: add Lenovo DE series
  2019-03-15 16:11 ` [PATCH 9/9] libmultipath: hwtable: add Lenovo DE series Martin Wilck
@ 2019-03-15 16:21   ` Xose Vazquez Perez
  2019-03-15 16:33   ` Schremmer, Steven
  1 sibling, 0 replies; 14+ messages in thread
From: Xose Vazquez Perez @ 2019-03-15 16:21 UTC (permalink / raw)
  To: Martin Wilck, Christophe Varoqui, Benjamin Marzinski
  Cc: NetApp RDAC team, dm-devel, Steve.Schremmer

On 3/15/19 5:11 PM, Martin Wilck wrote:

> I got this from Steven.
> 
> Cc: Steve.Schremmer@netapp.com
> Cc: NetApp RDAC team <ng-eseries-upstream-maintainers@netapp.com>
> Cc: xose.vazquez@gmail.com
> Signed-off-by: Martin Wilck <mwilck@suse.com>
> ---
>  libmultipath/hwtable.c | 20 ++++++++++++++++++++
>  1 file changed, 20 insertions(+)

Do not forget the kernel side:
drivers/scsi/{scsi_devinfo.c,scsi_dh.c}
> diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c
> index d3a8d9ba..fd9afc75 100644
> --- a/libmultipath/hwtable.c
> +++ b/libmultipath/hwtable.c
> @@ -701,6 +701,26 @@ static struct hwentry default_hw[] = {
>  		.no_path_retry = (300 / DEFAULT_CHECKINT),
>  		.prio_name     = PRIO_ALUA,
>  	},
> +        /*
> +         * Lenovo
> +         */
> +        {
> +                /*
> +		 * DE Series
> +		 *
> +		 * Maintainer: Steve Schremmer <Steve.Schremmer@netapp.com>
> +		 */
> +                .vendor        = "LENOVO",
> +                .product       = "DE_Series",
> +                .bl_product    = "Universal Xport",
> +                .pgpolicy      = GROUP_BY_PRIO,
> +                .checker_name  = RDAC,
> +                .features      = "2 pg_init_retries 50",
> +                .hwhandler     = "1 rdac",
> +                .prio_name     = PRIO_RDAC,
> +                .pgfailback    = -FAILBACK_IMMEDIATE,
> +                .no_path_retry = 30,
> +        },
>  	/*
>  	 * NetApp
>  	 */
> 

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 9/9] libmultipath: hwtable: add Lenovo DE series
  2019-03-15 16:11 ` [PATCH 9/9] libmultipath: hwtable: add Lenovo DE series Martin Wilck
  2019-03-15 16:21   ` Xose Vazquez Perez
@ 2019-03-15 16:33   ` Schremmer, Steven
  2019-03-15 16:59     ` Martin Wilck
  1 sibling, 1 reply; 14+ messages in thread
From: Schremmer, Steven @ 2019-03-15 16:33 UTC (permalink / raw)
  To: Martin Wilck, Christophe Varoqui, Benjamin Marzinski
  Cc: ng-eseries-upstream-maintainers, dm-devel, xose.vazquez

> +        /*
> +         * Lenovo
> +         */
> +        {
> +                /*
> +                * DE Series
> +                *
> +                * Maintainer: Steve Schremmer <Steve.Schremmer@netapp.com>
> +                */
> +                .vendor        = "LENOVO",
> +                .product       = "DE_Series",
> +                .bl_product    = "Universal Xport",
> +                .pgpolicy      = GROUP_BY_PRIO,
> +                .checker_name  = RDAC,
> +                .features      = "2 pg_init_retries 50",
> +                .hwhandler     = "1 rdac",
> +                .prio_name     = PRIO_RDAC,
> +                .pgfailback    = -FAILBACK_IMMEDIATE,
> +                .no_path_retry = 30,
> +        },
>         /*
>          * NetApp
>          */

If you're going to list a netapp.com address, may as well be
ng-eseries-upstream-maintainers@netapp.com

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 9/9] libmultipath: hwtable: add Lenovo DE series
  2019-03-15 16:33   ` Schremmer, Steven
@ 2019-03-15 16:59     ` Martin Wilck
  2019-03-16 22:44       ` Xose Vazquez Perez
  0 siblings, 1 reply; 14+ messages in thread
From: Martin Wilck @ 2019-03-15 16:59 UTC (permalink / raw)
  To: Schremmer, Steven, Christophe Varoqui, Benjamin Marzinski
  Cc: ng-eseries-upstream-maintainers, dm-devel, xose.vazquez

On Fri, 2019-03-15 at 16:33 +0000,  Schremmer, Steven wrote:
> > +        /*
> > +         * Lenovo
> > +         */
> > +        {
> > +                /*
> > +                * DE Series
> > +                *
> > +                * Maintainer: Steve Schremmer <
> > Steve.Schremmer@netapp.com>
> > +                */
> > +                .vendor        = "LENOVO",
> > +                .product       = "DE_Series",
> > +                .bl_product    = "Universal Xport",
> > +                .pgpolicy      = GROUP_BY_PRIO,
> > +                .checker_name  = RDAC,
> > +                .features      = "2 pg_init_retries 50",
> > +                .hwhandler     = "1 rdac",
> > +                .prio_name     = PRIO_RDAC,
> > +                .pgfailback    = -FAILBACK_IMMEDIATE,
> > +                .no_path_retry = 30,
> > +        },
> >         /*
> >          * NetApp
> >          */
> 
> If you're going to list a netapp.com address, may as well be
> ng-eseries-upstream-maintainers@netapp.com
> 

Currently, we have these in hwtable.c:

 * Maintainer: Martin George <marting@netapp.com>
 * Maintainer: PJ Waskiewicz <pj.waskiewicz@netapp.com>

Should they all be replaced by the ng-eseries address?

Also, if you happen to know a Lenovo maintainer, feel free to
tell me.

Martin

-- 
Dr. Martin Wilck <mwilck@suse.com>, Tel. +49 (0)911 74053 2107
SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)


--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH 9/9] libmultipath: hwtable: add Lenovo DE series
  2019-03-15 16:59     ` Martin Wilck
@ 2019-03-16 22:44       ` Xose Vazquez Perez
  0 siblings, 0 replies; 14+ messages in thread
From: Xose Vazquez Perez @ 2019-03-16 22:44 UTC (permalink / raw)
  To: Martin Wilck, Schremmer, Steven, Christophe Varoqui, Benjamin Marzinski
  Cc: ng-eseries-upstream-maintainers, dm-devel

On 3/15/19 5:59 PM, Martin Wilck wrote:

> Currently, we have these in hwtable.c:
> 
>  * Maintainer: Martin George <marting@netapp.com>

only for ONTAP.

>  * Maintainer: PJ Waskiewicz <pj.waskiewicz@netapp.com>

and only for SolidFir.

> Should they all be replaced by the ng-eseries address?

No. ng-eseries address is just for RDAC devices.

> Also, if you happen to know a Lenovo maintainer, feel free to
> tell me.

It could be deserted. There is no maintainer for all other rdac arrays.
All of them share the same config, inherited from "SANtricity(RDAC) family".

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2019-03-16 22:44 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-15 16:11 [PATCH 0/9] multipath-tools: avoid I/O during uevent processing Martin Wilck
2019-03-15 16:11 ` [PATCH 1/9] libmultipath: add sysfs_get_inquiry() Martin Wilck
2019-03-15 16:11 ` [PATCH 2/9] libmultipath: alua: make API more consistent Martin Wilck
2019-03-15 16:11 ` [PATCH 3/9] libmultipath: alua: try to retrieve inquiry data from sysfs Martin Wilck
2019-03-15 16:11 ` [PATCH 4/9] libmultipath: constify sysfs_get_timeout() Martin Wilck
2019-03-15 16:11 ` [PATCH 5/9] libmultipath: detect_alua(): use system timeout Martin Wilck
2019-03-15 16:11 ` [PATCH 6/9] libmultipath: lazy tpgs probing Martin Wilck
2019-03-15 16:11 ` [PATCH 7/9] libmultipath: don't link alua_rtpg.o twice Martin Wilck
2019-03-15 16:11 ` [PATCH 8/9] libmultipath: check_rdac(): pre-check in hwtable Martin Wilck
2019-03-15 16:11 ` [PATCH 9/9] libmultipath: hwtable: add Lenovo DE series Martin Wilck
2019-03-15 16:21   ` Xose Vazquez Perez
2019-03-15 16:33   ` Schremmer, Steven
2019-03-15 16:59     ` Martin Wilck
2019-03-16 22:44       ` Xose Vazquez Perez

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.