From patchwork Mon Jun 30 05:14:02 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Marzinski X-Patchwork-Id: 4445631 X-Patchwork-Delegate: christophe.varoqui@free.fr Return-Path: X-Original-To: patchwork-dm-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 5C35BBEECB for ; Mon, 30 Jun 2014 05:18:25 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 6878420221 for ; Mon, 30 Jun 2014 05:18:24 +0000 (UTC) Received: from mx5-phx2.redhat.com (mx5-phx2.redhat.com [209.132.183.37]) by mail.kernel.org (Postfix) with ESMTP id 48AD0202F8 for ; Mon, 30 Jun 2014 05:18:23 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by mx5-phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s5U5Fco6005377; Mon, 30 Jun 2014 01:15:38 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s5U5EPlQ026118 for ; Mon, 30 Jun 2014 01:14:25 -0400 Received: from dhcp80-209.msp.redhat.com (octiron.msp.redhat.com [10.15.80.209]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s5U5EOah023418 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 30 Jun 2014 01:14:25 -0400 Received: from dhcp80-209.msp.redhat.com (localhost [127.0.0.1]) by dhcp80-209.msp.redhat.com (8.14.7/8.14.7) with ESMTP id s5U5EOpx005150; Mon, 30 Jun 2014 00:14:24 -0500 Received: (from bmarzins@localhost) by dhcp80-209.msp.redhat.com (8.14.7/8.14.7/Submit) id s5U5EN6s005149; Mon, 30 Jun 2014 00:14:23 -0500 From: Benjamin Marzinski To: device-mapper development Date: Mon, 30 Jun 2014 00:14:02 -0500 Message-Id: <1404105243-5071-12-git-send-email-bmarzins@redhat.com> In-Reply-To: <1404105243-5071-1-git-send-email-bmarzins@redhat.com> References: <1404105243-5071-1-git-send-email-bmarzins@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-loop: dm-devel@redhat.com Cc: Christophe Varoqui Subject: [dm-devel] [PATCH 11/12] make prioritizers use checker_timeout, if set X-BeenThere: dm-devel@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk Reply-To: device-mapper development List-Id: device-mapper development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: dm-devel-bounces@redhat.com Errors-To: dm-devel-bounces@redhat.com X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The multipath prioritizers can get stuck issuing scsi commands that don't return quickly, just like the checkers. So if checker_timeout is set, the prioritizers should should it for their cmd timeouts as well. Signed-off-by: Benjamin Marzinski --- libmultipath/prio.c | 7 +++++++ libmultipath/prio.h | 1 + libmultipath/prioritizers/alua_rtpg.c | 5 +++-- libmultipath/prioritizers/emc.c | 2 +- libmultipath/prioritizers/hds.c | 2 +- libmultipath/prioritizers/hp_sw.c | 2 +- libmultipath/prioritizers/ontap.c | 4 ++-- libmultipath/prioritizers/rdac.c | 2 +- multipath.conf.annotated | 5 +++-- multipath/multipath.conf.5 | 4 ++-- 10 files changed, 22 insertions(+), 12 deletions(-) diff --git a/libmultipath/prio.c b/libmultipath/prio.c index 05a8cf1..6ee0b9c 100644 --- a/libmultipath/prio.c +++ b/libmultipath/prio.c @@ -10,6 +10,13 @@ static LIST_HEAD(prioritizers); +unsigned int get_prio_timeout(unsigned int default_timeout) +{ + if (conf->checker_timeout) + return conf->checker_timeout * 1000; + return default_timeout; +} + int init_prio (void) { if (!add_prio(DEFAULT_PRIO)) diff --git a/libmultipath/prio.h b/libmultipath/prio.h index 4eeb216..495688f 100644 --- a/libmultipath/prio.h +++ b/libmultipath/prio.h @@ -51,6 +51,7 @@ struct prio { int (*getprio)(struct path *, char *); }; +unsigned int get_prio_timeout(unsigned int default_timeout); int init_prio (void); void cleanup_prio (void); struct prio * add_prio (char *); diff --git a/libmultipath/prioritizers/alua_rtpg.c b/libmultipath/prioritizers/alua_rtpg.c index 981ba06..6d04fc1 100644 --- a/libmultipath/prioritizers/alua_rtpg.c +++ b/libmultipath/prioritizers/alua_rtpg.c @@ -21,6 +21,7 @@ #define __user #include +#include "../prio.h" #include "alua_rtpg.h" #define SENSE_BUFF_LEN 32 @@ -134,7 +135,7 @@ do_inquiry(int fd, int evpd, unsigned int codepage, void *resp, int resplen) hdr.dxfer_len = resplen; hdr.sbp = sense; hdr.mx_sb_len = sizeof(sense); - hdr.timeout = DEF_TIMEOUT; + hdr.timeout = get_prio_timeout(DEF_TIMEOUT); if (ioctl(fd, SG_IO, &hdr) < 0) { PRINT_DEBUG("do_inquiry: IOCTL failed!\n"); @@ -253,7 +254,7 @@ do_rtpg(int fd, void* resp, long resplen) hdr.dxfer_len = resplen; hdr.mx_sb_len = sizeof(sense); hdr.sbp = sense; - hdr.timeout = DEF_TIMEOUT; + hdr.timeout = get_prio_timeout(DEF_TIMEOUT); if (ioctl(fd, SG_IO, &hdr) < 0) return -RTPG_RTPG_FAILED; diff --git a/libmultipath/prioritizers/emc.c b/libmultipath/prioritizers/emc.c index 91b3d90..e49809c 100644 --- a/libmultipath/prioritizers/emc.c +++ b/libmultipath/prioritizers/emc.c @@ -31,7 +31,7 @@ int emc_clariion_prio(const char *dev, int fd) io_hdr.dxferp = sense_buffer; io_hdr.cmdp = inqCmdBlk; io_hdr.sbp = sb; - io_hdr.timeout = 60000; + io_hdr.timeout = get_prio_timeout(60000); io_hdr.pack_id = 0; if (ioctl(fd, SG_IO, &io_hdr) < 0) { pp_emc_log(0, "sending query command failed"); diff --git a/libmultipath/prioritizers/hds.c b/libmultipath/prioritizers/hds.c index f748707..8043b5b 100644 --- a/libmultipath/prioritizers/hds.c +++ b/libmultipath/prioritizers/hds.c @@ -114,7 +114,7 @@ int hds_modular_prio (const char *dev, int fd) io_hdr.dxferp = inqBuff; io_hdr.cmdp = inqCmdBlk; io_hdr.sbp = sense_buffer; - io_hdr.timeout = 2000; /* TimeOut = 2 seconds */ + io_hdr.timeout = get_prio_timeout(2000); /* TimeOut = 2 seconds */ if (ioctl (fd, SG_IO, &io_hdr) < 0) { pp_hds_log(0, "SG_IO error"); diff --git a/libmultipath/prioritizers/hp_sw.c b/libmultipath/prioritizers/hp_sw.c index c24baad..4950cf7 100644 --- a/libmultipath/prioritizers/hp_sw.c +++ b/libmultipath/prioritizers/hp_sw.c @@ -46,7 +46,7 @@ int hp_sw_prio(const char *dev, int fd) io_hdr.dxfer_direction = SG_DXFER_NONE; io_hdr.cmdp = turCmdBlk; io_hdr.sbp = sb; - io_hdr.timeout = 60000; + io_hdr.timeout = get_prio_timeout(60000); io_hdr.pack_id = 0; retry: if (ioctl(fd, SG_IO, &io_hdr) < 0) { diff --git a/libmultipath/prioritizers/ontap.c b/libmultipath/prioritizers/ontap.c index 026d45d..5e82a17 100644 --- a/libmultipath/prioritizers/ontap.c +++ b/libmultipath/prioritizers/ontap.c @@ -89,7 +89,7 @@ static int send_gva(const char *dev, int fd, unsigned char pg, io_hdr.dxferp = results; io_hdr.cmdp = cdb; io_hdr.sbp = sb; - io_hdr.timeout = SG_TIMEOUT; + io_hdr.timeout = get_prio_timeout(SG_TIMEOUT); io_hdr.pack_id = 0; if (ioctl(fd, SG_IO, &io_hdr) < 0) { pp_ontap_log(0, "SG_IO ioctl failed, errno=%d", errno); @@ -141,7 +141,7 @@ static int get_proxy(const char *dev, int fd) io_hdr.dxferp = results; io_hdr.cmdp = cdb; io_hdr.sbp = sb; - io_hdr.timeout = SG_TIMEOUT; + io_hdr.timeout = get_prio_timeout(SG_TIMEOUT); io_hdr.pack_id = 0; if (ioctl(fd, SG_IO, &io_hdr) < 0) { pp_ontap_log(0, "ioctl sending inquiry command failed, " diff --git a/libmultipath/prioritizers/rdac.c b/libmultipath/prioritizers/rdac.c index 2bf1443..a210055 100644 --- a/libmultipath/prioritizers/rdac.c +++ b/libmultipath/prioritizers/rdac.c @@ -31,7 +31,7 @@ int rdac_prio(const char *dev, int fd) io_hdr.dxferp = sense_buffer; io_hdr.cmdp = inqCmdBlk; io_hdr.sbp = sb; - io_hdr.timeout = 60000; + io_hdr.timeout = get_prio_timeout(60000); io_hdr.pack_id = 0; if (ioctl(fd, SG_IO, &io_hdr) < 0) { pp_rdac_log(0, "sending inquiry command failed"); diff --git a/multipath.conf.annotated b/multipath.conf.annotated index 235e130..f158746 100644 --- a/multipath.conf.annotated +++ b/multipath.conf.annotated @@ -243,8 +243,9 @@ # # # # name : checker_timeout # # scope : multipath & multipathd -# # desc : The timeout to use for path checkers that issue scsi -# # commands with an explicit timeout, in seconds. +# # desc : The timeout to use for path checkers and prioritizers +# # that issue scsi commands with an explicit timeout, in +# # seconds. # # values : n > 0 # # default : taken from /sys/block/sd/device/timeout # checker_timeout 60 diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5 index 1a904e9..195e663 100644 --- a/multipath/multipath.conf.5 +++ b/multipath/multipath.conf.5 @@ -330,8 +330,8 @@ maximum number of open fds is taken from the calling process. It is usually if that number is greated than 1024. .TP .B checker_timeout -Specify the timeout to user for path checkers that issue scsi commands with an -explicit timeout, in seconds; default taken from +Specify the timeout to use for path checkers and prioritizers that issue scsi +commands with an explicit timeout, in seconds; default taken from .I /sys/block/sd/device/timeout .TP .B fast_io_fail_tmo