From nobody Mon Sep 28 23:55:25 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3CB40472F72; Fri, 14 Aug 2026 16:34:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786725246; cv=none; b=clhog21GHekOnzp3k/9CqF1yDM/9LJ3KRAOqMQAZZnlZ1B0zsHxaK+Q+2TWPp2rEXzvLpyUZ+pb7zS8BKfudtwlPCTSnnKIIh421WLmDjuH76xncLHy9xoROzB/DGS7RLFOCdh2A1efalM6PX6100zNBThkPFr3Zf09aKBidlOc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786725246; c=relaxed/simple; bh=38WLb7tJBA54vnYXwUGVTGPnr/7/N2hZdYahs0DftHI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=beic1Xj0Fhby0NQOKhdCp08eM+C2ccTdmrtX2whcHd9F/pmChYGtuXECGZkewlba9Tt0XKIoGeOmJSa1+1HNBKLt6/DxFsGyg/ysf4gaRmKGtJCpuMYFOPPICFxuy/Ai/UlFxM2K2TvcUQy6eIigYRKn2y5U8QBPzsQBrhZ2qz4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=Jqh2AB9B; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="Jqh2AB9B" Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67EE5WWC1289635; Fri, 14 Aug 2026 16:34:03 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=Kly62Bl/mmZtytbLO I2Iw+g+MeZCeCzbeA6vm4lyVKs=; b=Jqh2AB9BQKimndRjXRrSl4/6DKR0RQxB5 oIWJMbMPn+Dqo34ed93SQHYNjuAF6i1sKZNEP3U3NcGsrs9kCO1Np7QBhKcfwJuu yuNJcxSxA9n/8+ogSyDgACdWlI8bekSzErrq23Lgokrzb4Rx/uu7oJ8YjbUs+5Nr 45CyF7JvqUuak8O/e+ZQTkAplXy+f1X13g6JFZ/dwXjR5npnw+/NSsXu6U/Drby3 LtkHk2vZLz1Xe5w9rFJT9JiBozDUxDykIX7qX8dEZpV90ULvS9/98l/H1ExbAFf2 O0YsBBAKDXsl7W3HUjq5DHbQXZvlznjSDDK8A3EfQhBPRlRkj6HIA== Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4fwvq9wpk2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 14 Aug 2026 16:34:02 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67EGQGUD027864; Fri, 14 Aug 2026 16:34:02 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4fxh0gqww5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 14 Aug 2026 16:34:01 +0000 (GMT) Received: from smtpav03.fra02v.mail.ibm.com (smtpav03.fra02v.mail.ibm.com [10.20.54.102]) by smtprelay01.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67EGXuxf39911808 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 14 Aug 2026 16:33:56 GMT Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2FC3520040; Fri, 14 Aug 2026 16:33:56 +0000 (GMT) Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 075C42004B; Fri, 14 Aug 2026 16:33:56 +0000 (GMT) Received: from p-imbrenda.ehn-de.ibm.com (unknown [9.224.75.30]) by smtpav03.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 14 Aug 2026 16:33:55 +0000 (GMT) From: Claudio Imbrenda To: linux-kernel@vger.kernel.org Cc: kvm@vger.kernel.org, linux-s390@vger.kernel.org, borntraeger@de.ibm.com, frankja@linux.ibm.com, david@kernel.org, seiden@linux.ibm.com, nrb@linux.ibm.com, schlameuss@linux.ibm.com, gra@linux.ibm.com Subject: [PATCH v2 1/6] KVM: s390: Fix dirty marking in adapter_indicators_set*() Date: Fri, 14 Aug 2026 18:33:50 +0200 Message-ID: <20260814163355.227191-2-imbrenda@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260814163355.227191-1-imbrenda@linux.ibm.com> References: <20260814163355.227191-1-imbrenda@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: 7aow7-kxfsF0Hy3cZG603c0HWe_sL_9K X-Authority-Analysis: v=2.4 cv=PbDPQChd c=1 sm=1 tr=0 ts=6a7f437b cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VnNF1IyMAAAA:8 a=erwwKp9ikJBr0o1lINgA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODE0MDEyNiBTYWx0ZWRfX1daKWaCOn2yl CMsZxmpmIoljYQDu/bm0IImaEMNAeMYGrX6H5KJ+V9TcEfyabI34ubd4iNzzVsOCks49XqEG/iz LC+SLkTPpHCsdQuo/jc4UXePt6AelZpozCqleTuC3z9Jg+4KsymYiz14FwLHkNiDPpumA9BSlt+ EUeflX9tGM8fcO9jOvi+4F4h/LOXu3L6vLPfDzYoXhj7KTUOnItAthFay+P6BYLbVuOo/8t97ov YgBmMBrCkEyA4Juy7ed6Hq4nvmEkz0O5ggI/qx7lG1OtyyU6YOeE4xJcuvEV2/6JpJGJhAM1txy M4RAu5dk1baKQgVMT6YXEnun3X0frQvRhk+DzX/Wi0EM5s8wFUHwEKboM36HSs1TqNeruVsIDuO ak+Tw243zwXgRLpan+ySfWLcMSpKI97tqK5KIlEsRWQy5b6zqZ+a4MP+NNhivh6SCGdQ71JdvaS WNct27RzfEfXbcJxsxw== X-Proofpoint-ORIG-GUID: 7aow7-kxfsF0Hy3cZG603c0HWe_sL_9K X-Proofpoint-Spam-Info: AW1haW4tMjYwODE0MDEyNiBTYWx0ZWRfXz4KT40WkpJpO ulQCTe0gbV0oeMwx9E+mu7aoH1pA8TnQKhzhKbUyVLgoKLgLHCAdcOrYuASWR6zpFgHlHGNNwe/ gw2OPY88Ol1tzEM11tIQdT7lncQ4QHw= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-14_05,2026-08-12_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 bulkscore=0 impostorscore=0 malwarescore=0 adultscore=0 clxscore=1015 priorityscore=1501 suspectscore=0 phishscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608140126 Content-Type: text/plain; charset="utf-8" When the indicator and/or summary bits are set in the guest, the accessed page was only marked dirty in KVM if the access was performed using the slow path; accesses through the new kvm_arch_set_irq_inatomic fast inject path would not mark the page as dirty. Fix by adding/moving the missing calls to mark_page_dirty(). Note that for the inatomic path set_page_dirty{,_lock}() is not needed as the page stays pinned; the unpin path correctly marks it as dirty. Opportunistically reorder the local variables to be in reverse Christmas tree order and refactor to use guard(). Fixes: 1e95e3bc6b05 ("KVM: s390: Enable adapter_indicators_set to use mappe= d pages") Signed-off-by: Claudio Imbrenda Reviewed-by: Matthew Rosato --- arch/s390/kvm/interrupt.c | 40 ++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c index da740a378a8c..fc4d1f8193d9 100644 --- a/arch/s390/kvm/interrupt.c +++ b/arch/s390/kvm/interrupt.c @@ -2984,12 +2984,14 @@ static int adapter_indicators_set(struct kvm *kvm, struct s390_io_adapter *adapter, struct kvm_s390_adapter_int *adapter_int) { - unsigned long bit; - int summary_set, idx; struct s390_map_info *ind_info, *summary_info; - void *map; struct page *ind_page, *summary_page; unsigned long flags; + unsigned long bit; + int summary_set; + void *map; + + guard(srcu)(&kvm->srcu); =20 ind_page =3D NULL; =20 @@ -3000,14 +3002,11 @@ static int adapter_indicators_set(struct kvm *kvm, ind_page =3D pin_map_page(kvm, adapter_int->ind_addr, 0); if (!ind_page) return -1; - idx =3D srcu_read_lock(&kvm->srcu); map =3D page_address(ind_page); bit =3D get_ind_bit(adapter_int->ind_addr, adapter_int->ind_offset, adapter->swap); set_bit(bit, map); - mark_page_dirty(kvm, adapter_int->ind_gaddr >> PAGE_SHIFT); set_page_dirty_lock(ind_page); - srcu_read_unlock(&kvm->srcu, idx); unpin_user_page(ind_page); } else { map =3D page_address(ind_info->page); @@ -3015,6 +3014,7 @@ static int adapter_indicators_set(struct kvm *kvm, set_bit(bit, map); spin_unlock_irqrestore(&adapter->maps_lock, flags); } + mark_page_dirty(kvm, gpa_to_gfn(adapter_int->ind_gaddr)); =20 spin_lock_irqsave(&adapter->maps_lock, flags); summary_info =3D get_map_info(adapter, adapter_int->summary_addr); @@ -3023,14 +3023,11 @@ static int adapter_indicators_set(struct kvm *kvm, summary_page =3D pin_map_page(kvm, adapter_int->summary_addr, 0); if (!summary_page) return -1; - idx =3D srcu_read_lock(&kvm->srcu); map =3D page_address(summary_page); bit =3D get_ind_bit(adapter_int->summary_addr, adapter_int->summary_offset, adapter->swap); summary_set =3D test_and_set_bit(bit, map); - mark_page_dirty(kvm, adapter_int->summary_gaddr >> PAGE_SHIFT); set_page_dirty_lock(summary_page); - srcu_read_unlock(&kvm->srcu, idx); unpin_user_page(summary_page); } else { map =3D page_address(summary_info->page); @@ -3039,6 +3036,7 @@ static int adapter_indicators_set(struct kvm *kvm, summary_set =3D test_and_set_bit(bit, map); spin_unlock_irqrestore(&adapter->maps_lock, flags); } + mark_page_dirty(kvm, gpa_to_gfn(adapter_int->summary_gaddr)); =20 return summary_set ? 0 : 1; } @@ -3048,26 +3046,29 @@ static int adapter_indicators_set_fast(struct kvm *= kvm, struct kvm_s390_adapter_int *adapter_int, int setbit) { + struct s390_map_info *ind_info, *summary_info; unsigned long bit; int summary_set; - struct s390_map_info *ind_info, *summary_info; void *map; =20 - spin_lock(&adapter->maps_lock); + guard(srcu)(&kvm->srcu); + guard(spinlock)(&adapter->maps_lock); + ind_info =3D get_map_info(adapter, adapter_int->ind_addr); - if (!ind_info) { - spin_unlock(&adapter->maps_lock); + if (!ind_info) return -EWOULDBLOCK; - } + map =3D page_address(ind_info->page); bit =3D get_ind_bit(ind_info->addr, adapter_int->ind_offset, adapter->swa= p); - if (setbit) + if (setbit) { set_bit(bit, map); + mark_page_dirty(kvm, gpa_to_gfn(adapter_int->ind_gaddr)); + } + summary_info =3D get_map_info(adapter, adapter_int->summary_addr); - if (!summary_info) { - spin_unlock(&adapter->maps_lock); + if (!summary_info) return -EWOULDBLOCK; - } + map =3D page_address(summary_info->page); bit =3D get_ind_bit(summary_info->addr, adapter_int->summary_offset, adapter->swap); @@ -3077,7 +3078,8 @@ static int adapter_indicators_set_fast(struct kvm *kv= m, summary_set =3D test_and_set_bit(bit, map); else summary_set =3D test_and_clear_bit(bit, map); - spin_unlock(&adapter->maps_lock); + mark_page_dirty(kvm, gpa_to_gfn(adapter_int->summary_gaddr)); + return summary_set ? 0 : 1; } =20 --=20 2.55.0 From nobody Mon Sep 28 23:55:25 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C2B8F3CFF65; Fri, 14 Aug 2026 16:34:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786725247; cv=none; b=I5V1NrTZnPH9srBcrCGi1CJWNuh+R3w87M2e0I+/eXMpC0NJk2OfWjaLfsNZqfl0xvITYe02X+5zDWVGqbuPQLflVpuO+IlaX7SlzzS34lhsBo+pbp5FOA3dWmc+WzfgJRugQUCv3Jx+ydXyHA7hWSDf58Vwf/OLgS8uNBClYRI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786725247; c=relaxed/simple; bh=ZD4E94rMcJ+fep3qUl4Ec66Az6CdbctO0DaZr12pfoQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rT0pa4lhKKBlxJjKVc8JiBCCO6+rIo88ZFYWbAX8pOQ9dfVN6bsT5VY3w6i/jb263NOWa5zbRuQ2AlKU8P1RqCurL6OpTJCeZpbEtv/wLreg30uosJ8QAP4ECjzpzj4qoPWp2hYxLJdUqnXOYrWTM9QXbXa3mKbdxAZqrK4Yin4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=AS6DUU1K; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="AS6DUU1K" Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67EE5b9o1289728; Fri, 14 Aug 2026 16:34:04 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=Zbl1efghVdfhhHNOR pEFurRXvKWRBRz4DpisB+Cpidg=; b=AS6DUU1KlhWf+Sq+epzzCwmKV9Iq0UB5A N+wz2p126BQ17gMNLgqClGTyZqoitAYY6eCW2hUlQQq8oWENoQY8RJSDi/jWyX/T gQqyD7azxKQ2O/rjbVrHSexFJMdNMQIm676eRBzuVLg43txWncsnI3D5f37KV6hF KZqCoMR+Kuu1Xt0xVyjKEYRiayjwvkHzVGvVdTPJcegO1RTXA/AQHGEcF143O6pL GNc4ElDokIZiQIDUhVnnLYPURmmyes0KYPEnZHGlyg7QEkiPu6cYoopaSOMBq54d PWBZsTeTac46h4ueWzmgCnf42b28dUWNrksyMHz3+rnpmd/WyxIBQ== Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4fwvq9wpk3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 14 Aug 2026 16:34:03 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67EGQId7028926; Fri, 14 Aug 2026 16:34:02 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4fxf5wg509-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 14 Aug 2026 16:34:02 +0000 (GMT) Received: from smtpav03.fra02v.mail.ibm.com (smtpav03.fra02v.mail.ibm.com [10.20.54.102]) by smtprelay01.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67EGXu6v39911810 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 14 Aug 2026 16:33:56 GMT Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 587C62004B; Fri, 14 Aug 2026 16:33:56 +0000 (GMT) Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 34F0820043; Fri, 14 Aug 2026 16:33:56 +0000 (GMT) Received: from p-imbrenda.ehn-de.ibm.com (unknown [9.224.75.30]) by smtpav03.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 14 Aug 2026 16:33:56 +0000 (GMT) From: Claudio Imbrenda To: linux-kernel@vger.kernel.org Cc: kvm@vger.kernel.org, linux-s390@vger.kernel.org, borntraeger@de.ibm.com, frankja@linux.ibm.com, david@kernel.org, seiden@linux.ibm.com, nrb@linux.ibm.com, schlameuss@linux.ibm.com, gra@linux.ibm.com Subject: [PATCH v2 2/6] KVM: s390: Fix _gaccess_shadow_fault() Date: Fri, 14 Aug 2026 18:33:51 +0200 Message-ID: <20260814163355.227191-3-imbrenda@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260814163355.227191-1-imbrenda@linux.ibm.com> References: <20260814163355.227191-1-imbrenda@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: 3kb41jCXGi5Xc2IktiwA3mQktdkzYxX6 X-Authority-Analysis: v=2.4 cv=PbDPQChd c=1 sm=1 tr=0 ts=6a7f437b cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VnNF1IyMAAAA:8 a=nPGPQeRDbKebYXXOS2MA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODE0MDEyNiBTYWx0ZWRfX/u+8dMJmrZ2T BgcPpHaO1Ha00vcH7NOtlIlOE4ifCf8ePvji2BNH3sfNC5jAqF/MNMCnzIN1aUbdEvg8UU22yn9 uV7ajxPGNBpUl2CLAiJj5qkMqwhkPkRxSWdNxLGZA6fJRZCv7kQdVDxjzlnMiwW6opiqSuLEd0w 09OOAXztnibtakvmCEpfb/9NRvUuc7V6rX/diTWfAX+92t6hGzo+QfXNlEGtZ9PqdqaYbAJ8tcA NhktLybZUkipPKCm5XwAtr4yA6KWRgoNM44nRtNhSJ8Ay/APvzQrnT2cuxok2o88KjAcrNM/XR1 TllU7CEIGzBw2gGU1C2rUC3XAZqjXHDlRCjDN2nOrWKEeObT6xOJXBM4vqiv9PodJzYYbNRrcaN NE3pllyRV3pSl9gSWcpkGgZFl9jebqgcqto73+12YSU6srC0N6oY5fJnAHaPV/2De/+DDBhzeBp 01yDlAlhsl6AIythM1A== X-Proofpoint-ORIG-GUID: 3kb41jCXGi5Xc2IktiwA3mQktdkzYxX6 X-Proofpoint-Spam-Info: AW1haW4tMjYwODE0MDEyNiBTYWx0ZWRfX/9nxsXAVR+z4 9wsUGIgXS99Msha/FhUZxaWmBWg8atIBVs8n7FqK0Fi4qBMTxUhDob1AvHfAWlRMKZ/2rCmKt2R xp+xjZ4CmyrsohN0IP7XwNvhkj2kihQ= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-14_05,2026-08-12_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 bulkscore=0 impostorscore=0 malwarescore=0 adultscore=0 clxscore=1015 priorityscore=1501 suspectscore=0 phishscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608140126 Content-Type: text/plain; charset="utf-8" In some circumstances, it is possible that the page of nested guest memory that is being shadowed is not present at all in the parent guest gmap. dat_entry_walk() will not find any leaf entry and return with -ENOENT, which will erroneously be propagated all the way to userspace. Fix by manually calling gmap_link() on the memory of the nested guest that is being shadowed if the mapping was not already present. Fixes: e38c884df921 ("KVM: s390: Switch to new gmap") Signed-off-by: Claudio Imbrenda --- arch/s390/kvm/gaccess.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/arch/s390/kvm/gaccess.c b/arch/s390/kvm/gaccess.c index 36102b2727fb..7c1f614ec314 100644 --- a/arch/s390/kvm/gaccess.c +++ b/arch/s390/kvm/gaccess.c @@ -1593,12 +1593,25 @@ static inline int ___gaccess_shadow_fault(struct kv= m_vcpu *vcpu, struct gmap *sg parent =3D READ_ONCE(sg->parent); if (!parent) return -EAGAIN; +retry: scoped_guard(spinlock, &parent->children_lock) { if (READ_ONCE(sg->parent) !=3D parent) return -EAGAIN; sg->invalidated =3D false; rc =3D _gaccess_do_shadow(vcpu->arch.mc, sg, saddr, walk); } + if (rc =3D=3D -ENOENT) { + struct kvm_memory_slot *slot; + struct guest_fault *entries; + + entries =3D get_entries(walk); + slot =3D kvm_vcpu_gfn_to_memslot(vcpu, entries[LEVEL_MEM].gfn); + if (!slot) + return PGM_ADDRESSING; + rc =3D gmap_link(vcpu->arch.mc, parent, entries + LEVEL_MEM, slot); + if (!rc) + goto retry; + } if (!rc) kvm_s390_release_faultin_array(vcpu->kvm, walk->raw_entries, false); return rc; --=20 2.55.0 From nobody Mon Sep 28 23:55:25 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3DC984746B6; Fri, 14 Aug 2026 16:34:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786725247; cv=none; b=NCyVYzJ0IkCQ0/vpunJxbd/71R52W9ORezMKFeNWBGunWed7KPxTKtvh214AXjfrbqzoZE6fjrLCHWH/Jh6ss/notjl9orTA/alKHddn/yfushDdm3NduGIO6/bbuFip/A+tgrCK7DsrO/qNl6OvrhEUzN5bGPhEZ12FUNFChO8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786725247; c=relaxed/simple; bh=K5BzN5QpzIs7YuCJ0jGsMeHGst+rBXD29or/xhgUpYw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Pa9ZEKI6U8xX5RRXjebuuCb3O2NJgNOj9vqtCkylBYaeDuBqldfjpOe7blX+hwWpexPFbksTQ8p3iR2VUGbUwuXQrozVq4ufQoGAa0xZI+5w2+rfL+e1UfLkweTLs1RwkvWkEYvTbnqEs65EvLIdizWSINKcT54I38YKg4iBw10= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=D7O6ZZwa; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="D7O6ZZwa" Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67EE5b4L1342764; Fri, 14 Aug 2026 16:34:03 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=qr4MY0oRDku6OeQM3 5li4ovdevqNGCJvyjiTW8fNRGw=; b=D7O6ZZwaijQQQXKP15p+gmPud9d78nFvg LcBC8WxC02pCslDL3W87QpYeryC9Jmhbg6LxCEPrratlVh6tjv8VVWKuPr7Rld5c cYLbOMUUOGgzPaM0vR6uX8CXyUeojASto1OXetNriU0kbDTesCToJYY/dBeOTI7U wpxfQISiyXTPmcIvt8NXkSxVK+ClIE4uvKMBt/5VkysfxbgVJEHGBEhnOYYo09zT U/awr2k5q9oci3mWprGWkN/paxGsjGAPQM06tI2/m3GQ6awct4w+9TUkt/KdbCsL awxmCnoUTN+rqpcjgekAMn5/h0/pXSnqGz6+M/LcjCjVye5qhoA/w== Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4fwvma5tb0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 14 Aug 2026 16:34:03 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67EGQ1eY016561; Fri, 14 Aug 2026 16:34:02 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4fxesqg71t-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 14 Aug 2026 16:34:02 +0000 (GMT) Received: from smtpav03.fra02v.mail.ibm.com (smtpav03.fra02v.mail.ibm.com [10.20.54.102]) by smtprelay01.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67EGXu7239911812 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 14 Aug 2026 16:33:56 GMT Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8733920040; Fri, 14 Aug 2026 16:33:56 +0000 (GMT) Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5D96D2004D; Fri, 14 Aug 2026 16:33:56 +0000 (GMT) Received: from p-imbrenda.ehn-de.ibm.com (unknown [9.224.75.30]) by smtpav03.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 14 Aug 2026 16:33:56 +0000 (GMT) From: Claudio Imbrenda To: linux-kernel@vger.kernel.org Cc: kvm@vger.kernel.org, linux-s390@vger.kernel.org, borntraeger@de.ibm.com, frankja@linux.ibm.com, david@kernel.org, seiden@linux.ibm.com, nrb@linux.ibm.com, schlameuss@linux.ibm.com, gra@linux.ibm.com Subject: [PATCH v2 3/6] KVM: s390: Refactor dat_set_slot() Date: Fri, 14 Aug 2026 18:33:52 +0200 Message-ID: <20260814163355.227191-4-imbrenda@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260814163355.227191-1-imbrenda@linux.ibm.com> References: <20260814163355.227191-1-imbrenda@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODE0MDEyNiBTYWx0ZWRfX6s2y6tke4VCu Cm4n4XiOeHfvHW+X0Ubu3eb5vvesSG0MAUxw06dAzKUw03Vxaq/aYxKTbybP4Ym6L/XEkSNDRBw WES5sVKZuDAn2kjt0LAe1B1of8hZk7JU1VHnN45c0tWcCMjxjrjyT8Lz83ukJOAq4GC8aAi9ptg 7dFmZwMkH53uYMtM3uIc9Aqcrk4cV9JN3rvHg3fzyK0pK9fckH1N3adXX9csywGlikBYUqbibG9 IYI/XkmXK7WrBWxHfPCLFW2qSpoOHsR6e7MmCWDsYLwDuEJVBznSY7FfxYG56mS4TGGfP9rTD7f VWkEFVDjTt5hfK/+NGZUBrFzbVlyiJVMvQ3tiUKKNnlT5HvMb7G7mWK2+/EWcM+JkJTAzwcPXpd cgMvjk4WOF5VJil32lPV8xkIXDlttYAQv5J3gOQZ4gWMl/+mwrltFCDMxSU6jTeSQ3LpjFwTGcE 8pNIJiEC8EmnXB73PLA== X-Proofpoint-ORIG-GUID: imMlS1DRQ8ObTYR0epY-9CxcWGGDQpmT X-Proofpoint-Spam-Info: AW1haW4tMjYwODE0MDEyNiBTYWx0ZWRfX7hGvuyiOjUI5 q6je2WL0M3xHpU2MiURQy2Qbxe2wWAx+ptEiSuID+g1/n5M36IHxZ/p+xO8g52n6INeylGlzU74 LR+Kq3KGCmv/4Quj8JKMCtx3twpVtZ0= X-Authority-Analysis: v=2.4 cv=IfK3n2qa c=1 sm=1 tr=0 ts=6a7f437b cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VnNF1IyMAAAA:8 a=Dh8sLtxf0uV7TDLfvswA:9 X-Proofpoint-GUID: imMlS1DRQ8ObTYR0epY-9CxcWGGDQpmT X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-14_05,2026-08-12_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 priorityscore=1501 impostorscore=0 bulkscore=0 clxscore=1015 lowpriorityscore=0 adultscore=0 malwarescore=0 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608140126 Content-Type: text/plain; charset="utf-8" Refactor dat_set_slot(), _dat_slot_pte(), _dat_slot_crste(). Now they only take a struct kvm_s390_mmu_cache as priv. For dat_delete_slot(), mc is NULL, as no allocations should take place. This is needed as a prerequisite to move gmap DAT table setup from kvm_arch_commit_memory_region() to kvm_arch_prepare_memory_region(). Signed-off-by: Claudio Imbrenda --- arch/s390/kvm/dat.c | 29 +++++++++-------------------- arch/s390/kvm/dat.h | 10 ++++------ arch/s390/kvm/kvm-s390.c | 4 ++-- 3 files changed, 15 insertions(+), 28 deletions(-) diff --git a/arch/s390/kvm/dat.c b/arch/s390/kvm/dat.c index f2ea013cb33e..7e5dd5a1eb1e 100644 --- a/arch/s390/kvm/dat.c +++ b/arch/s390/kvm/dat.c @@ -844,19 +844,12 @@ long dat_reset_skeys(union asce asce, gfn_t start) return _dat_walk_gfn_range(start, asce_end(asce), asce, &ops, DAT_WALK_IG= N_HOLES, NULL); } =20 -struct slot_priv { - unsigned long token; - struct kvm_s390_mmu_cache *mc; -}; - static long _dat_slot_pte(union pte *ptep, gfn_t gfn, gfn_t next, struct d= at_walk *walk) { - struct slot_priv *p =3D walk->priv; - union crste dummy =3D { .val =3D p->token }; union pte new_pte, pte =3D READ_ONCE(*ptep); union pgste pgste; =20 - new_pte =3D _PTE_TOK(dummy.tok.type, dummy.tok.par); + new_pte =3D walk->priv ? _PTE_EMPTY : _PTE_TOK(_DAT_TOKEN_PIC, PGM_ADDRES= SING); =20 /* Table entry already in the desired state. */ if (pte.val =3D=3D new_pte.val) @@ -873,10 +866,9 @@ static long _dat_slot_pte(union pte *ptep, gfn_t gfn, = gfn_t next, struct dat_wal static long _dat_slot_crste(union crste *crstep, gfn_t gfn, gfn_t next, st= ruct dat_walk *walk) { union crste new_crste, crste =3D READ_ONCE(*crstep); - struct slot_priv *p =3D walk->priv; + struct kvm_s390_mmu_cache *mc =3D walk->priv; =20 - new_crste.val =3D p->token; - new_crste.h.tt =3D crste.h.tt; + new_crste =3D mc ? _CRSTE_EMPTY(crste.h.tt) : _CRSTE_HOLE(crste.h.tt); =20 /* Table entry already in the desired state. */ if (crste.val =3D=3D new_crste.val) @@ -900,7 +892,10 @@ static long _dat_slot_crste(union crste *crstep, gfn_t= gfn, gfn_t next, struct d if (!crste.h.fc && !crste.h.i) return 0; /* Split (install a lower level table), and handle things there. */ - return dat_split_crste(p->mc, crstep, gfn, walk->asce, false); + if (mc) + return dat_split_crste(mc, crstep, gfn, walk->asce, false); + /* A large page should never cross memslots boundaries */ + return -EINVAL; } =20 static const struct dat_walk_ops dat_slot_ops =3D { @@ -908,16 +903,10 @@ static const struct dat_walk_ops dat_slot_ops =3D { .crste_ops =3D { _dat_slot_crste, _dat_slot_crste, _dat_slot_crste, _dat_= slot_crste, }, }; =20 -int dat_set_slot(struct kvm_s390_mmu_cache *mc, union asce asce, gfn_t sta= rt, gfn_t end, - u16 type, u16 param) +int dat_set_slot(struct kvm_s390_mmu_cache *mc, union asce asce, gfn_t sta= rt, gfn_t end) { - struct slot_priv priv =3D { - .token =3D _CRSTE_TOK(0, type, param).val, - .mc =3D mc, - }; - return _dat_walk_gfn_range(start, end, asce, &dat_slot_ops, - DAT_WALK_IGN_HOLES | DAT_WALK_ANY, &priv); + DAT_WALK_IGN_HOLES | DAT_WALK_ANY, mc); } =20 static void pgste_set_unlock_multiple(union pte *first, int n, union pgste= *pgstes) diff --git a/arch/s390/kvm/dat.h b/arch/s390/kvm/dat.h index 141ee7b9f019..57f32ac9ffed 100644 --- a/arch/s390/kvm/dat.h +++ b/arch/s390/kvm/dat.h @@ -543,8 +543,7 @@ long dat_reset_skeys(union asce asce, gfn_t start); unsigned long dat_get_ptval(struct page_table *table, struct ptval_param p= aram); void dat_set_ptval(struct page_table *table, struct ptval_param param, uns= igned long val); =20 -int dat_set_slot(struct kvm_s390_mmu_cache *mc, union asce asce, gfn_t sta= rt, gfn_t end, - u16 type, u16 param); +int dat_set_slot(struct kvm_s390_mmu_cache *mc, union asce asce, gfn_t sta= rt, gfn_t end); int dat_set_prefix_notif_bit(union asce asce, gfn_t gfn); bool dat_test_age_gfn(union asce asce, gfn_t start, gfn_t end); =20 @@ -958,16 +957,15 @@ static inline int get_level(union crste *crstep, unio= n pte *ptep) return ptep ? TABLE_TYPE_PAGE_TABLE : crstep->h.tt; } =20 -static inline int dat_delete_slot(struct kvm_s390_mmu_cache *mc, union asc= e asce, gfn_t start, - unsigned long npages) +static inline int dat_delete_slot(union asce asce, gfn_t start, unsigned l= ong npages) { - return dat_set_slot(mc, asce, start, start + npages, _DAT_TOKEN_PIC, PGM_= ADDRESSING); + return dat_set_slot(NULL, asce, start, start + npages); } =20 static inline int dat_create_slot(struct kvm_s390_mmu_cache *mc, union asc= e asce, gfn_t start, unsigned long npages) { - return dat_set_slot(mc, asce, start, start + npages, _DAT_TOKEN_NONE, 0); + return dat_set_slot(mc, asce, start, start + npages); } =20 static inline bool crste_is_ucas(union crste crste) diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 91b975835457..212ff0f8eecc 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -5860,10 +5860,10 @@ void kvm_arch_commit_memory_region(struct kvm *kvm, =20 switch (change) { case KVM_MR_DELETE: - rc =3D dat_delete_slot(mc, kvm->arch.gmap->asce, old->base_gfn, old->np= ages); + rc =3D dat_delete_slot(kvm->arch.gmap->asce, old->base_gfn, old->npages= ); break; case KVM_MR_MOVE: - rc =3D dat_delete_slot(mc, kvm->arch.gmap->asce, old->base_gfn, old->np= ages); + rc =3D dat_delete_slot(kvm->arch.gmap->asce, old->base_gfn, old->npages= ); if (rc) break; fallthrough; --=20 2.55.0 From nobody Mon Sep 28 23:55:25 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C61AF489894; Fri, 14 Aug 2026 16:34:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786725248; cv=none; b=YuBCrWLtXbjhuQnaLn1rFIdhXN/MozK3R3DuuXxONZ2TvkR5jTeA3jgciWNViOOm6o8WtQnqF8xFZOuVCQRgdAj/7BOAL97CcUfv6Sp7cqPvlRbIl4ARt0MeiOGaA78fIs1Yb0al1/o/HlsxXmwWsRZ51ORs87wtf4MNpUPQsM4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786725248; c=relaxed/simple; bh=YZYkHDDjG4RiAuB5DNRd0Flp9YVWczQAHXbq3hMDdik=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aSjWXj8uGgeXH3UuMufSo08FXuSwBxDYi7rc5ZRldSsH7Aedld+aSM2rnG/XLZzt0EEMRykDYGgD0kbwepFkcfzRYqr/AjCBTfa3wjieRZcdPMtBi5WO9pAOYEqrBlfLH0+YfIziKv0+uSzeG0sP0ccxIDEeikJOQXRq9P3ssQo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=rzpg5Iv8; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="rzpg5Iv8" Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67EE5iat1370405; Fri, 14 Aug 2026 16:34:03 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=bjor/lT8tx972mA44 cXUeinOWNF8kIvP+1a1pIjpXdI=; b=rzpg5Iv8qSmMS9h1M+6J7DeGCRtBOGz/B um4fYnpc1Lq9t3m2/AAhQfjUeibkCZ/VCZBFt6w/B+GCH9IAPlfkxxHwwcS/BtA6 fYNqMdiWZe+aKUZP198wB5d9CFlece250ObWtDJZQH9D4hNgSTikQShde8UzNo4s VJI4LRGAKG4HSn0hygESBjaZ3p2uvObZYvdSPhcqFQMRAH6mAkIV74ZtYExBg3ET ldsTNE2lE79lOPvDyMEeTYIxbsVLB4cJgv7TVUEDwtMo/WtovFbUIE2SuFXzOCk6 2AdcqpzsIFQ66Ut3V6KGBII7WCI9L75ldmJRDG3li+7CHBw6EU33g== Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4fwvnwmhcs-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 14 Aug 2026 16:34:03 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67EGQLHM028942; Fri, 14 Aug 2026 16:34:03 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4fxf5wg50a-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 14 Aug 2026 16:34:02 +0000 (GMT) Received: from smtpav03.fra02v.mail.ibm.com (smtpav03.fra02v.mail.ibm.com [10.20.54.102]) by smtprelay01.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67EGXuf039911814 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 14 Aug 2026 16:33:56 GMT Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B17A42004B; Fri, 14 Aug 2026 16:33:56 +0000 (GMT) Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8C5F220043; Fri, 14 Aug 2026 16:33:56 +0000 (GMT) Received: from p-imbrenda.ehn-de.ibm.com (unknown [9.224.75.30]) by smtpav03.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 14 Aug 2026 16:33:56 +0000 (GMT) From: Claudio Imbrenda To: linux-kernel@vger.kernel.org Cc: kvm@vger.kernel.org, linux-s390@vger.kernel.org, borntraeger@de.ibm.com, frankja@linux.ibm.com, david@kernel.org, seiden@linux.ibm.com, nrb@linux.ibm.com, schlameuss@linux.ibm.com, gra@linux.ibm.com Subject: [PATCH v2 4/6] KVM: s390: Move all code into kvm_arch_prepare_memory_region() Date: Fri, 14 Aug 2026 18:33:53 +0200 Message-ID: <20260814163355.227191-5-imbrenda@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260814163355.227191-1-imbrenda@linux.ibm.com> References: <20260814163355.227191-1-imbrenda@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=RsP16imK c=1 sm=1 tr=0 ts=6a7f437b cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VnNF1IyMAAAA:8 a=XQGuvBUbV6v71_fLNr4A:9 X-Proofpoint-GUID: l3wvZrDLhVF-sD1WUbkUv7j52aHANsGF X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODE0MDEyNiBTYWx0ZWRfX5pYKLvR0x+OV bh+L6tMN6StT9D3A5XMOGXv6pC9KVLnlsus3J34Fpe8WuZuv5SBUwex8NR0KTS2M55scJ0sJTep UcaXoKD1WKbSRH7KMtW1WESs4uIybJtD6LadSJb57vIcnjdh10ZAwehYHNFAHpm0nZgbaScAfRu qXUx01LEYT+eywc2i7qLF7nEV/c97rDRpw5sbuT2u5NyhzNgCCyu3Fpf2vbaEPZref9DJc0RH6z 4CFG/ZZvgqPJpKN5iwL1ddQFRoERz7JqC9IOMVysxaXS67yfdlL7yNTiuv/exZSsz7XF67Qp53I GfYmuXZMOJ8+w5CY6+faUcuHoch48rgslQOM3VgUvMk5pWFW1puccUHvBELIe2ug4aMV10L2YO5 6/BEky7hlVKB3Jdjs9t/u0oLXmMnReMwglM6BIAm5Sg+M7BR5D2Ewog+HLl6drLzRDUhdG4X8GY n/apdtgAwvA9A+PBqEw== X-Proofpoint-ORIG-GUID: l3wvZrDLhVF-sD1WUbkUv7j52aHANsGF X-Proofpoint-Spam-Info: AW1haW4tMjYwODE0MDEyNiBTYWx0ZWRfX+RTRhDpZY3Wn quSH5Fc/gzt9ZTo+3MWrpRV88xNlPFqRJcML6q3Sfq/BkbVLYNmCWkRamrIJw9Vp7fXhW75hyK/ lWn8fmnvdsYDXcjR8/8WJUBCLa/TqrA= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-14_05,2026-08-12_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 impostorscore=0 suspectscore=0 clxscore=1015 malwarescore=0 phishscore=0 adultscore=0 lowpriorityscore=0 priorityscore=1501 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608140126 Content-Type: text/plain; charset="utf-8" Move all code from kvm_arch_commit_memory_region() into kvm_arch_prepare_memory_region(). This allows the function to fail gracefully if needed. The previous behaviour was to print a warning and continue execution with page tables incosistent with the memslots. Fixes: e38c884df921 ("KVM: s390: Switch to new gmap") Signed-off-by: Claudio Imbrenda --- arch/s390/kvm/kvm-s390.c | 120 ++++++++++++++++++--------------------- 1 file changed, 54 insertions(+), 66 deletions(-) diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 212ff0f8eecc..50eb72447fd5 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -5772,11 +5772,28 @@ bool kvm_arch_irqchip_in_kernel(struct kvm *kvm) } =20 /* Section: memory related */ +static long cmma_d_count_pte(union pte *ptep, gfn_t gfn, gfn_t next, struc= t dat_walk *walk) +{ + union pgste pgste; + + pgste =3D pgste_get_lock(ptep); + if (pgste.cmma_d) { + pgste.cmma_d =3D 0; + atomic64_dec(walk->priv); + } + pgste_set_unlock(ptep, pgste); + return 0; +} + int kvm_arch_prepare_memory_region(struct kvm *kvm, const struct kvm_memory_slot *old, struct kvm_memory_slot *new, enum kvm_mr_change change) { + const struct dat_walk_ops ops =3D { .pte_entry =3D cmma_d_count_pte, }; + struct kvm_s390_mmu_cache *mc __free(kvm_s390_mmu_cache) =3D NULL; + int rc =3D 0; + if (kvm_is_ucontrol(kvm) && new && new->id < KVM_USER_MEM_SLOTS) return -EINVAL; =20 @@ -5791,6 +5808,10 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm, * and munmap() stuff in this slot after doing this call at any * time. */ + if (change !=3D KVM_MR_MOVE && change !=3D KVM_MR_CREATE) { + WARN(1, "Unknown KVM MR CHANGE: %d\n", change); + return -EINVAL; + } if (new->userspace_addr & ~PAGE_MASK) return -EINVAL; if ((new->base_gfn + new->npages) * PAGE_SIZE > kvm->arch.mem_limit) @@ -5799,56 +5820,28 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm, return -EINVAL; } =20 - if (!kvm->arch.migration_mode) - return 0; - - /* - * Turn off migration mode when: - * - userspace creates a new memslot with dirty logging off, - * - userspace modifies an existing memslot (MOVE or FLAGS_ONLY) and - * dirty logging is turned off. - * Migration mode expects dirty page logging being enabled to store - * its dirty bitmap. - */ - if (change !=3D KVM_MR_DELETE && - !(new->flags & KVM_MEM_LOG_DIRTY_PAGES)) - WARN(kvm_s390_vm_stop_migration(kvm), - "Failed to stop migration mode"); - - return 0; -} - -static long cmma_d_count_pte(union pte *ptep, gfn_t gfn, gfn_t next, struc= t dat_walk *walk) -{ - union pgste pgste; - - pgste =3D pgste_get_lock(ptep); - if (pgste.cmma_d) { - pgste.cmma_d =3D 0; - atomic64_dec(walk->priv); + if (kvm->arch.migration_mode) { + /* + * Turn off migration mode when: + * - userspace creates a new memslot with dirty logging off, + * - userspace modifies an existing memslot (MOVE or FLAGS_ONLY) + * and dirty logging is turned off. + * Migration mode expects dirty page logging being enabled to + * store its dirty bitmap. + */ + if (change !=3D KVM_MR_DELETE && + !(new->flags & KVM_MEM_LOG_DIRTY_PAGES)) + WARN(kvm_s390_vm_stop_migration(kvm), + "Failed to stop migration mode"); } - pgste_set_unlock(ptep, pgste); - return 0; -} - -void kvm_arch_commit_memory_region(struct kvm *kvm, - struct kvm_memory_slot *old, - const struct kvm_memory_slot *new, - enum kvm_mr_change change) -{ - const struct dat_walk_ops ops =3D { .pte_entry =3D cmma_d_count_pte, }; - struct kvm_s390_mmu_cache *mc __free(kvm_s390_mmu_cache) =3D NULL; - int rc =3D 0; - - guard(mutex)(&kvm->slots_arch_lock); =20 if (change =3D=3D KVM_MR_FLAGS_ONLY) - return; - - mc =3D kvm_s390_new_mmu_cache(); - if (!mc) { - rc =3D -ENOMEM; - goto out; + return 0; + if (change !=3D KVM_MR_DELETE) { + /* Enough capacity to add a new memslot */ + mc =3D kvm_s390_new_mmu_cache(); + if (!mc) + return -ENOMEM; } =20 scoped_guard(write_lock, &kvm->mmu_lock) { @@ -5858,28 +5851,23 @@ void kvm_arch_commit_memory_region(struct kvm *kvm, &kvm->arch.cmma_dirty_pages); } =20 - switch (change) { - case KVM_MR_DELETE: - rc =3D dat_delete_slot(kvm->arch.gmap->asce, old->base_gfn, old->npages= ); - break; - case KVM_MR_MOVE: + if (change =3D=3D KVM_MR_DELETE || change =3D=3D KVM_MR_MOVE) rc =3D dat_delete_slot(kvm->arch.gmap->asce, old->base_gfn, old->npages= ); - if (rc) - break; - fallthrough; - case KVM_MR_CREATE: + if (!rc && (change =3D=3D KVM_MR_MOVE || change =3D=3D KVM_MR_CREATE)) rc =3D dat_create_slot(mc, kvm->arch.gmap->asce, new->base_gfn, new->np= ages); - break; - case KVM_MR_FLAGS_ONLY: - break; - default: - WARN(1, "Unknown KVM MR CHANGE: %d\n", change); - } } -out: - if (rc) - pr_warn("failed to commit memory region\n"); - return; + /* + * Can only be triggered if dat_{create,delete}_slot() found an + * internal inconsistency or if the mmu cache ran out of memory; + * both should be impossible. + */ + KVM_BUG_ON(rc, kvm); + return rc; +} + +void kvm_arch_commit_memory_region(struct kvm *kvm, struct kvm_memory_slot= *old, + const struct kvm_memory_slot *new, enum kvm_mr_change change) +{ } =20 /** --=20 2.55.0 From nobody Mon Sep 28 23:55:25 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C610E3C4B92; Fri, 14 Aug 2026 16:34:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786725248; cv=none; b=bh315OJbgZB669PUy5U7m1Kfl7R9wgUM4zEpVPlqzR1Joe6t4KZNHPVw4KMq2etLKnyRPAd+WG4v/T+smDPVsZv/Mp8PuQyGBJP9N4tLy2k+Y3RpYLhThN3pkYBRCuAAC69cOOr0uR0JU0ZIq0TnDOi6L82YS0TLh44JleU7UMw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786725248; c=relaxed/simple; bh=F59Qurcp/kTVoXzlPeyY+3oN0QzaQuxO5xt4EBdXI80=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WE9t4o6pxBwkPCa924PJyCsnBs0xbTFAfDvb8pN6AyeriC0LKNG996v7m1k8siWeRx2dydehwXz7+cC6vbI8PgqQfRz67vs7phvL8f9DB52BVHkNPUiwac34+rqurV3/khZmCzhIvXMIyvEvdTMZcqg/Lw1fRAJJMgz+NfwGR2w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=Ru2i6RGJ; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="Ru2i6RGJ" Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67EE5x8T1248784; Fri, 14 Aug 2026 16:34:04 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=xilWAbM9y3pPZPJsW /U53F9B1V2aBsOTYtlGrg9Kflk=; b=Ru2i6RGJmDVwTp63OxCQP3Bsy3JQ+KBNZ ue/WFdJ15XASqA+AzOelnq07xVW3R0/ZAHkhKmzS0FKivTAagUqGSE5kn5Qn9pWc Z0wsqRjHfrS42izNv4n7PbVPJkykUTSOPvHt9B/v+EufnvVBkEEUn6azF8hHY4/8 fJo77J/aiXo9bv0s8XOByNJ6fF1Lb884vdvpyF2qfwIGHzS5fWFv+meXcFegkrt4 fFcSl6O8ZgfsZRRZR1WxWDdXclJU/egUDagDxDRfw0e8nyZ6eN3iSXtoLovkgIbn EpuwW2zxtPUNLw0hOv5w0IUwsxobdI6HacY0NbxHjOuUVE2Gp0j1w== Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4fwvp3chhe-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 14 Aug 2026 16:34:03 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67EGQQu0029403; Fri, 14 Aug 2026 16:34:03 GMT Received: from smtprelay04.fra02v.mail.ibm.com ([9.218.2.228]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4fxf5wg50b-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 14 Aug 2026 16:34:03 +0000 (GMT) Received: from smtpav03.fra02v.mail.ibm.com (smtpav03.fra02v.mail.ibm.com [10.20.54.102]) by smtprelay04.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67EGXvgt23200364 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 14 Aug 2026 16:33:57 GMT Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E69A220043; Fri, 14 Aug 2026 16:33:56 +0000 (GMT) Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B8C6420040; Fri, 14 Aug 2026 16:33:56 +0000 (GMT) Received: from p-imbrenda.ehn-de.ibm.com (unknown [9.224.75.30]) by smtpav03.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 14 Aug 2026 16:33:56 +0000 (GMT) From: Claudio Imbrenda To: linux-kernel@vger.kernel.org Cc: kvm@vger.kernel.org, linux-s390@vger.kernel.org, borntraeger@de.ibm.com, frankja@linux.ibm.com, david@kernel.org, seiden@linux.ibm.com, nrb@linux.ibm.com, schlameuss@linux.ibm.com, gra@linux.ibm.com Subject: [PATCH v2 5/6] KVM: s390: Add missing srcu in kvm_s390_set_irq_state() Date: Fri, 14 Aug 2026 18:33:54 +0200 Message-ID: <20260814163355.227191-6-imbrenda@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260814163355.227191-1-imbrenda@linux.ibm.com> References: <20260814163355.227191-1-imbrenda@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=AMtp2X5w c=1 sm=1 tr=0 ts=6a7f437b cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VnNF1IyMAAAA:8 a=F91muKJsJommOsj9A9kA:9 X-Proofpoint-GUID: L0_K220QkQwFTGAlmDWtlye42E6ryUSa X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODE0MDEyNiBTYWx0ZWRfXxp7t/fBmTpcI NyqjPYAY/iygC6vWxzsZsVjG15C3qVtfojRJ+Qns6XVccKD5lrntomy63BcmgX8ivP97doPTP5p HTULlrk4ZR4/6zs4M3ctM2nCrtg1Ns1k0TzzEHmPIYXEa0iv0V6i9uv4mIbuCdzFAhn+QWa0TIW RKOLziaCmlkPBWmOsqmmnVxv5ZbVdgzHA+Sp9x96nxRGfX2ut8wRXKBS3iOVN6fmvf0jJIPKHBX 3igeQf47qWUWhY4TcoaV8O6Pfz9B4QbgpKc+vW1Brv4sQaRZfq/2udtiKyOO0NIFF8HcHXm4gqv yGhjoZCKhfJgVqAnYjLEV1LEIaTRvG+uBBaBpKhjTh+3kvPoKPbuvctSrTgJ6a2ihWaDFen9vTl ZyEDLQxXM1JS1V1C6DBtGOdttISr4AeEuUZ6ArL6t8lVpM7IUIFwRNK8tNO+sf1d40F5Y+ZuaA/ JqRcen1RmXt1Kj6fS1w== X-Proofpoint-ORIG-GUID: L0_K220QkQwFTGAlmDWtlye42E6ryUSa X-Proofpoint-Spam-Info: AW1haW4tMjYwODE0MDEyNiBTYWx0ZWRfX29gGZyIDCGUZ 4tR1r8lKH2KIbjshnxz8u2a3ibjMB0EcB9shdowbMtF1Xifsuv2RGDYpyMFyEJNo9y6kHyACTGX K/sHjq7H8xKTdlhTS81wXqJtpDa3yIM= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-14_05,2026-08-12_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 adultscore=0 lowpriorityscore=0 clxscore=1015 priorityscore=1501 impostorscore=0 phishscore=0 spamscore=0 bulkscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608140126 Content-Type: text/plain; charset="utf-8" Like kvm_s390_inject_vcpu(), kvm_s390_set_irq_state() also needs the kvm->srcu or the slots lock when performing the Store status operation. Fix by taking kvm->srcu in kvm_s390_set_irq_state(). Fixes: ba5c1e9b6cee ("KVM: s390: interrupt subsystem, cpu timer, waitpsw") Fixes: 062e44a9319f ("KVM: s390: Use srcu in kvm_arch_vcpu_unlocked_ioctl()= ") Signed-off-by: Claudio Imbrenda Reviewed-by: Christoph Schlameuss --- arch/s390/kvm/interrupt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c index fc4d1f8193d9..8a251f83d323 100644 --- a/arch/s390/kvm/interrupt.c +++ b/arch/s390/kvm/interrupt.c @@ -3230,9 +3230,9 @@ int kvm_s390_set_irq_state(struct kvm_vcpu *vcpu, voi= d __user *irqstate, int len break; } } - if (storestatus) { - n =3D kvm_s390_store_status_unloaded(vcpu, KVM_S390_STORE_STATUS_NOADDR); + scoped_guard(srcu, &vcpu->kvm->srcu) + n =3D kvm_s390_store_status_unloaded(vcpu, KVM_S390_STORE_STATUS_NOADDR= ); return r ? r : n; } =20 --=20 2.55.0 From nobody Mon Sep 28 23:55:25 2026 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3599B484228; Fri, 14 Aug 2026 16:34:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786725247; cv=none; b=P3/KEiofU2sLQFqJmqToor/e4gueeKIaD/OcvSeYJBVOZwtt7FP1Fw4ac8Vd6h8tcJ5PhykveNGIV3r9VfBUzaZFEy5+aNmIJRTg28bz1G4WEMR6pkl7/If2vuCDWCLdFLMZX1VTgZJ6BFeDC8cjixGF217hxVP2C/CuGwuLYrA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786725247; c=relaxed/simple; bh=rjnRnqoVdjqF4JjoCvUaU7aiy/7n+xW04Er34YCbioo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lH+Tfetk+RR/bXLEUcaXLD6+lK+fp9/uBDUp8IFHGj7qaV/ian/iI18DhfuMxF75sURQ3mbDqIzxD05PbryxKnSPukdAC98zXsVmkRLUbjml16JBRWqs3lagULy+dvkkiWSoAVbr0+WBTxKIdr4MJfFPicGUkcNpJ/GTXIZqDEc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=mBqAlmGZ; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="mBqAlmGZ" Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67EE5mei1343022; Fri, 14 Aug 2026 16:34:04 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=uJ6V15LHEbNe5+Ebz gUP1pHpHpvtkaSOKvq+eoKtIb4=; b=mBqAlmGZYGzu9G6xXDs6Eu9jTyf+PWe6S vmZ5l6/8jaBuh15xpDvByK1PoHUN8kdL9a19o6wcVmP2flyV59AdZ2t0/M3vEWHi hBDbU4H8dv1OyGoNoLvmHjovMQ70+GP/XroxXpWspcHT6NCxHOQ7anY+yZ6XFHwG 4X3rMMneoJZOoKc8Zq+q5ZxzamN+5P/bNg/QBd45VUfX3hEAxvvDynvcoigh7TQp vgB7H7y+CCBDpLBF889wF4kY7UNlYBge74Y1nGaJGR53xpBsHlgEsvbNvF6vRVvI YCzgag1N/MVVQygLtSOOL5XznY+FNdiYz6o9iVK76SsjH3OBCL3gQ== Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4fwvma5tb2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 14 Aug 2026 16:34:03 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 67EGQSlh016756; Fri, 14 Aug 2026 16:34:03 GMT Received: from smtprelay04.fra02v.mail.ibm.com ([9.218.2.228]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4fxesqg71u-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 14 Aug 2026 16:34:02 +0000 (GMT) Received: from smtpav03.fra02v.mail.ibm.com (smtpav03.fra02v.mail.ibm.com [10.20.54.102]) by smtprelay04.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 67EGXvMw23200366 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 14 Aug 2026 16:33:57 GMT Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1BF9420040; Fri, 14 Aug 2026 16:33:57 +0000 (GMT) Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id EB5342004B; Fri, 14 Aug 2026 16:33:56 +0000 (GMT) Received: from p-imbrenda.ehn-de.ibm.com (unknown [9.224.75.30]) by smtpav03.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 14 Aug 2026 16:33:56 +0000 (GMT) From: Claudio Imbrenda To: linux-kernel@vger.kernel.org Cc: kvm@vger.kernel.org, linux-s390@vger.kernel.org, borntraeger@de.ibm.com, frankja@linux.ibm.com, david@kernel.org, seiden@linux.ibm.com, nrb@linux.ibm.com, schlameuss@linux.ibm.com, gra@linux.ibm.com Subject: [PATCH v2 6/6] KVM: s390: Fix potential races in dat skey functions Date: Fri, 14 Aug 2026 18:33:55 +0200 Message-ID: <20260814163355.227191-7-imbrenda@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260814163355.227191-1-imbrenda@linux.ibm.com> References: <20260814163355.227191-1-imbrenda@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODE0MDEyNiBTYWx0ZWRfXxL92De1rqMGZ 7sdGALrJNKETCECN5G5OWwJAygdcdzyIHGUwkgclti7KKkxEoJOgUEuKRXYT486/c+DpjK0mZqw uzUuLToPWITXGn3403MoPac7bc58+PrSPbxL4N5iP85U3bO90uzJO297kEbP8MNHbK/lJVxJ8U3 roeBWmcrtv3KxyJ65ItsAp13R/OJFYEAkCgFgbp3ZsZOg7rZ1MaVBnrM822g1wGphIgHsxsNdN1 jCJSgPZrYd8LJeeDX7NVr/vchy+CHsuNSqNTDeGlPj7g5yzwDwqqKdr59VBMrXy8KmV3KsPmtWW ck+MPYJu4G7vodeq+mGHVN1fQicHBMYSEV3rYBDmbPCU9OfamWXWH+ZXWznNRtHmQ1X7whlGkqB 2Q3j2wGIwRSlAPIRte1ThwNhkVoFkd+M8CrgRf5xKL9cxE9D1TU/7k+0Xfjbe1frR+xin62MW+P 22qyZeRPvfq51UpWUbA== X-Proofpoint-ORIG-GUID: bTuf-HnmT8aM9nkiVVl4MnnuQHSfopEc X-Proofpoint-Spam-Info: AW1haW4tMjYwODE0MDEyNiBTYWx0ZWRfX8HlPFrKz3HhC u9vh8EEQb88bBGO+vQC0yi2dA93RDPYUkemrJP/F41BS5aldgY7qt716R/AbhIrd3cxAX/w4FIv zBz8VIDB/jEz/dKJuHHPrP1gBYyDhUA= X-Authority-Analysis: v=2.4 cv=IfK3n2qa c=1 sm=1 tr=0 ts=6a7f437b cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=Sv0fKeRqtYgA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VnNF1IyMAAAA:8 a=wCyL4Wiu_ChfG3is39wA:9 X-Proofpoint-GUID: bTuf-HnmT8aM9nkiVVl4MnnuQHSfopEc X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-14_05,2026-08-12_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 priorityscore=1501 impostorscore=0 bulkscore=0 clxscore=1015 lowpriorityscore=0 adultscore=0 malwarescore=0 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608140126 Content-Type: text/plain; charset="utf-8" When dat_cond_set_storage_key() finds a large page, it will conditionally set the storage key in absolute memory using large_crste_to_phys() to get the absolute address. There is a race window between dat_entry_walk() and large_crste_to_phys(): the large page could have been split concurrently, and large_crste_to_phys() might be called with a crste that does not designate a large page, leading to crashes. Similar issues were also present in dat_set_storage_key(). dat_get_storage_key() and dat_reset_reference_bit() did instead check for a potential concurrent splitting of the large page, but then handled it incorrectly. Fix by performing a READ_ONCE on the crste pointer, checking and using the result, instead of dereferencing the pointer again. In case a race is detacted, try dat_entry_walk() again. Fixes: 8e03e8316eb2 ("KVM: s390: KVM page table management functions: stora= ge keys") Signed-off-by: Claudio Imbrenda --- arch/s390/kvm/dat.c | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/arch/s390/kvm/dat.c b/arch/s390/kvm/dat.c index 7e5dd5a1eb1e..b4c318ebd91e 100644 --- a/arch/s390/kvm/dat.c +++ b/arch/s390/kvm/dat.c @@ -620,17 +620,20 @@ int dat_get_storage_key(union asce asce, gfn_t gfn, u= nion skey *skey) union pte *ptep; int rc; =20 +again: skey->skey =3D 0; rc =3D dat_entry_walk(NULL, gfn, asce, DAT_WALK_ANY, TABLE_TYPE_PAGE_TABL= E, &crstep, &ptep); if (rc) return rc; =20 if (!ptep) { - union crste crste; + union crste crste =3D READ_ONCE(*crstep); =20 - crste =3D READ_ONCE(*crstep); - if (!crste.h.fc || !crste.s.fc1.pr) + if (!crste_leaf(crste)) + goto again; + if (!crste.s.fc1.pr) return 0; + skey->skey =3D page_get_storage_key(large_crste_to_phys(crste, gfn)); return 0; } @@ -661,13 +664,20 @@ int dat_set_storage_key(struct kvm_s390_mmu_cache *mc= , union asce asce, gfn_t gf union pte *ptep; int rc; =20 +again: rc =3D dat_entry_walk(mc, gfn, asce, DAT_WALK_LEAF_ALLOC, TABLE_TYPE_PAGE= _TABLE, &crstep, &ptep); if (rc) return rc; =20 if (!ptep) { - page_set_storage_key(large_crste_to_phys(*crstep, gfn), skey.skey, !nq); + union crste crste =3D READ_ONCE(*crstep); + + /* A large page has been split concurrently, try again */ + if (!crste_leaf(crste)) + goto again; + + page_set_storage_key(large_crste_to_phys(crste, gfn), skey.skey, !nq); return 0; } =20 @@ -717,15 +727,22 @@ int dat_cond_set_storage_key(struct kvm_s390_mmu_cach= e *mmc, union asce asce, gf union pte *ptep; int rc; =20 +again: rc =3D dat_entry_walk(mmc, gfn, asce, DAT_WALK_LEAF_ALLOC, TABLE_TYPE_PAG= E_TABLE, &crstep, &ptep); if (rc) return rc; =20 if (!ptep) { + union crste crste =3D READ_ONCE(*crstep); + + /* A large page has been split concurrently, try again */ + if (!crste_leaf(crste)) + goto again; if (!oldkey) oldkey =3D &prev; - return page_cond_set_storage_key(large_crste_to_phys(*crstep, gfn), skey= , oldkey, + + return page_cond_set_storage_key(large_crste_to_phys(crste, gfn), skey, = oldkey, nq, mr, mc); } =20 @@ -767,7 +784,7 @@ int dat_reset_reference_bit(union asce asce, gfn_t gfn,= union skey *skey) int rc; =20 skey->skey =3D 0; - +again: rc =3D dat_entry_walk(NULL, gfn, asce, DAT_WALK_ANY, TABLE_TYPE_PAGE_TABL= E, &crstep, &ptep); if (rc) return rc; @@ -775,9 +792,12 @@ int dat_reset_reference_bit(union asce asce, gfn_t gfn= , union skey *skey) if (!ptep) { union crste crste =3D READ_ONCE(*crstep); =20 - if (!crste.h.fc || !crste.s.fc1.pr) + /* A large page has been split concurrently, try again */ + if (!crste_leaf(crste)) + goto again; + if (!crste.s.fc1.pr) return 0; - skey->skey =3D page_reset_referenced(large_crste_to_phys(*crstep, gfn)) = << 1; + skey->skey =3D page_reset_referenced(large_crste_to_phys(crste, gfn)) <<= 1; return 0; } old =3D pgste_get_lock(ptep); --=20 2.55.0