From nobody Sun Jun 14 07:36:20 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 AE5CD396B7F; Fri, 12 Jun 2026 18:10:59 +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=1781287861; cv=none; b=ni1HR3883gZEmed4hRfEp7gA14ynZjdepO21Nv8wdHRwICb2JjiOqascZXQkFMxT0Q5WwwjQeyqYUVxaK1yX1OOl1hxdmEMsUz0BR9tEbZI/eAtnK3WBdBGK+6Xk1OXRwbxo+37ekMPtV2uXfjoY0bQw3bqswBbjJj+j8aVfdyY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781287861; c=relaxed/simple; bh=MNFffotkc3sbM9n5Wo6cfZhCXqNaLzI/23NNBH/KLM0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=odOPAVbt1gy1ocvgpbYO7FNZT04IShBoYLAIRmIAJwzeGZbhLd8/9YFf8ZsxnbN0cWV73aMfmRQQBHpg5PUUqQ88qZclDvIk0JlX+HTPmsp+a5U/Bmc5xvkduFY0aczgNpyC8PpxPl5wfRnNnQ+D4YO688wvJwGlax5V13XXNuw= 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=CcrTQRhy; 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="CcrTQRhy" 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 65CFKW0u3872896; Fri, 12 Jun 2026 18:10:56 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=cGWDYzD7sk2qYfWo8 Y1/9AftxDK7t1eHT6ZHFONArtw=; b=CcrTQRhy6shGCaKPvXGA/ptRddTtHo95Z F+Kycak/8H18KUiMBv9YZ9GfKXnS+VbiORE6yz02UrP4dpuHtsaeybbo67FF3MAo AXsyIOeKJJMYKBoLDcIwYAoL/S2IDeDQeNACqJrXZpEvuu3bwjU6OFbF8SOZx4QO I6p2upewWhVR0rp13qG/GLxAgqQBug8v+HMEHskVFS6SHQghatdXl2UGHi16qzQ7 PAWZnEdjSRATsAwbD2OL5Sc55/zq4s3/4+Y2BFbnq3dFOsmzJ8jQDO8CCPOMeZcZ eLzEnzvfQtkAz2dXmlW3it8DUjaGWId1ys6RxyP+5qFiI1Aa1MWUg== 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 4eqe8f2cpd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 12 Jun 2026 18:10:56 +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 65CI4Y5X016363; Fri, 12 Jun 2026 18:10:55 GMT Received: from smtprelay07.wdc07v.mail.ibm.com ([172.16.1.74]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4eqe09s2hy-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 12 Jun 2026 18:10:55 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (smtpav04.dal12v.mail.ibm.com [10.241.53.103]) by smtprelay07.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 65CIAqGC25952936 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 12 Jun 2026 18:10:52 GMT Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id EE40F58052; Fri, 12 Jun 2026 18:10:51 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id CD8805805A; Fri, 12 Jun 2026 18:10:50 +0000 (GMT) Received: from Mac.ibm.com (unknown [9.61.255.20]) by smtpav04.dal12v.mail.ibm.com (Postfix) with ESMTP; Fri, 12 Jun 2026 18:10:50 +0000 (GMT) From: Omar Elghoul To: linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: oelghoul@linux.ibm.com, hca@linux.ibm.com, gor@linux.ibm.com, agordeev@linux.ibm.com, borntraeger@linux.ibm.com, svens@linux.ibm.com, schnelle@linux.ibm.com, mjrosato@linux.ibm.com, alifm@linux.ibm.com, farman@linux.ibm.com, gbayer@linux.ibm.com, alex@shazbot.org, stable@vger.kernel.org Subject: [PATCH v4 1/4] s390/pci: Hold fmb_lock when enabling or disabling PCI devices Date: Fri, 12 Jun 2026 14:10:45 -0400 Message-ID: <20260612181048.91548-2-oelghoul@linux.ibm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260612181048.91548-1-oelghoul@linux.ibm.com> References: <20260612181048.91548-1-oelghoul@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: AW1haW4tMjYwNjEyMDE2OSBTYWx0ZWRfX1Nw0ETzbzYWi 1rNHTweYvLcVOqCW1mmmtSaOenUUoBc6ybv8GAnFyXHaswiw/n1s6x8b9hnUOG/51Z2Ld+UN3mp 5OJl3XM5Ae77KP8sW9Snx04zXXxWTfiWK5zpBgJytVKOdsMuK2ojTQsdBb086jStVTcSoc3V7xF XAioE8AgapJ5aBMX+ZFppdLC16XX8jYgARuR+zProjNAhfQaVvGwFJfPMPAu/qTKQ73UyGzz/y+ ooHlpcAa45FueIpkFsnWuuSQra8xDdo1zBjezQe0vbF1Wo2LZ2MPSmVBtmfFRXbSqVGs3boprS1 PYiSUzdyRHQ2RLHRXNwTVvZT/OO0uoumL9TGAtjVpaLamGNE1670yIBRU2z1bO4BAUn1dIhG/lO bp3JGofgkDZFbag9KntPMvvKIdO8CMtD2u3zlZOfFR4tj8bsa45JoKoHFNW3pKfi7vDrmBBLLl6 93Wk5osjGbcIqfL5PAQ== X-Authority-Analysis: v=2.4 cv=dr7rzVg4 c=1 sm=1 tr=0 ts=6a2c4bb0 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=FelO9ux0wxsA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=5NbLduwtq9nBFWGw9KEA:9 X-Proofpoint-ORIG-GUID: 3uppq2iq8Ear7LSsHeAe1AfEfmO7DKoK X-Proofpoint-GUID: 3uppq2iq8Ear7LSsHeAe1AfEfmO7DKoK X-Proofpoint-Spam-Info: AW1haW4tMjYwNjEyMDE2OSBTYWx0ZWRfX7ZP/MnTOB8HX 1ERIt6CMLpyGuja0wiEjjTLU3z5uDsvLpOyVhvPRLri0msepn38r4LXwYtfothJpldRMJRI0EDT mBTLV3rYe0mqjbUJXvRnYVmo+y72Xas= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.125,FMLib:17.12.100.49 definitions=2026-06-12_02,2026-06-12_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 adultscore=0 suspectscore=0 priorityscore=1501 phishscore=0 clxscore=1015 bulkscore=0 impostorscore=0 lowpriorityscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606040000 definitions=main-2606120169 Content-Type: text/plain; charset="utf-8" Ensure that fmb_lock is held by pcibios_enable_device() and pcibios_disable_device() when calling zpci_fmb_enable_device() or zpci_fmb_disable_device(), respectively. Additionally, assert that the fmb_lock is held within the latter two functions to prevent future race conditions regarding new callers. Fixes: af0a8a8453f7 ("s390/pci: implement pcibios_add_device") Fixes: 944239c59e93 ("s390/pci: implement pcibios_release_device") Cc: stable@vger.kernel.org Signed-off-by: Omar Elghoul Reviewed-by: Niklas Schnelle --- arch/s390/pci/pci.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c index 39bd2adfc240..2910d4038d39 100644 --- a/arch/s390/pci/pci.c +++ b/arch/s390/pci/pci.c @@ -173,6 +173,8 @@ int zpci_fmb_enable_device(struct zpci_dev *zdev) unsigned long flags; u8 cc, status; =20 + lockdep_assert_held(&zdev->fmb_lock); + if (zdev->fmb || sizeof(*zdev->fmb) < zdev->fmb_length) return -EINVAL; =20 @@ -211,6 +213,8 @@ int zpci_fmb_disable_device(struct zpci_dev *zdev) struct zpci_fib fib =3D {0}; u8 cc, status; =20 + lockdep_assert_held(&zdev->fmb_lock); + if (!zdev->fmb) return -EINVAL; =20 @@ -639,7 +643,9 @@ int pcibios_enable_device(struct pci_dev *pdev, int mas= k) struct zpci_dev *zdev =3D to_zpci(pdev); =20 zpci_debug_init_device(zdev, dev_name(&pdev->dev)); + mutex_lock(&zdev->fmb_lock); zpci_fmb_enable_device(zdev); + mutex_unlock(&zdev->fmb_lock); =20 return pci_enable_resources(pdev, mask); } @@ -648,7 +654,9 @@ void pcibios_disable_device(struct pci_dev *pdev) { struct zpci_dev *zdev =3D to_zpci(pdev); =20 + mutex_lock(&zdev->fmb_lock); zpci_fmb_disable_device(zdev); + mutex_unlock(&zdev->fmb_lock); zpci_debug_exit_device(zdev); } =20 --=20 2.54.0 From nobody Sun Jun 14 07:36:20 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 6ACB940910D; Fri, 12 Jun 2026 18:11:01 +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=1781287863; cv=none; b=tXUq09yA2N2vqplO53ez9RqjJYvWNVnILPDJzOqdpVYSufpKYjISU0/duD36+djGsvzvFaxAxynlZV62QD+YHDuICMhFksL3epTKSbZ7mrHgQCxDVcGh2CEa55Gxn84mVB/nCCog8YgAyA+gw85dDasuB0mnQp/BjoDBqr9CbWw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781287863; c=relaxed/simple; bh=nCzsf4HCvxPIXR4SDdRlORe690fVrB8ZyyoHkWb+b2s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=d+p8GcXGrc+LdrXFEEiVGmvvwKhjaSs8bPED3rbzd69PZppHbnC9Zz7eX0rDVDdN9/OOgQGiKYTk8HHrsS8q7y4+m250VWagg/Kniy5XJ+XjDg7GFJBSf+lFX24ZDvFqncNoOyDzonYvzga++xNiWZqopBHR2CeFHfSDGKwHK6o= 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=Rt+Wx4qb; 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="Rt+Wx4qb" 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 65CEr3OV722245; Fri, 12 Jun 2026 18:10:58 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=BOVt7cVWDsBa/Xm42 9cRp4lmqG376b/vLrNSA+l1aFE=; b=Rt+Wx4qbd/eT5Pnq/VBltmFEsL4FsTioK bEdYwaxDXGc97uKCvVEQTKu6SQsnaL2iUJk6rmLTSH9/qlVPFJ4PU/YO6Msksfa6 pg4KCK/XgrDznEFXgGA8Il69XKcyJGx5fa5JR6Kdo0mimoRkZJegOtvRaxfMUqQj vEeGZvJBN1m8Za2DmfM4FKolKcq+egPFqWIsjhF8xDzAt1IcMJ176072Qc6Yovsp +GWDv5Zo8W+6APOOeQORSkB5ypnYE3k+h7QAsqnZCQI/qjGE/FPkMfJldyv9zqOv UhT5UfQOc3rcqrniM7wYiH0ftz7j5GFl59wQm9eI9pdG6DpaaaB+Q== Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4eqe8dje37-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 12 Jun 2026 18:10:58 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 65CI4dPP020517; Fri, 12 Jun 2026 18:10:57 GMT Received: from smtprelay05.dal12v.mail.ibm.com ([172.16.1.7]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4eqe08s22n-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 12 Jun 2026 18:10:57 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (smtpav04.dal12v.mail.ibm.com [10.241.53.103]) by smtprelay05.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 65CIAr3t29819602 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 12 Jun 2026 18:10:53 GMT Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 249EE58052; Fri, 12 Jun 2026 18:10:53 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 15F8458056; Fri, 12 Jun 2026 18:10:52 +0000 (GMT) Received: from Mac.ibm.com (unknown [9.61.255.20]) by smtpav04.dal12v.mail.ibm.com (Postfix) with ESMTP; Fri, 12 Jun 2026 18:10:51 +0000 (GMT) From: Omar Elghoul To: linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: oelghoul@linux.ibm.com, hca@linux.ibm.com, gor@linux.ibm.com, agordeev@linux.ibm.com, borntraeger@linux.ibm.com, svens@linux.ibm.com, schnelle@linux.ibm.com, mjrosato@linux.ibm.com, alifm@linux.ibm.com, farman@linux.ibm.com, gbayer@linux.ibm.com, alex@shazbot.org Subject: [PATCH v4 2/4] s390/pci: Preserve FMB state in device re-enablement Date: Fri, 12 Jun 2026 14:10:46 -0400 Message-ID: <20260612181048.91548-3-oelghoul@linux.ibm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260612181048.91548-1-oelghoul@linux.ibm.com> References: <20260612181048.91548-1-oelghoul@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-Info: AW1haW4tMjYwNjEyMDE2OSBTYWx0ZWRfX5CBf3BXRz00A aiGWWmrIQo+zuAwlup0MzcsqwkEEaZ12H0Nvfv+5Yr9x5wDeedepzfatQA1ESl+CBuQUP5EK6QZ YJJ1uVzkKVS3PJ70KauuRM4t96cxvv0= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNjEyMDE2OSBTYWx0ZWRfXzDEQav1bO42Y ZyYDcoumRtsySOdmu2e0Yt9/0z8dAM5mXyY3Fga03E+3a/853GF9T669+y4FNq8RPnN97OlsuEu buUyoHr31Za1Igwe9hWTKRdgmtnuHn+5RleiC5Nz7DDzgfU2SakwO6DBU7c6NIGUFf2Kxod6zbW ICD+l42FzzzivjAbF19s+tPgcXT1TYV/Dzu4yLEkiLDredAIH/EEEahQkfohNGon0RFe3nARH3i 1Lwj59VfamYj8gSIxac8KDjKLHS1CmR9sF1ZP2H1fqvDRFAVzRmPfGvZYHV9WWbyDao4GoPclL4 N2gOIv6POTa6+cvAZaFd0CsMe/qnbkqVQ6ouaSE1PJZ/frhEvgrt5oDCFW24VWRHx80eotBoNYJ 49L8S2KOr9F88/EfbhRZXyUbfnQhZFvi2293sP5Efzsa1mZMwgRT+s8bOTlpBU6DxjLGI36To0K yOdg9He3/m+HHqZgAvw== X-Proofpoint-ORIG-GUID: 8quAazH_9QieQvyfyx9IPRzzjx0o0wFp X-Authority-Analysis: v=2.4 cv=GIM41ONK c=1 sm=1 tr=0 ts=6a2c4bb2 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=FelO9ux0wxsA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VnNF1IyMAAAA:8 a=6Vtv6p8LYkiH6MEZsLwA:9 X-Proofpoint-GUID: 8quAazH_9QieQvyfyx9IPRzzjx0o0wFp X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.125,FMLib:17.12.100.49 definitions=2026-06-12_02,2026-06-12_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 suspectscore=0 impostorscore=0 spamscore=0 phishscore=0 adultscore=0 lowpriorityscore=0 bulkscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606040000 definitions=main-2606120169 Content-Type: text/plain; charset="utf-8" Introduce a function zpci_fmb_reenable_device() that checks for the state of the FMB and reuses the same buffer where appropriate. If the FMB was not previously enabled, enable it for the device. Call this function during a zPCI device re-enablement, which in turn implicitly ensures that the FMB is is enabled for host devices during their KVM registration. Besides re-enabling the FMB itself in zpci_fmb_reenable_device() also clear out the software counters, such that a program resetting an FMB sees all counters start from zero as expected. Separate this clearing of software counters out into zpci_fmb_clear_iommu_ctrs() and reuse it in zpci_fmb_enable_device() and zpci_fmb_reenable_device(). Likewise separate the FMB enable logic into zpci_fmb_do_enable() to be reused in the same two functions. Signed-off-by: Omar Elghoul --- arch/s390/include/asm/pci.h | 1 + arch/s390/pci/pci.c | 95 +++++++++++++++++++++++++++++-------- 2 files changed, 77 insertions(+), 19 deletions(-) diff --git a/arch/s390/include/asm/pci.h b/arch/s390/include/asm/pci.h index 5dcf35f0f325..65014e52d559 100644 --- a/arch/s390/include/asm/pci.h +++ b/arch/s390/include/asm/pci.h @@ -323,6 +323,7 @@ void zpci_remove_parent_msi_domain(struct zpci_bus *zbu= s); /* FMB */ int zpci_fmb_enable_device(struct zpci_dev *); int zpci_fmb_disable_device(struct zpci_dev *); +int zpci_fmb_reenable_device(struct zpci_dev *zdev); =20 /* Debug */ int zpci_debug_init(void); diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c index 2910d4038d39..21d3fccac789 100644 --- a/arch/s390/pci/pci.c +++ b/arch/s390/pci/pci.c @@ -164,24 +164,10 @@ int zpci_unregister_ioat(struct zpci_dev *zdev, u8 dm= aas) return cc; } =20 -/* Modify PCI: Set PCI function measurement parameters */ -int zpci_fmb_enable_device(struct zpci_dev *zdev) +static void zpci_fmb_clear_iommu_ctrs(struct zpci_dev *zdev) { - u64 req =3D ZPCI_CREATE_REQ(zdev->fh, 0, ZPCI_MOD_FC_SET_MEASURE); struct zpci_iommu_ctrs *ctrs; - struct zpci_fib fib =3D {0}; - unsigned long flags; - u8 cc, status; - - lockdep_assert_held(&zdev->fmb_lock); - - if (zdev->fmb || sizeof(*zdev->fmb) < zdev->fmb_length) - return -EINVAL; - - zdev->fmb =3D kmem_cache_zalloc(zdev_fmb_cache, GFP_KERNEL); - if (!zdev->fmb) - return -ENOMEM; - WARN_ON((u64) zdev->fmb & 0xf); + unsigned long flags =3D 0; =20 /* reset software counters */ spin_lock_irqsave(&zdev->dom_lock, flags); @@ -194,17 +180,49 @@ int zpci_fmb_enable_device(struct zpci_dev *zdev) atomic64_set(&ctrs->sync_rpcits, 0); } spin_unlock_irqrestore(&zdev->dom_lock, flags); +} =20 +static int zpci_fmb_do_enable(struct zpci_dev *zdev) +{ + /* This helper assumes that zdev->fmb is already allocated and thus only + * takes care of the actual enablement. + */ + u64 req =3D ZPCI_CREATE_REQ(zdev->fh, 0, ZPCI_MOD_FC_SET_MEASURE); + struct zpci_fib fib =3D {0}; + u8 cc, status; =20 fib.fmb_addr =3D virt_to_phys(zdev->fmb); fib.gd =3D zdev->gisa; cc =3D zpci_mod_fc(req, &fib, &status); - if (cc) { + + return cc ? -EIO : 0; +} + +/* Modify PCI: Set PCI function measurement parameters */ +int zpci_fmb_enable_device(struct zpci_dev *zdev) +{ + int rc; + + lockdep_assert_held(&zdev->fmb_lock); + + if (zdev->fmb || sizeof(*zdev->fmb) < zdev->fmb_length) + return -EINVAL; + + zdev->fmb =3D kmem_cache_zalloc(zdev_fmb_cache, GFP_KERNEL); + if (!zdev->fmb) + return -ENOMEM; + WARN_ON((u64) zdev->fmb & 0xf); + + zpci_fmb_clear_iommu_ctrs(zdev); + + rc =3D zpci_fmb_do_enable(zdev); + if (rc) { kmem_cache_free(zdev_fmb_cache, zdev->fmb); zdev->fmb =3D NULL; } - return cc ? -EIO : 0; + return rc; } +EXPORT_SYMBOL_GPL(zpci_fmb_enable_device); =20 /* Modify PCI: Disable PCI function measurement */ int zpci_fmb_disable_device(struct zpci_dev *zdev) @@ -231,6 +249,41 @@ int zpci_fmb_disable_device(struct zpci_dev *zdev) } return cc ? -EIO : 0; } +EXPORT_SYMBOL_GPL(zpci_fmb_disable_device); + +int zpci_fmb_reenable_device(struct zpci_dev *zdev) +{ + u64 req =3D ZPCI_CREATE_REQ(zdev->fh, 0, ZPCI_MOD_FC_SET_MEASURE); + struct zpci_fib fib =3D {0}; + u8 cc, status; + int rc; + + lockdep_assert_held(&zdev->fmb_lock); + + if (!zdev->fmb) + return zpci_fmb_enable_device(zdev); + + fib.gd =3D zdev->gisa; + cc =3D zpci_mod_fc(req, &fib, &status); /* Disable function measurement */ + + /* Unlike in zpci_fmb_disable_device(), cc =3D=3D 3 is not a valid state = here + * because we are re-enabling function measurement for the same function + * handle. + */ + if (cc) + return -EIO; + + zpci_fmb_clear_iommu_ctrs(zdev); + + rc =3D zpci_fmb_do_enable(zdev); + if (rc) { + kmem_cache_free(zdev_fmb_cache, zdev->fmb); + zdev->fmb =3D NULL; + } + + return rc; +} +EXPORT_SYMBOL_GPL(zpci_fmb_reenable_device); =20 static int zpci_cfg_load(struct zpci_dev *zdev, int offset, u32 *val, u8 l= en) { @@ -737,9 +790,13 @@ int zpci_reenable_device(struct zpci_dev *zdev) } =20 rc =3D zpci_iommu_register_ioat(zdev, &status); - if (rc) + if (rc) { zpci_disable_device(zdev); + return rc; + } =20 + guard(mutex)(&zdev->fmb_lock); + zpci_fmb_reenable_device(zdev); return rc; } EXPORT_SYMBOL_GPL(zpci_reenable_device); --=20 2.54.0 From nobody Sun Jun 14 07:36:20 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 2EAD7408635; Fri, 12 Jun 2026 18:10:59 +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=1781287862; cv=none; b=qaWuhbsa/qdX4a5SlqSbqDjtUnw0SpUFP5zxgxaJS84WyLVIL9XNmZW2b5uCKymnoDmruL1ig2hL1tqgFJGJ9GvIzhWaW1WsdNdCR12Ct3Niwhq6732NYnjEjpzEKpo8lmE9XGBqIoEbly9tMEHjk/Gagu0mKMESXuUV1HYDHZQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781287862; c=relaxed/simple; bh=X7JoI+UTOag6Fvenxb27uYoaUdR1ZVKZkca26MhzwJg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JheINsRJaueFiIznJ8ZgiLGF2YVgJh8vslGFNleEABfDEvsOz2nBKcfKnmi4srxAo1OpBMxGJPB/gZeXw4EMGTKu4sppQrO2n+fU26GpQtMo0FUo91ax0k+FUk5QHwiVpXndVYKQI+f4UkmJNqudaI7IEnH0K4Ky2mu47QnR404= 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=aa4Sr2KR; 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="aa4Sr2KR" Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 65CFCEbO1742531; Fri, 12 Jun 2026 18:10:57 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=7gM9eIB7jVJSrqa/i GDI7rSFFyVZ2GXsY/V4LWEaiNw=; b=aa4Sr2KRPHjD91yXVMKi4Hv6E8Bh/6PtO kY2Dx56Nug93ZgCf3Cc6RNg+UKLvi6rT/675KArw+kYLN9vNBcVGIg74bEJeLw/j nZCKbmUEAd/cAmNRccIxv/K1Hi0V1D5xeB3Q1dqPyF0xi0pvXZBy2q+1UW8XdFPB NNCS5L44iMHkyTdtqMcmQlIXIOez9sxmabr5Hhi3XyloPLLXlBDyXC8P3jNA7Pys rLbIxT6WM9aqvnL/Ex1cnEOsw4valZgMmNV/X6K37VkbCVmwSOcy1mDe2AwEm4vz 4GvyPLxdL31/Tfgvtqeo2t8d4LWuwypZjDOvSZ/oWuUdc7wGY868g== 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 4eqe8bswdk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 12 Jun 2026 18:10:57 +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 65CI4dnm016406; Fri, 12 Jun 2026 18:10:56 GMT Received: from smtprelay06.dal12v.mail.ibm.com ([172.16.1.8]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4eqe09s2j2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 12 Jun 2026 18:10:56 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (smtpav04.dal12v.mail.ibm.com [10.241.53.103]) by smtprelay06.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 65CIAsOF28705426 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 12 Jun 2026 18:10:54 GMT Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 559F85805E; Fri, 12 Jun 2026 18:10:54 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 427595805A; Fri, 12 Jun 2026 18:10:53 +0000 (GMT) Received: from Mac.ibm.com (unknown [9.61.255.20]) by smtpav04.dal12v.mail.ibm.com (Postfix) with ESMTP; Fri, 12 Jun 2026 18:10:53 +0000 (GMT) From: Omar Elghoul To: linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: oelghoul@linux.ibm.com, hca@linux.ibm.com, gor@linux.ibm.com, agordeev@linux.ibm.com, borntraeger@linux.ibm.com, svens@linux.ibm.com, schnelle@linux.ibm.com, mjrosato@linux.ibm.com, alifm@linux.ibm.com, farman@linux.ibm.com, gbayer@linux.ibm.com, alex@shazbot.org Subject: [PATCH v4 3/4] vfio-pci/zdev: Add VFIO FMB device features Date: Fri, 12 Jun 2026 14:10:47 -0400 Message-ID: <20260612181048.91548-4-oelghoul@linux.ibm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260612181048.91548-1-oelghoul@linux.ibm.com> References: <20260612181048.91548-1-oelghoul@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=Xfa5Co55 c=1 sm=1 tr=0 ts=6a2c4bb1 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=FelO9ux0wxsA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VnNF1IyMAAAA:8 a=o7ZLYlnJ96k-dGTR9YsA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNjEyMDE2OSBTYWx0ZWRfX8m758jtOcptt r8eXxp16RTiqokRJFzHj3X3tdXgIrX45zRDvqa08Chd/Ddi4IYVgGiPwWxNt0M804XiX0SIrYV6 0MDE8DnJepEjZZbqstWXXTASAH+Oub3WqgMWqn4149f2IyxHuOmPzE1hnRHRVgyS2UjyS3O/geI oyZtiFaPH5EiW+qgQGBGyWKXL1DMqM+vyYdNHZOp+JaXbwnJOtVLHJt0pxdJSMiusRAaunNyi8b w8yuXlV/d/ohOLKV69QO4hwaCZzbq3Guh5QboRKQjIUpomEQyuG5AgM024qsU9JnX1BemvN+D89 i2gYcz+n+EqgsTB6Z69gEkI366SjgdK/UIM4qXbgCkcxqZrUqOnlWgkcqSqMHy1AyTzHWU2VLqn QaD1W2UWw1lZ+fihrq5S/Supe5RO5IdQnAyJ0UW0db0agxmrm7upj1En0X40D44UHeC6JSJzJbe ssVnFK8WIfHON/YQ1xQ== X-Proofpoint-Spam-Info: AW1haW4tMjYwNjEyMDE2OSBTYWx0ZWRfX80ihRQcuU1rj HEfcozQkmBc7exzB1iHE66APL4KyTMXLfsm1800VAtXjAfRCZHu32rzW8Wj+fK6fnAZDQMLNX2p QsiD1+i3j/pUyI660d5qBRuW5okvHWI= X-Proofpoint-ORIG-GUID: g9HyAMrEZ0Ws53mKqkBjPxRKL_cLdxTA X-Proofpoint-GUID: g9HyAMrEZ0Ws53mKqkBjPxRKL_cLdxTA X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.125,FMLib:17.12.100.49 definitions=2026-06-12_02,2026-06-12_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 spamscore=0 bulkscore=0 priorityscore=1501 lowpriorityscore=0 impostorscore=0 suspectscore=0 clxscore=1015 phishscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606040000 definitions=main-2606120169 Content-Type: text/plain; charset="utf-8" Introduce new VFIO features for zPCI devices to provide FMB passthrough to userspace. Allow the user to enable or disable the FMB using the SET-only feature VFIO_DEVICE_FEATURE_ZPCI_FMB_ENABLE. Likewise allow the user to read the latest FMB using the GET-only feature VFIO_DEVICE_FEATURE_ZPCI_FMB_READ in the case where the FMB is enabled. Additionally, when initializing the FMB kmem_cache, allow copy to userspace within the FMB's structure range. Signed-off-by: Omar Elghoul --- arch/s390/pci/pci.c | 8 ++++- drivers/vfio/pci/vfio_pci_core.c | 4 +++ drivers/vfio/pci/vfio_pci_priv.h | 18 +++++++++++ drivers/vfio/pci/vfio_pci_zdev.c | 55 ++++++++++++++++++++++++++++++++ include/uapi/linux/vfio.h | 29 +++++++++++++++++ 5 files changed, 113 insertions(+), 1 deletion(-) diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c index 21d3fccac789..104a924f8e4b 100644 --- a/arch/s390/pci/pci.c +++ b/arch/s390/pci/pci.c @@ -1134,8 +1134,14 @@ static int zpci_mem_init(void) BUILD_BUG_ON((CONFIG_ILLEGAL_POINTER_VALUE + 0x10000 > ZPCI_IOMAP_ADDR_BA= SE) && (CONFIG_ILLEGAL_POINTER_VALUE <=3D ZPCI_IOMAP_ADDR_MAX)); =20 + struct kmem_cache_args fmb_cache_args =3D { + .align =3D __alignof__(struct zpci_fmb), + .useroffset =3D 0, + .usersize =3D sizeof(struct zpci_fmb) + }; + zdev_fmb_cache =3D kmem_cache_create("PCI_FMB_cache", sizeof(struct zpci_= fmb), - __alignof__(struct zpci_fmb), 0, NULL); + &fmb_cache_args, 0); if (!zdev_fmb_cache) goto error_fmb; =20 diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_c= ore.c index 050e7542952e..44e8e5526eae 100644 --- a/drivers/vfio/pci/vfio_pci_core.c +++ b/drivers/vfio/pci/vfio_pci_core.c @@ -1569,6 +1569,10 @@ int vfio_pci_core_ioctl_feature(struct vfio_device *= device, u32 flags, return vfio_pci_core_feature_token(vdev, flags, arg, argsz); case VFIO_DEVICE_FEATURE_DMA_BUF: return vfio_pci_core_feature_dma_buf(vdev, flags, arg, argsz); + case VFIO_DEVICE_FEATURE_ZPCI_FMB_ENABLE: + return vfio_pci_zdev_feature_fmb_enable(vdev, flags, arg, argsz); + case VFIO_DEVICE_FEATURE_ZPCI_FMB_READ: + return vfio_pci_zdev_feature_fmb_read(vdev, flags, arg, argsz); default: return -ENOTTY; } diff --git a/drivers/vfio/pci/vfio_pci_priv.h b/drivers/vfio/pci/vfio_pci_p= riv.h index fca9d0dfac90..b7db064a6a95 100644 --- a/drivers/vfio/pci/vfio_pci_priv.h +++ b/drivers/vfio/pci/vfio_pci_priv.h @@ -93,6 +93,10 @@ int vfio_pci_info_zdev_add_caps(struct vfio_pci_core_dev= ice *vdev, struct vfio_info_cap *caps); int vfio_pci_zdev_open_device(struct vfio_pci_core_device *vdev); void vfio_pci_zdev_close_device(struct vfio_pci_core_device *vdev); +int vfio_pci_zdev_feature_fmb_enable(struct vfio_pci_core_device *vdev, u3= 2 flags, + void __user *arg, size_t argsz); +int vfio_pci_zdev_feature_fmb_read(struct vfio_pci_core_device *vdev, u32 = flags, + void __user *arg, size_t argsz); #else static inline int vfio_pci_info_zdev_add_caps(struct vfio_pci_core_device = *vdev, struct vfio_info_cap *caps) @@ -107,6 +111,20 @@ static inline int vfio_pci_zdev_open_device(struct vfi= o_pci_core_device *vdev) =20 static inline void vfio_pci_zdev_close_device(struct vfio_pci_core_device = *vdev) {} + +static inline int vfio_pci_zdev_feature_fmb_enable(struct vfio_pci_core_de= vice *vdev, + u32 flags, void __user *arg, + size_t argsz) +{ + return -ENOTTY; +} + +static inline int vfio_pci_zdev_feature_fmb_read(struct vfio_pci_core_devi= ce *vdev, + u32 flags, void __user *arg, + size_t argsz) +{ + return -ENOTTY; +} #endif =20 static inline bool vfio_pci_is_vga(struct pci_dev *pdev) diff --git a/drivers/vfio/pci/vfio_pci_zdev.c b/drivers/vfio/pci/vfio_pci_z= dev.c index 0990fdb146b7..ad1bcaf52ff2 100644 --- a/drivers/vfio/pci/vfio_pci_zdev.c +++ b/drivers/vfio/pci/vfio_pci_zdev.c @@ -167,3 +167,58 @@ void vfio_pci_zdev_close_device(struct vfio_pci_core_d= evice *vdev) if (zpci_kvm_hook.kvm_unregister) zpci_kvm_hook.kvm_unregister(zdev); } + +int vfio_pci_zdev_feature_fmb_enable(struct vfio_pci_core_device *vdev, u3= 2 flags, + void __user *arg, size_t argsz) +{ + struct zpci_dev *zdev; + struct vfio_device_feature_zpci_fmb_enable fmb_enable; + int ret; + + ret =3D vfio_check_feature(flags, argsz, VFIO_DEVICE_FEATURE_SET, sizeof(= fmb_enable)); + if (ret !=3D 1) + return ret; + + zdev =3D to_zpci(vdev->pdev); + if (!zdev) + return -ENODEV; + + if (copy_from_user(&fmb_enable, arg, sizeof(fmb_enable))) + return -EFAULT; + + guard(mutex)(&zdev->fmb_lock); + + if (fmb_enable.enabled) + return zpci_fmb_enable_device(zdev); + return zpci_fmb_disable_device(zdev); +} + +int vfio_pci_zdev_feature_fmb_read(struct vfio_pci_core_device *vdev, u32 = flags, + void __user *arg, size_t argsz) +{ + struct zpci_dev *zdev; + struct vfio_device_feature_zpci_fmb_read fmb_read; + int ret; + + ret =3D vfio_check_feature(flags, argsz, VFIO_DEVICE_FEATURE_GET, sizeof(= fmb_read)); + if (ret !=3D 1) + return ret; + + zdev =3D to_zpci(vdev->pdev); + if (!zdev) + return -ENODEV; + + guard(mutex)(&zdev->fmb_lock); + + if (!zdev->fmb) + return -ENOMSG; + if (copy_from_user(&fmb_read, arg, sizeof(fmb_read))) + return -EFAULT; + if (!fmb_read.data) + return -EINVAL; + + if (copy_to_user((struct zpci_fmb __user *) fmb_read.data, zdev->fmb, zde= v->fmb_length)) + return -EFAULT; + + return 0; +} diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h index 5de618a3a5ee..97e0f857fe4f 100644 --- a/include/uapi/linux/vfio.h +++ b/include/uapi/linux/vfio.h @@ -1534,6 +1534,35 @@ struct vfio_device_feature_dma_buf { */ #define VFIO_DEVICE_FEATURE_MIG_PRECOPY_INFOv2 12 =20 +/** + * Upon VFIO_DEVICE_FEATURE_SET, enable or disable FMB for the VFIO zPCI d= evice. + * + * enabled is treated as a bool, so any non-zero value evaluates to true. = This + * feature fails on attempt to double enable/disable. + * + * Returns: 0 on success, -1 and errno set appropriately on error. + */ +#define VFIO_DEVICE_FEATURE_ZPCI_FMB_ENABLE 13 + +struct vfio_device_feature_zpci_fmb_enable { + __u8 enabled; +}; + +/** + * Upon VFIO_DEVICE_FEATURE_GET, provide FMB passthrough for VFIO zPCI dev= ices. + * + * The user-provided buffer must be at least fmb_length large, where fmb_l= ength + * is reported in VFIO_DEVICE_INFO_CAP_ZPCI_BASE. + * + * Returns: 0 on success, -1 and errno set appropriately on error. errno= =3D=3DENOMSG + * when the FMB is not enabled. + */ +#define VFIO_DEVICE_FEATURE_ZPCI_FMB_READ 14 + +struct vfio_device_feature_zpci_fmb_read { + __aligned_u64 data; +}; + /* -------- API for Type1 VFIO IOMMU -------- */ =20 /** --=20 2.54.0 From nobody Sun Jun 14 07:36:20 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 2217A40962C; Fri, 12 Jun 2026 18:11:02 +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=1781287864; cv=none; b=MFJlbdXVzYMTCMxKM94is/CsyGYuTljUUVIdGUCUSF3TjwyZRx4wF8CTxL2OZFHEBFkLB8/F0quwuMqDGCtiJI3JFumBTk2e0TlIebQKg860JLPOhhizMcwMib8TUn4d7mDyTimxaavM3yWnNSV8uS/D5Y8XocpLTXuSSx6v1KE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781287864; c=relaxed/simple; bh=+/MJbz1Nx9N5DsM/+uCTrYmoBCKXQgRFW6ylS1HpNR8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EQzkEf9fE8+L2dcv0GvFQ0USzI20u2Es2d2IHUVimgqTG5cyfpwX/QC/uoKxfhNCh/Opn3GVzRv8mti6dilNKZzB+UIvv4AnuLY/ZTRx+89ZdRQWtLR8aSPPZxdo23gd6Jb8uw3JF5p5CMnWyEy4qsD8rNX6lRXp74KclPmG3RM= 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=H0fh107M; 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="H0fh107M" 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 65CGWSvH1725605; Fri, 12 Jun 2026 18:11:00 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=SsqudMM6wancz+w4e 1ii3g/z8aangAqp0EsDxJEqIJI=; b=H0fh107MFEhi2WGudUfIsd15wjdZboLmi LLIQgjoSOMMxCyUxWD2RiJ5VjukyfjEwpSJlDFXUA/G8v7XoIFN+mfaC/psjjxb4 RmB+1PuwfMuUEC1n1v2J7mdQAjt/4XZLkgJgjqz7vweSr7KFlixxH5WFN2EfXcTv BY0iQx5J8FMd3dQJBBql+66Ty2fyFHukR9wLuWWeNdLKPGi7o6xq8RHcFMPJTXyT i7y4Y4KW5n2DYqzM+OA/oo+17LrHqMWndmiECVCXYn0JzdtPt3qSWQtkKmOjbJZ1 V1KR9OS6pARBlJv7uTrmzOYp7YPLES3A+bV9o761mzx2WxFlR2zHw== Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4eqe8e1w16-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 12 Jun 2026 18:11:00 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 65CI4aoK010572; Fri, 12 Jun 2026 18:10:59 GMT Received: from smtprelay07.dal12v.mail.ibm.com ([172.16.1.9]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4eqe0a91vh-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 12 Jun 2026 18:10:59 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (smtpav04.dal12v.mail.ibm.com [10.241.53.103]) by smtprelay07.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 65CIAtb226673740 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 12 Jun 2026 18:10:55 GMT Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8F6AF58052; Fri, 12 Jun 2026 18:10:55 +0000 (GMT) Received: from smtpav04.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7131B5805A; Fri, 12 Jun 2026 18:10:54 +0000 (GMT) Received: from Mac.ibm.com (unknown [9.61.255.20]) by smtpav04.dal12v.mail.ibm.com (Postfix) with ESMTP; Fri, 12 Jun 2026 18:10:54 +0000 (GMT) From: Omar Elghoul To: linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: oelghoul@linux.ibm.com, hca@linux.ibm.com, gor@linux.ibm.com, agordeev@linux.ibm.com, borntraeger@linux.ibm.com, svens@linux.ibm.com, schnelle@linux.ibm.com, mjrosato@linux.ibm.com, alifm@linux.ibm.com, farman@linux.ibm.com, gbayer@linux.ibm.com, alex@shazbot.org Subject: [PATCH v4 4/4] s390/pci: Fence FMB enable/disable via sysfs for passthrough devices Date: Fri, 12 Jun 2026 14:10:48 -0400 Message-ID: <20260612181048.91548-5-oelghoul@linux.ibm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260612181048.91548-1-oelghoul@linux.ibm.com> References: <20260612181048.91548-1-oelghoul@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: 6i-YppnPb8Gg6JKUbOYK0dHfi6bs0XTR X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNjEyMDE2OSBTYWx0ZWRfX9U/U/eiqhICM 4sh7BC7fr38ih3jmiaXyxrSPjYYAwjNj6MHGIZO62BfU4Cy5qGVtsfUHzHYICV31h80l5TV5zCz LmqZGM2sz2aLRJzxe2jL4ePWt1Vaaz0kBlERAKEeHGvG/ydJ8fzF/Cf3iHnGDQpJmxUXV8HiDJt XJr78/0tv61NzGrd5KmLS5nvmRdnhf/5M1NOIHO/fXc4ciyAHHq4OUhjpZlBWM7w/jblAKo2PSb 55KnwopReF+EiTFICuq5DhWSIZrDtQN3QNt/9Vmn6SnVw9/sxrPBPnX4NRFCgGjMxKq4QK0Ay0H ncIGhTTLzBhfq4SA5gnUmGW3VoyVol92AncIW5LF3OSLD/fEAzV6zMN0putIGPqjcQUGDS9iSCs A5IBZvYVCjvsHznOUq+cAceiglI4+SPGM2gCCxrkeQHkiT/tFm/178/qhG23igDlXFC+28DqmYB nFNfo2KkqS4Zb2j6H2g== X-Authority-Analysis: v=2.4 cv=DPu/JSNb c=1 sm=1 tr=0 ts=6a2c4bb4 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=FelO9ux0wxsA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VnNF1IyMAAAA:8 a=LQOIlC5QHTpW1RRPx_YA:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwNjEyMDE2OSBTYWx0ZWRfX6vl13LaxdeKd PmLl6rKjd0jy0Ap6NxZB7X9Ox/mHHgKP1qcukLrXS1lCH2IEBvTxDKpyPYoBncLj9P7gA9UhNuw nhFqfG+Ai1C2HBrgb+c5tsQ66HA45pM= X-Proofpoint-ORIG-GUID: 6i-YppnPb8Gg6JKUbOYK0dHfi6bs0XTR X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.125,FMLib:17.12.100.49 definitions=2026-06-12_02,2026-06-12_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 impostorscore=0 malwarescore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 phishscore=0 suspectscore=0 bulkscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606040000 definitions=main-2606120169 Content-Type: text/plain; charset="utf-8" Introduce a fence over enabling or disabling FMB via sysfs when the zPCI device is associated with a KVM. This will allow a KVM guest to use FMB passthrough and avoid the edge-case where the host disables FMB while the guest is still using it, which may cause partial counter resets and inconsistent reads which have no parallel in the architecture. With this patch, the userspace driver, likely QEMU, is still able to enable or disable the FMB using the VFIO device feature introduced in the previous patch, effectively securing what is associated with the VM state and isolating it from other processes on the host. For VFIO devices that are not associated with a KVM (i.e., for userspace drivers other than QEMU), this fence does not take effect. Signed-off-by: Omar Elghoul Reviewed-by: Niklas Schnelle --- arch/s390/pci/pci_debug.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/arch/s390/pci/pci_debug.c b/arch/s390/pci/pci_debug.c index c7ed7bf254b5..a2dc79418c21 100644 --- a/arch/s390/pci/pci_debug.c +++ b/arch/s390/pci/pci_debug.c @@ -149,9 +149,15 @@ static ssize_t pci_perf_seq_write(struct file *file, c= onst char __user *ubuf, if (!zdev) return 0; =20 + mutex_lock(&zdev->kzdev_lock); + if (zdev->kzdev) { + rc =3D -EPERM; + goto out_unlock_kzdev; + } + rc =3D kstrtoul_from_user(ubuf, count, 10, &val); if (rc) - return rc; + goto out_unlock_kzdev; =20 mutex_lock(&zdev->fmb_lock); switch (val) { @@ -163,6 +169,9 @@ static ssize_t pci_perf_seq_write(struct file *file, co= nst char __user *ubuf, break; } mutex_unlock(&zdev->fmb_lock); + +out_unlock_kzdev: + mutex_unlock(&zdev->kzdev_lock); return rc ? rc : count; } =20 --=20 2.54.0