+++ /dev/null
-From 41012fc2aa29a3d34c4950dd83774e9fb54e32a4 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 23 Oct 2023 09:57:10 +0200
-Subject: s390/ap: fix AP bus crash on early config change callback invocation
-
-From: Harald Freudenberger <freude@linux.ibm.com>
-
-commit e14aec23025eeb1f2159ba34dbc1458467c4c347 upstream.
-
-Fix kernel crash in AP bus code caused by very early invocation of the
-config change callback function via SCLP.
-
-After a fresh IML of the machine the crypto cards are still offline and
-will get switched online only with activation of any LPAR which has the
-card in it's configuration. A crypto card coming online is reported
-to the LPAR via SCLP and the AP bus offers a callback function to get
-this kind of information. However, it may happen that the callback is
-invoked before the AP bus init function is complete. As the callback
-triggers a synchronous AP bus scan, the scan may already run but some
-internal states are not initialized by the AP bus init function resulting
-in a crash like this:
-
- [ 11.635859] Unable to handle kernel pointer dereference in virtual kernel address space
- [ 11.635861] Failing address: 0000000000000000 TEID: 0000000000000887
- [ 11.635862] Fault in home space mode while using kernel ASCE.
- [ 11.635864] AS:00000000894c4007 R3:00000001fece8007 S:00000001fece7800 P:000000000000013d
- [ 11.635879] Oops: 0004 ilc:1 [#1] SMP
- [ 11.635882] Modules linked in:
- [ 11.635884] CPU: 5 PID: 42 Comm: kworker/5:0 Not tainted 6.6.0-rc3-00003-g4dbf7cdc6b42 #12
- [ 11.635886] Hardware name: IBM 3931 A01 751 (LPAR)
- [ 11.635887] Workqueue: events_long ap_scan_bus
- [ 11.635891] Krnl PSW : 0704c00180000000 0000000000000000 (0x0)
- [ 11.635895] R:0 T:1 IO:1 EX:1 Key:0 M:1 W:0 P:0 AS:3 CC:0 PM:0 RI:0 EA:3
- [ 11.635897] Krnl GPRS: 0000000001000a00 0000000000000000 0000000000000006 0000000089591940
- [ 11.635899] 0000000080000000 0000000000000a00 0000000000000000 0000000000000000
- [ 11.635901] 0000000081870c00 0000000089591000 000000008834e4e2 0000000002625a00
- [ 11.635903] 0000000081734200 0000038000913c18 000000008834c6d6 0000038000913ac8
- [ 11.635906] Krnl Code:>0000000000000000: 0000 illegal
- [ 11.635906] 0000000000000002: 0000 illegal
- [ 11.635906] 0000000000000004: 0000 illegal
- [ 11.635906] 0000000000000006: 0000 illegal
- [ 11.635906] 0000000000000008: 0000 illegal
- [ 11.635906] 000000000000000a: 0000 illegal
- [ 11.635906] 000000000000000c: 0000 illegal
- [ 11.635906] 000000000000000e: 0000 illegal
- [ 11.635915] Call Trace:
- [ 11.635916] [<0000000000000000>] 0x0
- [ 11.635918] [<000000008834e4e2>] ap_queue_init_state+0x82/0xb8
- [ 11.635921] [<000000008834ba1c>] ap_scan_domains+0x6fc/0x740
- [ 11.635923] [<000000008834c092>] ap_scan_adapter+0x632/0x8b0
- [ 11.635925] [<000000008834c3e4>] ap_scan_bus+0xd4/0x288
- [ 11.635927] [<00000000879a33ba>] process_one_work+0x19a/0x410
- [ 11.635930] Discipline DIAG cannot be used without z/VM
- [ 11.635930] [<00000000879a3a2c>] worker_thread+0x3fc/0x560
- [ 11.635933] [<00000000879aea60>] kthread+0x120/0x128
- [ 11.635936] [<000000008792afa4>] __ret_from_fork+0x3c/0x58
- [ 11.635938] [<00000000885ebe62>] ret_from_fork+0xa/0x30
- [ 11.635942] Last Breaking-Event-Address:
- [ 11.635942] [<000000008834c6d4>] ap_wait+0xcc/0x148
-
-This patch improves the ap_bus_force_rescan() function which is
-invoked by the config change callback by checking if a first
-initial AP bus scan has been done. If not, the force rescan request
-is simple ignored. Anyhow it does not make sense to trigger AP bus
-re-scans even before the very first bus scan is complete.
-
-Cc: stable@vger.kernel.org
-Reviewed-by: Holger Dengler <dengler@linux.ibm.com>
-Signed-off-by: Harald Freudenberger <freude@linux.ibm.com>
-Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/s390/crypto/ap_bus.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c
-index c00a288a4eca2..602438a8c2a26 100644
---- a/drivers/s390/crypto/ap_bus.c
-+++ b/drivers/s390/crypto/ap_bus.c
-@@ -787,6 +787,10 @@ EXPORT_SYMBOL(ap_driver_unregister);
-
- void ap_bus_force_rescan(void)
- {
-+ /* Only trigger AP bus scans after the initial scan is done */
-+ if (atomic64_read(&ap_scan_bus_count) <= 0)
-+ return;
-+
- /* processing a asynchronous bus rescan */
- del_timer(&ap_config_timer);
- queue_work(system_long_wq, &ap_scan_work);
---
-2.42.0
-