From nobody Fri Sep 25 04:07:46 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 DC0BD488229; Wed, 16 Sep 2026 21:34: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=1789594465; cv=none; b=kElL/WDgFd25dswuzK4AvcEoT3WtMExog/Vj3gqqdf2OCSKt8DKoYR8cntJ+2aJBmnPozWe5ppHWH69nTPsFke8IsthlZSWs5u4uUK60jslFDeOepUwifdLEX4fj3o4TKhj67zh+AMwijr4jB/ZPI2JMZcx/O3Jh6nZM0gPmBUY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789594465; c=relaxed/simple; bh=OxnRcXJLxFWHA/hZj4hIW4fVA48+PAX9Dgr+SJ7h00g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mHM430/mztaCQhcgY9BWOE1+XYqxzUNPpdPitIxjvOJq+bOTgbAzw0GO8skbCNOzwuUQTcPSKuf1o/09iv+q3CFMoZeZgg3/qiYC/3TQi0SvqoQdgvtQI4mX1+HFJeMokzYpnm7WmunLPJ+mZp5YnorgUWofkSiFmtMSiDHw/1s= 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=hzIQvAI6; 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="hzIQvAI6" 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 68GG1Y0F3041096; Wed, 16 Sep 2026 21:33: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=HqAw7R/fQ8z6iOXuW jMtpQGnqXsXvOym+0CvIVMs8lE=; b=hzIQvAI6GjYi7Z3t8gcHTmaHwPQm7xc1p BSB9RtaUEmVVtPGAniVtB5RPDzmXNQEoUYbA+7y/vGUomEGDuqmukibWlbEqzP0q 04As0gGB4sEj+fvZ5UHOZANDkCvupayllYPQ4p+nXVMRoVEiNfQKlsUkBjWOZMkr nH+v9pIxfjAHTr7TEIsBy1c5pozGS8wHLAyoiwTc9YbyK/bk7Lu9HDCjlidkKI85 BIkVizJrp/MY0X2cl8RAWoSKB12bQ9KigDEAg5hbf1yObIVEl03rubg2MHYlhrDG d2u/lgiQm5ApxLrHSUeK3IWL+Df0NP+if2r034IEHX3WlXrTv5SSw== 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 4gmw5e6u4m-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Wed, 16 Sep 2026 21:33: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.11/8.18.1.11) with ESMTP id 68GJ1Ovx1625860; Wed, 16 Sep 2026 21:33:57 GMT Received: from smtprelay07.dal12v.mail.ibm.com ([172.16.1.9]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gpyxsgm6t-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 16 Sep 2026 21:33:57 +0000 (GMT) Received: from smtpav03.wdc07v.mail.ibm.com (smtpav03.wdc07v.mail.ibm.com [10.39.53.230]) by smtprelay07.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68GLXt8Z30147182 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 16 Sep 2026 21:33:55 GMT Received: from smtpav03.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3B84D58062; Wed, 16 Sep 2026 21:33:55 +0000 (GMT) Received: from smtpav03.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E7CA65805A; Wed, 16 Sep 2026 21:33:52 +0000 (GMT) Received: from Mac.ibm.com (unknown [9.61.251.90]) by smtpav03.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 16 Sep 2026 21:33:52 +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, pasic@linux.ibm.com, alex@shazbot.org, stable@vger.kernel.org Subject: [PATCH v6 1/4] s390/pci: Hold fmb_lock when enabling or disabling PCI devices Date: Wed, 16 Sep 2026 17:32:19 -0400 Message-ID: <20260916213222.233-2-oelghoul@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260916213222.233-1-oelghoul@linux.ibm.com> References: <20260916213222.233-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: AW1haW4tMjYwOTE2MDMwMCBTYWx0ZWRfXx6OZl6jzwu2a hP6JILMGlDr7AtjWXnSGAhSBwOEuapCtd8yWBqzkzdk94b2W0CvsoopeSLC5H8iZAUSgPpDovdt sGom4v7HrssIKaPFV8rWYRq3YsMqfjIquZpu9XwgZD0IHySFenTaxKpueGSICDSHO/nv8m2Nmdh hgttIcOeNLGcgULw2c8fm0DgMdZqmSYxMkdIe5c6IEEMeQLTZFQeEGxapf70dcR9OWI3aLwN9LV 3/KtzrKUuU2/kDZsm26vyAvHZW92cMSIKgxAZFxT7UGhvtwDYvXNUamqcLXUC8BmegCpKHm7R3d ZZqhUfnCICrJLThq+dzadvYl0AUr0TaSvxkbb0FTyMYIbjPaToXdWKiczCslPJI9VE5rzxkqcHa NSNR8sfeTMKAG8nuVSgHRPcAMYgPpx5T+IvmyEfsHVOv/1Z2Y1K4wWpwYD6oLtZPy6rYPpEWwJm 4Lp9fOkbNNmt8QbOTcA== X-Authority-Analysis: v=2.4 cv=E/NYNqdl c=1 sm=1 tr=0 ts=6aab0b46 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=5NbLduwtq9nBFWGw9KEA:9 X-Proofpoint-ORIG-GUID: ogkhzlbF3YJhBJMImhqUKBzov9GWgPNE X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE2MDMwMCBTYWx0ZWRfX07zupqKskldX sxmqJ8QEen6Sr0EUgcreWKLImxSpD1sq2PkKsTMRsoIKpd8bl+dkg20fjVo1o/helieEC0zyBcN 1vibTM2LzH2bjL6ZUx5j5JNGUFFmk4c= X-Proofpoint-GUID: ogkhzlbF3YJhBJMImhqUKBzov9GWgPNE 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-09-16_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 priorityscore=1501 spamscore=0 adultscore=0 clxscore=1011 bulkscore=0 malwarescore=0 suspectscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609160300 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 Reviewed-by: Matthew Rosato --- 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 d64c544b32b0..c055a9ad0972 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.55.0 From nobody Fri Sep 25 04:07:46 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 48C873D75BE; Wed, 16 Sep 2026 21:34:04 +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=1789594447; cv=none; b=PNy/oNJGm2Z/4PwPw4XCbftUPQBMdeL6NiOgAadeFhSEkRgbkDghPmSxfs3i5b/QNPQd5imv6XYKo3AmW6kyHA/AGZP21/oMgKw7m4ll10LmbRMv7BgJ6dz+H5cuqFqmrjC7CNjhexOjLcG/pZhRBiCsyYhsppu2h6/ZIyMoKnw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789594447; c=relaxed/simple; bh=lqdnQoVdUb9vpkLHEhbIN41yc69nCTgbNLTV8hSRQoQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lL1zRQO3dslmfg9teQPAxw90RXH7DxyAHgjHq3A5CdvU0CYRlI3Sqh8eDNTooxdXQDNN3Dzf//oMzqQJ0J5S6TEzFQpyBKy9UOMewvRVohowBlowKIFU8JFFEWem7/UCFQJSQay4U1RPhp0gwzSFNhLHGLbA4lNj1mbPV9O/4yw= 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=LEKhNDDn; 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="LEKhNDDn" 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 68GG1gwd046003; Wed, 16 Sep 2026 21:34:01 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=hNwRbeFuimRH4ahph ijpRmVrkbZV5h4cB845uWeAQck=; b=LEKhNDDnq6TAK+0Eei4KZRyNXPec8vyhF /PMuXtIzLnFqih1Re6+1tO0zK0q40pLkvkbX7vUKSzzv2qPOeBGzwhDGwCbvJatd 4I76y0qVI4ETz85qnCg2B5wfl4EIyEz2dsYfrq6NUmvDwzgSfzTwBwzjEEcToIuE tFzDy9DKMa7R0Jo2yw8HBSC6SGvOO1G3zfVRsAa18QNGBui4PZwv5eYgUZ4xx2Ep fiLVlQZD9s67Xj2YjME+AENfZv4LYIpgRcE+KvfMQccnMuY4AlGbF5KbcaLp5G8c LX/6C1wECrG/kYCkFzee9SSnDL6DIFGJDrbt0xZJc3w4AvEx7CIqQ== 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 4gmxcv6php-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Wed, 16 Sep 2026 21:34:01 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68GJ0FZf1699869; Wed, 16 Sep 2026 21:34:00 GMT Received: from smtprelay02.wdc07v.mail.ibm.com ([172.16.1.69]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gq03vgjg9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 16 Sep 2026 21:34:00 +0000 (GMT) Received: from smtpav03.wdc07v.mail.ibm.com (smtpav03.wdc07v.mail.ibm.com [10.39.53.230]) by smtprelay02.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68GLXvB210617462 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 16 Sep 2026 21:33:57 GMT Received: from smtpav03.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 371295805A; Wed, 16 Sep 2026 21:33:57 +0000 (GMT) Received: from smtpav03.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 6821558066; Wed, 16 Sep 2026 21:33:55 +0000 (GMT) Received: from Mac.ibm.com (unknown [9.61.251.90]) by smtpav03.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 16 Sep 2026 21:33:55 +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, pasic@linux.ibm.com, alex@shazbot.org Subject: [PATCH v6 2/4] s390/pci: Reuse FMB buffer and preserve state in device re-enablement Date: Wed, 16 Sep 2026 17:32:20 -0400 Message-ID: <20260916213222.233-3-oelghoul@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260916213222.233-1-oelghoul@linux.ibm.com> References: <20260916213222.233-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: AW1haW4tMjYwOTE2MDMwMCBTYWx0ZWRfXwSEwzExdMs3C 1G/jwHc7VkhbsTaqhFII/qoHotcKLCVrdx7+ClKGMiLrULl0gN9XLZd3J2lfCnykjWlBBDXy8Ix oy/BOkh9a3A+03T1VySQEIb73Y1dFJw= X-Proofpoint-ORIG-GUID: Ylz-L7i369HCXUw4QJSBxcASIZp38e-R X-Proofpoint-GUID: Ylz-L7i369HCXUw4QJSBxcASIZp38e-R X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE2MDMwMCBTYWx0ZWRfXxy3+bLVKxHVd faULSPLZE3P8YVZP/Qd/6So/5FRhlOTb0kkFLTjd8MsO9Uq1T9kE3XiMMd2K+fJ68CEJYq29xTP Nt7g2ApKlOmU5KEpPKAPaW9bo/hBQAgZZrJJJs53/z9VChfzUR5QEgeU98LNjUy+kYr0nVbo2cI wt6yqs0SpfDIPbjPuu08gty3SaNFdM0e6h410QIvUOKrbqFQ2gzbODZnqeLXS7+aiwl1tkg748/ 0jtysHBtU+ksSY9n0Rsby4otzmVIPrrJOaj1cV3tVhZCnk5YTkcnOjx02iBV5N3p6/TP4k1ZCrJ d1b9Knb9knI2rRIS6dyZsfdGOvN3HXmF4LdNQ0j8WiuT1E9RlpwahX/7gdOCGlbbenFBZppcw6l 5BRcMNav7/5blUEX8uiONnI4Uo7ZGGSUGvS3/oy2/9qm1c8dmluZF6YNoJhbhrPuv0ARF3xi00o U85cS9VUE7aVzqmkJdA== X-Authority-Analysis: v=2.4 cv=F+7C5ahN c=1 sm=1 tr=0 ts=6aab0b49 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VnNF1IyMAAAA:8 a=LP0gC_cnHC4A9rhkzj4A:9 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-09-16_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 suspectscore=0 phishscore=0 clxscore=1011 malwarescore=0 lowpriorityscore=0 bulkscore=0 spamscore=0 impostorscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609160300 Content-Type: text/plain; charset="utf-8" Introduce the function zpci_fmb_reenable_device() that checks the state of function measurement and ensures it is enabled. Reset the counters to zero, disable, and re-enable the FMB if it was already enabled. Call this function from zpci_reenable_device(). Don't free the FMB buffer during disabling and reuse it when re-enabling measurement. Instead, free the buffer upon device teardown, allowing the same buffer to be reused in the enable path and add the bit fmb_enabled to struct zpci_dev. Audit the only consumer of zdev->fmb and update it to reflect the change in semantics. Signed-off-by: Omar Elghoul --- arch/s390/include/asm/pci.h | 2 + arch/s390/pci/pci.c | 75 ++++++++++++++++++++++++++++--------- arch/s390/pci/pci_debug.c | 2 +- 3 files changed, 61 insertions(+), 18 deletions(-) diff --git a/arch/s390/include/asm/pci.h b/arch/s390/include/asm/pci.h index 88a125b92bdd..b8162f7a8968 100644 --- a/arch/s390/include/asm/pci.h +++ b/arch/s390/include/asm/pci.h @@ -175,6 +175,7 @@ struct zpci_dev { u8 util_str_avail : 1; u8 tid_avail : 1; u8 rtr_avail : 1; /* Relaxed translation allowed */ + u8 fmb_enabled : 1; unsigned int devfn; /* DEVFN part of the RID*/ =20 u8 pfip[CLP_PFIP_NR_SEGMENTS]; /* pci function internal path */ @@ -351,6 +352,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 c055a9ad0972..5d1f5b75bff5 100644 --- a/arch/s390/pci/pci.c +++ b/arch/s390/pci/pci.c @@ -175,13 +175,18 @@ int zpci_fmb_enable_device(struct zpci_dev *zdev) =20 lockdep_assert_held(&zdev->fmb_lock); =20 - if (zdev->fmb || sizeof(*zdev->fmb) < zdev->fmb_length) + if (zdev->fmb_enabled || sizeof(*zdev->fmb) < zdev->fmb_length) return -EINVAL; =20 - zdev->fmb =3D kmem_cache_zalloc(zdev_fmb_cache, GFP_KERNEL); - if (!zdev->fmb) - return -ENOMEM; - WARN_ON((u64) zdev->fmb & 0xf); + if (!zdev->fmb) { + zdev->fmb =3D kmem_cache_zalloc(zdev_fmb_cache, GFP_KERNEL); + if (!zdev->fmb) + return -ENOMEM; + WARN_ON((u64) zdev->fmb & 0xf); + } else { + /* FMB buffers are intentionally persistent for later reuse */ + memset(zdev->fmb, 0, sizeof(*zdev->fmb)); + } =20 /* reset software counters */ spin_lock_irqsave(&zdev->dom_lock, flags); @@ -199,11 +204,11 @@ int zpci_fmb_enable_device(struct zpci_dev *zdev) fib.fmb_addr =3D virt_to_phys(zdev->fmb); fib.gd =3D zdev->gisa; cc =3D zpci_mod_fc(req, &fib, &status); - if (cc) { - kmem_cache_free(zdev_fmb_cache, zdev->fmb); - zdev->fmb =3D NULL; - } - return cc ? -EIO : 0; + if (cc) + return -EIO; + + zdev->fmb_enabled =3D 1; + return 0; } =20 /* Modify PCI: Disable PCI function measurement */ @@ -215,7 +220,7 @@ int zpci_fmb_disable_device(struct zpci_dev *zdev) =20 lockdep_assert_held(&zdev->fmb_lock); =20 - if (!zdev->fmb) + if (!zdev->fmb_enabled) return -EINVAL; =20 fib.gd =3D zdev->gisa; @@ -224,13 +229,39 @@ int zpci_fmb_disable_device(struct zpci_dev *zdev) cc =3D zpci_mod_fc(req, &fib, &status); if (cc =3D=3D 3) /* Function already gone. */ cc =3D 0; + if (cc) + return -EIO; =20 - if (!cc) { - kmem_cache_free(zdev_fmb_cache, zdev->fmb); - zdev->fmb =3D NULL; - } - return cc ? -EIO : 0; + zdev->fmb_enabled =3D 0; + return 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; + + lockdep_assert_held(&zdev->fmb_lock); + + if (!zdev->fmb_enabled) + 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; + + zdev->fmb_enabled =3D 0; + return zpci_fmb_enable_device(zdev); +} +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 +768,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); @@ -1003,6 +1038,12 @@ void zpci_release_device(struct kref *kref) if (zdev->has_resources) zpci_cleanup_bus_resources(zdev); =20 + if (zdev->fmb) { + zdev->fmb_enabled =3D 0; + kmem_cache_free(zdev_fmb_cache, zdev->fmb); + zdev->fmb =3D NULL; + } + zpci_bus_device_unregister(zdev); zpci_destroy_iommu(zdev); zpci_dbg(3, "rem fid:%x\n", zdev->fid); diff --git a/arch/s390/pci/pci_debug.c b/arch/s390/pci/pci_debug.c index c7ed7bf254b5..44f026ead414 100644 --- a/arch/s390/pci/pci_debug.c +++ b/arch/s390/pci/pci_debug.c @@ -97,7 +97,7 @@ static int pci_perf_show(struct seq_file *m, void *v) return 0; =20 mutex_lock(&zdev->fmb_lock); - if (!zdev->fmb) { + if (!zdev->fmb_enabled) { mutex_unlock(&zdev->fmb_lock); seq_puts(m, "FMB statistics disabled\n"); return 0; --=20 2.55.0 From nobody Fri Sep 25 04:07:46 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 393D847DD7C; Wed, 16 Sep 2026 21:34:05 +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=1789594457; cv=none; b=TcgX3P7y/SIBFE4KJxFozPB8su+1ny1mqwIgqOnJHCZGn4EdbFCMdU6d0nLVhffJdIv9Fkt7AMKtyyVCOTBoUOtmR2F/O9sTjNbxoyAW6yRGVN59arlt7/dXenhLW9BhNnYVZBWUp8ZA83cHSVJz0HnIWJKnrgLg1UHmzojtlBw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789594457; c=relaxed/simple; bh=yUb8mTGM7zTkL5qaXzz0D3zIGSe4h2+9fROZ3hHYKtI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cCtsuoYBayvwbCqGyEQz+Lb58Cx34tk38lXs8NpypFPiH+W2iwC1viDnWazr0h37+Qym6Ztnmrl/gB9MPrtd4wdGNuj9WpVfkeWaqgLTIbDQjQEJA33MAjBH68Ta3cuSGV8z4p0OzpakWoxdR2Nrlj2MLHlyXEjRCo+sW1tYOts= 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=DEMM3yiJ; 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="DEMM3yiJ" 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 68GG1stS4057630; Wed, 16 Sep 2026 21:34:02 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=dbycqcXXO6wFbgsri bJvgrXMkHVo7z9Bwk7dOLcpA8U=; b=DEMM3yiJUyYNDqZSeVbIIFahmOuuooaIV YYJTWVvEfCx9ncyj2J2Lw9R2H3X4S1gag9haE9UIY6T+0HS+gsIXrfgWZNYlezEp +pZ3mXo0iGh/EzqVQ3chvgg49YJ1Y4jCaNrT9vmcGku4O2K5OpElh9wcF242Pbm4 be4wXGjXepzQPNKFpe5K8A/7mUaUf2EtsDCrrgg7sLuGNV3djbhR7qKWL2HShWSm wbWFmWkkmiqIOw4dYQNUmCoPC91t7jH9KXAdApbxhwaRxTNPTXz+FVnv1g7Zz+NK zPpCOdfA6x/Jmvz3HHchRc2h+ubaQuyO83GDeZiGL9aJ3vxLUtuwQ== 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 4gmv5hy1a3-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Wed, 16 Sep 2026 21:34:02 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68GJ0XSI1663490; Wed, 16 Sep 2026 21:34:02 GMT Received: from smtprelay04.wdc07v.mail.ibm.com ([172.16.1.71]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gq089rhd7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 16 Sep 2026 21:34:02 +0000 (GMT) Received: from smtpav03.wdc07v.mail.ibm.com (smtpav03.wdc07v.mail.ibm.com [10.39.53.230]) by smtprelay04.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68GLXxrw41157234 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 16 Sep 2026 21:33:59 GMT Received: from smtpav03.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 35E545805A; Wed, 16 Sep 2026 21:33:59 +0000 (GMT) Received: from smtpav03.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 641235805D; Wed, 16 Sep 2026 21:33:57 +0000 (GMT) Received: from Mac.ibm.com (unknown [9.61.251.90]) by smtpav03.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 16 Sep 2026 21:33:57 +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, pasic@linux.ibm.com, alex@shazbot.org Subject: [PATCH v6 3/4] s390/pci: Fence FMB enable/disable via debugfs for passthrough devices Date: Wed, 16 Sep 2026 17:32:21 -0400 Message-ID: <20260916213222.233-4-oelghoul@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260916213222.233-1-oelghoul@linux.ibm.com> References: <20260916213222.233-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: AW1haW4tMjYwOTE2MDMwMCBTYWx0ZWRfXwtjf5L0DLuhb gwbcUnlLXJKk/tb50DLan2mS2pB/VyIdWaxDt8hJCSqoaDe7fUttBWQT+ms9iMH8+jleJg59DK/ eNaxbH7AjFPbN5lWupkGrcOSRFfV1vTRKZz55Mze4/4XV18uAr2/OTjdZ1RCmj3hXs5WU26P/7W 7afnnQahfniuLpaBsyr6YGoz9MdOd3lS0Wo74lLEWVIBteVXYPz4mtPiWQ81zGspF6Wv3ShnHAU KqwpsutpgzstEWYK74Et1PpX4rCyA/7yt2z3o38YSG9BO5lwcslkoHIsi/pMcGM55WcdZULwaRW qYE6rjGGem+HaIxWt1PvrQcha4Zeg6D2ylnnVTogja0AluwH51TJz5fq8ZIngnDl7EPRgdZqAaU Mk4xet/wJyF1TMEnbJ2CvkvG4MqOUgPsqHyCpcQT8CpysetFiHycAdAoDVNjgCwXZ8xrOwHRpHX Zt4nDfrM5QKfexs88DA== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE2MDMwMCBTYWx0ZWRfX7KjGavTuo318 PL5VYPEJ3U3vc4axPnzJTR49nkrHt3chOlOfFVi1zAlgVaYIFYkncioq0WEoJo+lyoVNnxcMlRB i6CJTnqQJqhrmBv7EwPrhRbIRsqGr9g= X-Authority-Analysis: v=2.4 cv=Zsx4uN7G c=1 sm=1 tr=0 ts=6aab0b4a cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VnNF1IyMAAAA:8 a=0_QKAakMeY9AEM467WoA:9 X-Proofpoint-ORIG-GUID: PtmmWorVOpTUThUPstGbLyS8m9c6wN1R X-Proofpoint-GUID: PtmmWorVOpTUThUPstGbLyS8m9c6wN1R 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-09-16_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 impostorscore=0 clxscore=1015 priorityscore=1501 lowpriorityscore=0 bulkscore=0 adultscore=0 phishscore=0 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609160300 Content-Type: text/plain; charset="utf-8" Introduce a fence over enabling or disabling FMB via debugfs when the zPCI device is associated with a KVM. This will prevent processes on the host from tampering with the FMB while the guest is still using it, which may cause partial counter resets and inconsistent reads which have no parallel in the architecture. 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: Matthew Rosato --- arch/s390/pci/pci_debug.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/arch/s390/pci/pci_debug.c b/arch/s390/pci/pci_debug.c index 44f026ead414..afc52bd5271a 100644 --- a/arch/s390/pci/pci_debug.c +++ b/arch/s390/pci/pci_debug.c @@ -153,6 +153,12 @@ static ssize_t pci_perf_seq_write(struct file *file, c= onst char __user *ubuf, if (rc) return rc; =20 + mutex_lock(&zdev->kzdev_lock); + if (zdev->kzdev) { + rc =3D -EPERM; + goto out_unlock_kzdev; + } + mutex_lock(&zdev->fmb_lock); switch (val) { case 0: @@ -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.55.0 From nobody Fri Sep 25 04:07:46 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 8F153483BE6; Wed, 16 Sep 2026 21:34:08 +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=1789594464; cv=none; b=TjHz4aY0bZxbl8z2LNVBvuElzgAQs1Y7RK7h9dC3KOFzGIP6p/8pW3GZa1BQYKbeG9btDBNkO8cYeC3G+07AH/AKgIhvnJ/Pm4Tn62hoX9PI6T/rkBOga6aZ24TxrcXe8WL1huFGnGam2Y/eQvwcA5PushMndVEtpqQrh8sjyCk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789594464; c=relaxed/simple; bh=mY4UP2f4L77OnrXNl12uKtgZB9nrnrL7BdEDy+bgdE8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fU0hUozfcnSDcDfmJk28BV9syUOZm62oAdHNkQ7JRFL+21SVA5gkwHDZZee9uEkd9aGkJwxMFajRyj8aW+rXx3kZ6D7ScVD4sNcnxVei41JZNlDrJ25NVQYpgeq0v9PgtcQ0etS4Vw8BL7kAwHpkWC9sitE4AIVV1nkVk2gVvKc= 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=OvhO7boT; 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="OvhO7boT" 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 68GG1UDc006678; Wed, 16 Sep 2026 21:34:05 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=WNswMr65Ld0ueut0A bNhAv6uW4AjKityQDyk7FgOIZk=; b=OvhO7boTPt0Z8OpARiOagVv81dScLB8cO zSBIjxu+uma9A1CRvaDD7xsdu6UBVOr9rWX3MNsxAkwCAkre3kzELYD4HHTh643O NtcKaTib4F2UIf1HXnORNfHpMEwwd7Hu+pd0TU8eMFydaGIQf7sBALSxmGiGk21a bISP9XU+7kItzmvy4Z/wHpbVgXeenS9wUwzfw33DJ4zwk1L/HvI2+zWthzCfocjj ejcx2u8yg7eLqlkHNfMQDbkmpFfU1SSeKYj6VzJ3cNLeqaW9QF1RoaVFgDoGH2FL gu4c7MjhnncWYd23WW1VD6IM6nerVL6bRvzOFFYSv3iNgcqMqwhwA== 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 4gmx83y55p-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Wed, 16 Sep 2026 21:34:04 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68GItIr91699556; Wed, 16 Sep 2026 21:34:04 GMT Received: from smtprelay06.wdc07v.mail.ibm.com ([172.16.1.73]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gq03vgjgf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 16 Sep 2026 21:34:04 +0000 (GMT) Received: from smtpav03.wdc07v.mail.ibm.com (smtpav03.wdc07v.mail.ibm.com [10.39.53.230]) by smtprelay06.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68GLY1sD9437742 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 16 Sep 2026 21:34:01 GMT Received: from smtpav03.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3A0395805D; Wed, 16 Sep 2026 21:34:01 +0000 (GMT) Received: from smtpav03.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 64FED5805C; Wed, 16 Sep 2026 21:33:59 +0000 (GMT) Received: from Mac.ibm.com (unknown [9.61.251.90]) by smtpav03.wdc07v.mail.ibm.com (Postfix) with ESMTP; Wed, 16 Sep 2026 21:33:59 +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, pasic@linux.ibm.com, alex@shazbot.org Subject: [PATCH v6 4/4] vfio-pci/zdev: Add VFIO FMB device features Date: Wed, 16 Sep 2026 17:32:22 -0400 Message-ID: <20260916213222.233-5-oelghoul@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260916213222.233-1-oelghoul@linux.ibm.com> References: <20260916213222.233-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: AW1haW4tMjYwOTE2MDMwMCBTYWx0ZWRfXxU7hRylHyG44 rYCyY2EGuuFHcTBvhgGSMopwHmEiFdQqqKK2M36xKyS32QUBlXjrLh13SU1HqpoOnqFDyd7Su69 KKUkN8UHVQgZdqicOENQzN29ewGyLTPzGSMUH7j5Y4wxUjRaS03jWkdF8Ib+WYRkSz93R0G9uMR zP4BT1CJunZrsM/BqcawpvAafri6h4XSGD5tX4+znC/6BC1qufjmIYFNvVij01ZqVJXfpNQQH16 IIogvWU1V1eP7FtcQDVAEKZpJ8l5oFBCWLTIHRLGIPGenA16JMLvdQQ0XSZjogWQk7L+2T6oC3Y c/ztYe0Ez0yJPYch81E/N19Bfc0u2FT28D2ZNCuKZ90axVbfD7nkwtszmKUYuit7QEdBCRS2Lkx gco5DHRDDywfixejjXdN3JiJo9Bvv2X45Pz7zStad0MMX+pT5un93skTURwsA2/wuxmt5AqvJMP IZAn+OOFdDaYpPjgqOg== X-Proofpoint-ORIG-GUID: S5X5dp4nx5Z4ycMlWnoNXq-yji5gYZJc X-Proofpoint-GUID: S5X5dp4nx5Z4ycMlWnoNXq-yji5gYZJc X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE2MDMwMCBTYWx0ZWRfXzQ4CbevpoLMV ErZDlRmaoDXT3abjm11ATo7w4pXNKlGxyhF543enSILQbo5OoBpvnZi6PzJvPuOQs5hbEdDrt0b /hF3QaLbU0YPWDZ9PWB+pMAnxVRwAwg= X-Authority-Analysis: v=2.4 cv=cY9HPXDM c=1 sm=1 tr=0 ts=6aab0b4c cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=iQ6ETzBq9ecOQQE5vZCe:22 a=VnNF1IyMAAAA:8 a=wtvrgtD0Hc2VqHSVShsA:9 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-09-16_03,2026-09-16_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 spamscore=0 bulkscore=0 clxscore=1011 suspectscore=0 impostorscore=0 malwarescore=0 phishscore=0 adultscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609160300 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 when the FMB is enabled. Signed-off-by: Omar Elghoul --- drivers/vfio/pci/vfio_pci_core.c | 4 +++ drivers/vfio/pci/vfio_pci_priv.h | 18 ++++++++++ drivers/vfio/pci/vfio_pci_zdev.c | 60 ++++++++++++++++++++++++++++++++ include/uapi/linux/vfio.h | 29 +++++++++++++++ 4 files changed, 111 insertions(+) diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_c= ore.c index 6757054e9d87..3c827a77725b 100644 --- a/drivers/vfio/pci/vfio_pci_core.c +++ b/drivers/vfio/pci/vfio_pci_core.c @@ -1627,6 +1627,10 @@ int vfio_pci_core_ioctl_feature(struct vfio_device *= device, u32 flags, return vfio_pci_core_feature_dma_buf(vdev, flags, arg, argsz); case VFIO_DEVICE_FEATURE_ZPCI_ERROR: return vfio_pci_zdev_feature_err(device, 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 4e7162234a2e..e04d7e9d0c30 100644 --- a/drivers/vfio/pci/vfio_pci_priv.h +++ b/drivers/vfio/pci/vfio_pci_priv.h @@ -95,6 +95,10 @@ int vfio_pci_zdev_open_device(struct vfio_pci_core_devic= e *vdev); void vfio_pci_zdev_close_device(struct vfio_pci_core_device *vdev); int vfio_pci_zdev_feature_err(struct vfio_device *device, u32 flags, void __user *arg, size_t argsz); +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) @@ -116,6 +120,20 @@ static inline int vfio_pci_zdev_feature_err(struct vfi= o_device *device, { return -ENOTTY; } + +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 f47f36314a1c..b028de8e08a4 100644 --- a/drivers/vfio/pci/vfio_pci_zdev.c +++ b/drivers/vfio/pci/vfio_pci_zdev.c @@ -219,3 +219,63 @@ 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_reenable_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; + struct zpci_fmb fmb_bounce; + 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; + + if (copy_from_user(&fmb_read, arg, sizeof(fmb_read))) + return -EFAULT; + if (!fmb_read.data) + return -EINVAL; + + mutex_lock(&zdev->fmb_lock); + if (!zdev->fmb_enabled) { + mutex_unlock(&zdev->fmb_lock); + return -ENOMSG; + } + + memcpy(&fmb_bounce, zdev->fmb, zdev->fmb_length); + mutex_unlock(&zdev->fmb_lock); + + if (copy_to_user(u64_to_user_ptr(fmb_read.data), &fmb_bounce, zdev->fmb_l= ength)) + return -EFAULT; + return 0; +} diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h index e41437fa17ad..a8d501e42ef9 100644 --- a/include/uapi/linux/vfio.h +++ b/include/uapi/linux/vfio.h @@ -1555,6 +1555,35 @@ struct vfio_device_feature_zpci_err { =20 #define VFIO_DEVICE_FEATURE_ZPCI_ERROR 13 =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. = Nested + * enabling resets the FMB counters to zero, and nested disabling fails. + * + * Returns: 0 on success, -1 and errno set appropriately on error. + */ +#define VFIO_DEVICE_FEATURE_ZPCI_FMB_ENABLE 14 + +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 15 + +struct vfio_device_feature_zpci_fmb_read { + __aligned_u64 data; +}; + /* -------- API for Type1 VFIO IOMMU -------- */ =20 /** --=20 2.55.0