linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Niklas Schnelle <schnelle@linux.ibm.com>,
	Matthew Rosato <mjrosato@linux.ibm.com>,
	Heiko Carstens <hca@linux.ibm.com>,
	Sasha Levin <sashal@kernel.org>,
	linux-s390@vger.kernel.org
Subject: [PATCH AUTOSEL 5.13 43/46] s390/pci: fix misleading rc in clp_set_pci_fn()
Date: Sun,  5 Sep 2021 21:20:48 -0400	[thread overview]
Message-ID: <20210906012052.929174-43-sashal@kernel.org> (raw)
In-Reply-To: <20210906012052.929174-1-sashal@kernel.org>

From: Niklas Schnelle <schnelle@linux.ibm.com>

[ Upstream commit f7addcdd527a6dddfebe20c358b87bdb95624612 ]

Currently clp_set_pci_fn() always returns 0 as long as the CLP request
itself succeeds even if the operation itself returns a response code
other than CLP_RC_OK or CLP_RC_SETPCIFN_ALRDY. This is highly misleading
because calling code assumes that a zero rc means that the operation was
successful.

Fix this by returning the response code or cc on failure with the
exception of the special handling for CLP_RC_SETPCIFN_ALRDY. Also let's
not assume that the returned function handle for CLP_RC_SETPCIFN_ALRDY
is 0, we don't need it anyway.

Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
Signed-off-by: Niklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 arch/s390/pci/pci.c     |  7 ++++---
 arch/s390/pci/pci_clp.c | 33 ++++++++++++++++-----------------
 2 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c
index 8fcb7ecb7225..77cd965cffef 100644
--- a/arch/s390/pci/pci.c
+++ b/arch/s390/pci/pci.c
@@ -661,9 +661,10 @@ int zpci_enable_device(struct zpci_dev *zdev)
 {
 	int rc;
 
-	rc = clp_enable_fh(zdev, ZPCI_NR_DMA_SPACES);
-	if (rc)
+	if (clp_enable_fh(zdev, ZPCI_NR_DMA_SPACES)) {
+		rc = -EIO;
 		goto out;
+	}
 
 	rc = zpci_dma_init_device(zdev);
 	if (rc)
@@ -684,7 +685,7 @@ int zpci_disable_device(struct zpci_dev *zdev)
 	 * The zPCI function may already be disabled by the platform, this is
 	 * detected in clp_disable_fh() which becomes a no-op.
 	 */
-	return clp_disable_fh(zdev);
+	return clp_disable_fh(zdev) ? -EIO : 0;
 }
 
 /**
diff --git a/arch/s390/pci/pci_clp.c b/arch/s390/pci/pci_clp.c
index d3331596ddbe..0a0e8b8293be 100644
--- a/arch/s390/pci/pci_clp.c
+++ b/arch/s390/pci/pci_clp.c
@@ -213,15 +213,19 @@ int clp_query_pci_fn(struct zpci_dev *zdev)
 }
 
 static int clp_refresh_fh(u32 fid);
-/*
- * Enable/Disable a given PCI function and update its function handle if
- * necessary
+/**
+ * clp_set_pci_fn() - Execute a command on a PCI function
+ * @zdev: Function that will be affected
+ * @nr_dma_as: DMA address space number
+ * @command: The command code to execute
+ *
+ * Returns: 0 on success, < 0 for Linux errors (e.g. -ENOMEM), and
+ * > 0 for non-success platform responses
  */
 static int clp_set_pci_fn(struct zpci_dev *zdev, u8 nr_dma_as, u8 command)
 {
 	struct clp_req_rsp_set_pci *rrb;
 	int rc, retries = 100;
-	u32 fid = zdev->fid;
 
 	rrb = clp_alloc_block(GFP_KERNEL);
 	if (!rrb)
@@ -245,17 +249,16 @@ static int clp_set_pci_fn(struct zpci_dev *zdev, u8 nr_dma_as, u8 command)
 		}
 	} while (rrb->response.hdr.rsp == CLP_RC_SETPCIFN_BUSY);
 
-	if (rc || rrb->response.hdr.rsp != CLP_RC_OK) {
-		zpci_err("Set PCI FN:\n");
-		zpci_err_clp(rrb->response.hdr.rsp, rc);
-	}
-
 	if (!rc && rrb->response.hdr.rsp == CLP_RC_OK) {
 		zdev->fh = rrb->response.fh;
-	} else if (!rc && rrb->response.hdr.rsp == CLP_RC_SETPCIFN_ALRDY &&
-			rrb->response.fh == 0) {
+	} else if (!rc && rrb->response.hdr.rsp == CLP_RC_SETPCIFN_ALRDY) {
 		/* Function is already in desired state - update handle */
-		rc = clp_refresh_fh(fid);
+		rc = clp_refresh_fh(zdev->fid);
+	} else {
+		zpci_err("Set PCI FN:\n");
+		zpci_err_clp(rrb->response.hdr.rsp, rc);
+		if (!rc)
+			rc = rrb->response.hdr.rsp;
 	}
 	clp_free_block(rrb);
 	return rc;
@@ -301,17 +304,13 @@ int clp_enable_fh(struct zpci_dev *zdev, u8 nr_dma_as)
 
 	rc = clp_set_pci_fn(zdev, nr_dma_as, CLP_SET_ENABLE_PCI_FN);
 	zpci_dbg(3, "ena fid:%x, fh:%x, rc:%d\n", zdev->fid, zdev->fh, rc);
-	if (rc)
-		goto out;
-
-	if (zpci_use_mio(zdev)) {
+	if (!rc && zpci_use_mio(zdev)) {
 		rc = clp_set_pci_fn(zdev, nr_dma_as, CLP_SET_ENABLE_MIO);
 		zpci_dbg(3, "ena mio fid:%x, fh:%x, rc:%d\n",
 				zdev->fid, zdev->fh, rc);
 		if (rc)
 			clp_disable_fh(zdev);
 	}
-out:
 	return rc;
 }
 
-- 
2.30.2


  parent reply	other threads:[~2021-09-06  1:25 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-06  1:20 [PATCH AUTOSEL 5.13 01/46] locking/mutex: Fix HANDOFF condition Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 02/46] regmap: fix the offset of register error log Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 03/46] regulator: tps65910: Silence deferred probe error Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 04/46] crypto: mxs-dcp - Check for DMA mapping errors Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 05/46] sched/deadline: Fix reset_on_fork reporting of DL tasks Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 06/46] power: supply: axp288_fuel_gauge: Report register-address on readb / writeb errors Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 07/46] crypto: omap-sham - clear dma flags only after omap_sham_update_dma_stop() Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 08/46] sched/deadline: Fix missing clock update in migrate_task_rq_dl() Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 09/46] rcu/tree: Handle VM stoppage in stall detection Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 10/46] EDAC/mce_amd: Do not load edac_mce_amd module on guests Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 11/46] posix-cpu-timers: Force next expiration recalc after itimer reset Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 12/46] hrtimer: Avoid double reprogramming in __hrtimer_start_range_ns() Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 13/46] hrtimer: Ensure timerfd notification for HIGHRES=n Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 14/46] udf: Check LVID earlier Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 15/46] udf: Fix iocharset=utf8 mount option Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 16/46] isofs: joliet: " Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 17/46] bcache: add proper error unwinding in bcache_device_init Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 18/46] nbd: add the check to prevent overflow in __nbd_ioctl() Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 19/46] blk-throtl: optimize IOPS throttle for large IO scenarios Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 20/46] nvme-tcp: don't update queue count when failing to set io queues Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 21/46] nvme-rdma: " Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 22/46] nvmet: pass back cntlid on successful completion Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 23/46] power: supply: smb347-charger: Add missing pin control activation Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 24/46] power: supply: max17042_battery: fix typo in MAx17042_TOFF Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 25/46] s390/cio: add dev_busid sysfs entry for each subchannel Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 26/46] s390/zcrypt: fix wrong offset index for APKA master key valid state Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 27/46] libata: fix ata_host_start() Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 28/46] sched/topology: Skip updating masks for non-online nodes Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 29/46] crypto: omap - Fix inconsistent locking of device lists Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 30/46] crypto: qat - do not ignore errors from enable_vf2pf_comms() Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 31/46] crypto: qat - handle both source of interrupt in VF ISR Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 32/46] crypto: qat - fix reuse of completion variable Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 33/46] crypto: qat - fix naming for init/shutdown VF to PF notifications Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 34/46] crypto: qat - do not export adf_iov_putmsg() Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 35/46] crypto: hisilicon/sec - fix the abnormal exiting process Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 36/46] crypto: hisilicon/sec - modify the hardware endian configuration Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 37/46] crypto: tcrypt - Fix missing return value check Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 38/46] fcntl: fix potential deadlocks for &fown_struct.lock Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 39/46] fcntl: fix potential deadlock for &fasync_struct.fa_lock Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 40/46] udf_get_extendedattr() had no boundary checks Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 41/46] io-wq: remove GFP_ATOMIC allocation off schedule out path Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 42/46] s390/kasan: fix large PMD pages address alignment check Sasha Levin
2021-09-06  1:20 ` Sasha Levin [this message]
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 44/46] s390/debug: keep debug data on resize Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 45/46] s390/debug: fix debug area life cycle Sasha Levin
2021-09-06  1:20 ` [PATCH AUTOSEL 5.13 46/46] s390/ap: fix state machine hang after failure to enable irq Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210906012052.929174-43-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=hca@linux.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=mjrosato@linux.ibm.com \
    --cc=schnelle@linux.ibm.com \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).