Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp250368ybi; Wed, 29 May 2019 20:39:02 -0700 (PDT) X-Google-Smtp-Source: APXvYqwkrnZPv9kHtcRIBbkACw1cNl4k2N+FKVQgwxt1aAALgtV/TQ8R66uC/fqz6daTgxA62/5d X-Received: by 2002:a65:450b:: with SMTP id n11mr1697850pgq.174.1559187542219; Wed, 29 May 2019 20:39:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559187542; cv=none; d=google.com; s=arc-20160816; b=aGnw1g3GYkBq6wHAbMw9my0ap5jdalxNpnvTRPfO/dhGITYcpfzuKTQkJLUxo2q+Gg vN261SsxvywVC66YjNqNmSFy9YplsdHK2CZzO9ptRT+PpQiSZy6AzTXEjM9WxkcwF/Fa JSuhSnksrFtMbOtg3ZdPX8k2sH1mn5pnQ5AXXxPlb9ZxteHKbC2QT/FeaSZrBkplgKc1 PcwobSK1mmxofvvwsPQbLUhNxSL2TG5lDW9eXyEIEeH39gpzJoTZXvO6oOWDphPFVyr6 gNXet0sUeKtQU4iTakCdvYd1bGRKq+jy+oMGxvwioAk97BwCa3RxJV/xMzkN30MWhCJ0 fieg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=/GdjBvB4RTTn2ptcrx5Wc56XGNcw9Z1okEy5lYYPE90=; b=0g5WR9JM6zwiBkByD4wzR7l7h4Dcn87UF7EwrcYpvCvUmaSrXUy8Y+1Yq0WAE5pG/x QndfXMWZd/5mYFZpiHXT9FGKyLFgBTkrRNl4wg5h0egqfqGtL6sZ9nJd04DznkB+RBkI mxtnhO/6UpadsUuiCKtdjFCvYn73BM+V6cfgJDEfS0e2Ku3vY/XzsFaUjt9gNxQyDIAS ZdGz47DP6L9BznRLT1pz+vPqG7TsTW2wUiMDguVZt63aeim3UoNTflg+2B983cIw5Ns+ GiICeumG9732wz1JJiR2y+MTBtIr+T2Lrrp9rJLKtIs/eHwV1Iq1zsb8P0zmySEondDm 57TA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=BkcHYf2f; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id r25si1640892pgb.439.2019.05.29.20.38.44; Wed, 29 May 2019 20:39:02 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=BkcHYf2f; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1733045AbfE3DZ2 (ORCPT + 99 others); Wed, 29 May 2019 23:25:28 -0400 Received: from mail.kernel.org ([198.145.29.99]:50856 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731562AbfE3DS2 (ORCPT ); Wed, 29 May 2019 23:18:28 -0400 Received: from localhost (ip67-88-213-2.z213-88-67.customer.algx.net [67.88.213.2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 4A73A247CF; Thu, 30 May 2019 03:18:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1559186308; bh=U7oWFLa6HNlYuQfr8/qAu4JkFtkS0PlMnRCeytKEJq8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BkcHYf2f0I2/f27i9Do4XHZA2qdW98aDDpPxwGVy+EhVXwcWahs3zWES4pJnOIhpR 1SiT1kWl3qxaAiyHc/BKJw3gmknch1Jre59LSec8k8lY3c1ZPYzbE/nz27nqIgcSdO 5ZruABRyzlAWHvwuiBfMCr4o2I3P/4m+wHI/QGA8= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Eric Farman , Farhan Ali , Halil Pasic , Cornelia Huck , Sasha Levin Subject: [PATCH 4.19 274/276] vfio-ccw: Prevent quiesce function going into an infinite loop Date: Wed, 29 May 2019 20:07:12 -0700 Message-Id: <20190530030542.325522714@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190530030523.133519668@linuxfoundation.org> References: <20190530030523.133519668@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org [ Upstream commit d1ffa760d22aa1d8190478e5ef555c59a771db27 ] The quiesce function calls cio_cancel_halt_clear() and if we get an -EBUSY we go into a loop where we: - wait for any interrupts - flush all I/O in the workqueue - retry cio_cancel_halt_clear During the period where we are waiting for interrupts or flushing all I/O, the channel subsystem could have completed a halt/clear action and turned off the corresponding activity control bits in the subchannel status word. This means the next time we call cio_cancel_halt_clear(), we will again start by calling cancel subchannel and so we can be stuck between calling cancel and halt forever. Rather than calling cio_cancel_halt_clear() immediately after waiting, let's try to disable the subchannel. If we succeed in disabling the subchannel then we know nothing else can happen with the device. Suggested-by: Eric Farman Signed-off-by: Farhan Ali Message-Id: <4d5a4b98ab1b41ac6131b5c36de18b76c5d66898.1555449329.git.alifm@linux.ibm.com> Reviewed-by: Eric Farman Acked-by: Halil Pasic Signed-off-by: Cornelia Huck Signed-off-by: Sasha Levin --- drivers/s390/cio/vfio_ccw_drv.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/drivers/s390/cio/vfio_ccw_drv.c b/drivers/s390/cio/vfio_ccw_drv.c index 0e0a743aeaf69..7a06cdff6572d 100644 --- a/drivers/s390/cio/vfio_ccw_drv.c +++ b/drivers/s390/cio/vfio_ccw_drv.c @@ -40,26 +40,30 @@ int vfio_ccw_sch_quiesce(struct subchannel *sch) if (ret != -EBUSY) goto out_unlock; + iretry = 255; do { - iretry = 255; ret = cio_cancel_halt_clear(sch, &iretry); - while (ret == -EBUSY) { - /* - * Flush all I/O and wait for - * cancel/halt/clear completion. - */ - private->completion = &completion; - spin_unlock_irq(sch->lock); - wait_for_completion_timeout(&completion, 3*HZ); + if (ret == -EIO) { + pr_err("vfio_ccw: could not quiesce subchannel 0.%x.%04x!\n", + sch->schid.ssid, sch->schid.sch_no); + break; + } + + /* + * Flush all I/O and wait for + * cancel/halt/clear completion. + */ + private->completion = &completion; + spin_unlock_irq(sch->lock); - private->completion = NULL; - flush_workqueue(vfio_ccw_work_q); - spin_lock_irq(sch->lock); - ret = cio_cancel_halt_clear(sch, &iretry); - }; + if (ret == -EBUSY) + wait_for_completion_timeout(&completion, 3*HZ); + private->completion = NULL; + flush_workqueue(vfio_ccw_work_q); + spin_lock_irq(sch->lock); ret = cio_disable_subchannel(sch); } while (ret == -EBUSY); out_unlock: -- 2.20.1