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.10 36/39] s390/pci: fix misleading rc in clp_set_pci_fn()
Date: Sun, 5 Sep 2021 21:21:50 -0400 [thread overview]
Message-ID: <20210906012153.929962-36-sashal@kernel.org> (raw)
In-Reply-To: <20210906012153.929962-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 ca1a105e3b5d..0ddb1fe353dc 100644
--- a/arch/s390/pci/pci.c
+++ b/arch/s390/pci/pci.c
@@ -659,9 +659,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;
}
EXPORT_SYMBOL_GPL(zpci_disable_device);
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
next prev parent reply other threads:[~2021-09-06 1:27 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-06 1:21 [PATCH AUTOSEL 5.10 01/39] locking/mutex: Fix HANDOFF condition Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 02/39] regmap: fix the offset of register error log Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 03/39] regulator: tps65910: Silence deferred probe error Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 04/39] crypto: mxs-dcp - Check for DMA mapping errors Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 05/39] sched/deadline: Fix reset_on_fork reporting of DL tasks Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 06/39] power: supply: axp288_fuel_gauge: Report register-address on readb / writeb errors Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 07/39] crypto: omap-sham - clear dma flags only after omap_sham_update_dma_stop() Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 08/39] sched/deadline: Fix missing clock update in migrate_task_rq_dl() Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 09/39] rcu/tree: Handle VM stoppage in stall detection Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 10/39] EDAC/mce_amd: Do not load edac_mce_amd module on guests Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 11/39] posix-cpu-timers: Force next expiration recalc after itimer reset Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 12/39] hrtimer: Avoid double reprogramming in __hrtimer_start_range_ns() Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 13/39] hrtimer: Ensure timerfd notification for HIGHRES=n Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 14/39] udf: Check LVID earlier Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 15/39] udf: Fix iocharset=utf8 mount option Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 16/39] isofs: joliet: " Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 17/39] bcache: add proper error unwinding in bcache_device_init Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 18/39] blk-throtl: optimize IOPS throttle for large IO scenarios Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 19/39] nvme-tcp: don't update queue count when failing to set io queues Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 20/39] nvme-rdma: " Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 21/39] nvmet: pass back cntlid on successful completion Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 22/39] power: supply: smb347-charger: Add missing pin control activation Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 23/39] power: supply: max17042_battery: fix typo in MAx17042_TOFF Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 24/39] s390/cio: add dev_busid sysfs entry for each subchannel Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 25/39] s390/zcrypt: fix wrong offset index for APKA master key valid state Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 26/39] libata: fix ata_host_start() Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 27/39] crypto: omap - Fix inconsistent locking of device lists Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 28/39] crypto: qat - do not ignore errors from enable_vf2pf_comms() Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 29/39] crypto: qat - handle both source of interrupt in VF ISR Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 30/39] crypto: qat - fix reuse of completion variable Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 31/39] crypto: qat - fix naming for init/shutdown VF to PF notifications Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 32/39] crypto: qat - do not export adf_iov_putmsg() Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 33/39] fcntl: fix potential deadlock for &fasync_struct.fa_lock Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 34/39] udf_get_extendedattr() had no boundary checks Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 35/39] s390/kasan: fix large PMD pages address alignment check Sasha Levin
2021-09-06 1:21 ` Sasha Levin [this message]
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 37/39] s390/debug: keep debug data on resize Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 38/39] s390/debug: fix debug area life cycle Sasha Levin
2021-09-06 1:21 ` [PATCH AUTOSEL 5.10 39/39] 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=20210906012153.929962-36-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