Miroslav Franc dcbf1c
From: Heiko Carstens <hca@linux.ibm.com>
Miroslav Franc dcbf1c
Date: Thu, 11 May 2023 17:04:41 +0200
Miroslav Franc dcbf1c
Subject: s390/qdio: fix do_sqbs() inline assembly constraint
Miroslav Franc dcbf1c
Git-commit: 2862a2fdfae875888e3c1c3634e3422e01d98147
Miroslav Franc dcbf1c
Patch-mainline: v6.4-rc3
Miroslav Franc dcbf1c
References: git-fixes bsc#1211693
Miroslav Franc dcbf1c
Miroslav Franc dcbf1c
Use "a" constraint instead of "d" constraint to pass the state parameter to
Miroslav Franc dcbf1c
the do_sqbs() inline assembly. This prevents that general purpose register
Miroslav Franc dcbf1c
zero is used for the state parameter.
Miroslav Franc dcbf1c
Miroslav Franc dcbf1c
If the compiler would select general purpose register zero this would be
Miroslav Franc dcbf1c
problematic for the used instruction in rsy format: the register used for
Miroslav Franc dcbf1c
the state parameter is a base register. If the base register is general
Miroslav Franc dcbf1c
purpose register zero the contents of the register are unexpectedly ignored
Miroslav Franc dcbf1c
when the instruction is executed.
Miroslav Franc dcbf1c
Miroslav Franc dcbf1c
This only applies to z/VM guests using QIOASSIST with dedicated (pass through)
Miroslav Franc dcbf1c
QDIO-based devices such as FCP [zfcp driver] as well as real OSA or
Miroslav Franc dcbf1c
HiperSockets [qeth driver].
Miroslav Franc dcbf1c
Miroslav Franc dcbf1c
A possible symptom for this case using zfcp is the following repeating kernel
Miroslav Franc dcbf1c
message pattern:
Miroslav Franc dcbf1c
Miroslav Franc dcbf1c
zfcp <devbusid>: A QDIO problem occurred
Miroslav Franc dcbf1c
zfcp <devbusid>: A QDIO problem occurred
Miroslav Franc dcbf1c
zfcp <devbusid>: qdio: ZFCP on SC <sc> using AI:1 QEBSM:1 PRI:1 TDD:1 SIGA: W
Miroslav Franc dcbf1c
zfcp <devbusid>: A QDIO problem occurred
Miroslav Franc dcbf1c
zfcp <devbusid>: A QDIO problem occurred
Miroslav Franc dcbf1c
Miroslav Franc dcbf1c
Each of the qdio problem message can be accompanied by the following entries
Miroslav Franc dcbf1c
for the affected subchannel <sc> in
Miroslav Franc dcbf1c
/sys/kernel/debug/s390dbf/qdio_error/hex_ascii for zfcp or qeth:
Miroslav Franc dcbf1c
Miroslav Franc dcbf1c
<sc> ccq: 69....
Miroslav Franc dcbf1c
<sc> SQBS ERROR.
Miroslav Franc dcbf1c
Miroslav Franc dcbf1c
Reviewed-by: Benjamin Block <bblock@linux.ibm.com>
Miroslav Franc dcbf1c
Cc: Steffen Maier <maier@linux.ibm.com>
Miroslav Franc dcbf1c
Fixes: 8129ee164267 ("[PATCH] s390: qdio V=V pass-through")
Miroslav Franc dcbf1c
Cc: <stable@vger.kernel.org>
Miroslav Franc dcbf1c
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Miroslav Franc dcbf1c
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
Miroslav Franc dcbf1c
Acked-by: Miroslav Franc <mfranc@suse.cz>
Miroslav Franc dcbf1c
---
Miroslav Franc dcbf1c
 drivers/s390/cio/qdio.h | 2 +-
Miroslav Franc dcbf1c
 1 file changed, 1 insertion(+), 1 deletion(-)
Miroslav Franc dcbf1c
Miroslav Franc dcbf1c
diff --git a/drivers/s390/cio/qdio.h b/drivers/s390/cio/qdio.h
Miroslav Franc dcbf1c
index 5ea6249d8180..641f0dbb65a9 100644
Miroslav Franc dcbf1c
--- a/drivers/s390/cio/qdio.h
Miroslav Franc dcbf1c
+++ b/drivers/s390/cio/qdio.h
Miroslav Franc dcbf1c
@@ -95,7 +95,7 @@ static inline int do_sqbs(u64 token, unsigned char state, int queue,
Miroslav Franc dcbf1c
 		"	lgr	1,%[token]\n"
Miroslav Franc dcbf1c
 		"	.insn	rsy,0xeb000000008a,%[qs],%[ccq],0(%[state])"
Miroslav Franc dcbf1c
 		: [ccq] "+&d" (_ccq), [qs] "+&d" (_queuestart)
Miroslav Franc dcbf1c
-		: [state] "d" ((unsigned long)state), [token] "d" (token)
Miroslav Franc dcbf1c
+		: [state] "a" ((unsigned long)state), [token] "d" (token)
Miroslav Franc dcbf1c
 		: "memory", "cc", "1");
Miroslav Franc dcbf1c
 	*count = _ccq & 0xff;
Miroslav Franc dcbf1c
 	*start = _queuestart & 0xff;
Miroslav Franc dcbf1c