From nobody Thu Sep 24 14:26:05 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 325524AA00D; Tue, 22 Sep 2026 19:52:07 +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=1790106729; cv=none; b=NvkENXeC/yHpXNfyWTRYUCW79VpcrmFKmWv4/rQa/IXpim7DSZqtB0K1uBk0VeQiOtRwOCtdhdFvJOA2xD4bnK2duUNbOJbbT6Baw60eyZ9diDZjxFesBI8Gtd0+RPuiuSvQhVs9PEa/8CmyMEt1ftr8pGsoPNen40uYUj+Qg9M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790106729; c=relaxed/simple; bh=Pp7DmVHziTjsngerGzAzS9ggZnFeUelWoLtKn7VLkkA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fDaAWJR1c0NIRjnt0qSTDrWxGjVnw6ImmFwVHdjV0KqRpv1FYLobQ6M3d9L2q8BuYX5UfVNgIjW1yM1hxrChjURDZrVYsXVCrBBK1RxIjPHMKZVr8qBE2eDUgcyNDVmsBjLQ87ynmNnpj6ye6pVEVtIK1wIia+WjOIuOGn2axlo= 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=e4n/7rka; 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="e4n/7rka" 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 68MI7YaV1129430; Tue, 22 Sep 2026 19:52: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=l0eLohf0bZd7cQUOX 391fnN0GQ8lLsDWvhUe+M+IiXM=; b=e4n/7rkapL8p9VU6Kw2FRsZ/PMQNbFEjH 0RW3lMTumo2Qp8HBh2mKGboiu2sqQDzGdAWC3HgPVmnhJ2WRsHhN+CSCWvy8N6QO loNdmL2fMWH6R7BmrUbSEZn0ctOpfYsCgNtI9YTel8vUJ7dZO8NpvmiDjBpJsFZ8 u4YEAEHZvqFl7t8r2p3SxjrY2AUCxKx592rRuOELj8RVFe2fL0ld/FHa75wsVrqk KA8o/0OmnSoD+2SZiiHN1eZAjz1gQ6wVU4DrJl2SmxLOx8HtZpJ3CWKVEwQtru/V 6jyV7KyJie/FrnL22GvVA5c5uXMuXIdn6VsGu6sRvTWj54sC3pEwA== Received: from ppma11.dal12v.mail.ibm.com (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskgs7pr7-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Tue, 22 Sep 2026 19:52:04 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68MIHXBq4187956; Tue, 22 Sep 2026 19:52:04 GMT Received: from smtprelay07.wdc07v.mail.ibm.com ([172.16.1.74]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gt7dyb171-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 22 Sep 2026 19:52:04 +0000 (GMT) Received: from smtpav04.wdc07v.mail.ibm.com (smtpav04.wdc07v.mail.ibm.com [10.39.53.231]) by smtprelay07.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68MJq0hR22413912 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Sep 2026 19:52:00 GMT Received: from smtpav04.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8F02058052; Tue, 22 Sep 2026 19:52:00 +0000 (GMT) Received: from smtpav04.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A2BD358045; Tue, 22 Sep 2026 19:51:58 +0000 (GMT) Received: from Mac.ibm.com (unknown [9.61.246.118]) by smtpav04.wdc07v.mail.ibm.com (Postfix) with ESMTP; Tue, 22 Sep 2026 19:51:58 +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 v7 1/4] s390/pci: Hold fmb_lock when enabling or disabling PCI devices Date: Tue, 22 Sep 2026 15:51:38 -0400 Message-ID: <20260922195141.94548-2-oelghoul@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260922195141.94548-1-oelghoul@linux.ibm.com> References: <20260922195141.94548-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=V/XoQuni c=1 sm=1 tr=0 ts=6ab2dc64 cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=5NbLduwtq9nBFWGw9KEA:9 X-Proofpoint-ORIG-GUID: pUtK9MOx1B4o5gEc8rvbYhz92H4Cw3-P X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIyMDI4NyBTYWx0ZWRfX4ZauGVkn30ac D95qT4W89GF7FnruTibbSf5jpIUJV8BBmIWN45UM5BmMCw0D+ClfELeBuVMyXcJZqJPqlRBFB5b APEyW/wbt0ZZWV2oLlV8RzK3Hus9SXgCTxBqbdY/88yqEuetEnOLxj6Cba4UrMLZnq4VuNOngdr T7hoXaPFTHiONI14BVOGmMSitzJOEFMywLxPWkpLharq7H/E3uEzwCCJpz0WqwX58tXdR0+zWYC g5whu9lH5q6HTFgdLoZtU2j7QjEzaR84Xz188GS1sW0jtOAufTt5nrl+OkviEWgXNLJdtNL1/ZY /C091gVmi+g7ZrNw3ywQytPRPEJ//JJI8FnCluhzjeiNKUh6SlkUahhDX2BQOD2OQeqonJ6bDxe Y0rW+VikJxpvA1qw9+RmZsUjFDfUH5Ui2cjbcOt4s+DS14Wnzu/gGnQo8jE3XMsLfqzs5DkgyvD /UgiFTlFS9wLA9W8lrw== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIyMDI4NyBTYWx0ZWRfXz59whd5j98cF K8zBC8muAK69RJPrApNF5nTlI+UNJTcJ/L8CcEoMGDwm0jBTrfAwcJNJ8ORooTZQw6jksXFrBvK FkkWRojsoMYfEeza9ARtnThQJ92Ww2s= X-Proofpoint-GUID: pUtK9MOx1B4o5gEc8rvbYhz92H4Cw3-P 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-22_03,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 spamscore=0 malwarescore=0 clxscore=1015 phishscore=0 bulkscore=0 adultscore=0 lowpriorityscore=0 impostorscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609220287 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 Thu Sep 24 14:26:05 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 2E4974A6CCB; Tue, 22 Sep 2026 19:52:07 +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=1790106729; cv=none; b=F12BX3H2Pd/lJjZTEdUWENeU5CueJBTMVO4kegx3jxaOVT54/RWMJyZVuDEzKekBzpa1pgkd6Ze+ZJfbY1A8VSIcTeBg9W8yh5TQrZzelO05tipphHDYKyAhATHNVkmxeqldWwhVIYclrjTYzZsSXwg80tMCpo5LWiqg+jKc92s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790106729; c=relaxed/simple; bh=QBhmkDMAa8cr35n+rT6ne8SpvZBcC9tHhlL5QyLRz/g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ABk57uFJru1aVKNPLGvyKDV/XLSmGcDaJqGXwgJT/3IwRvubVmFW/IfwD6UPm5cbRWeaoS2Dxk/CG9LNF3EYLvu1wdNnHqJQlQrMuu/50O2e7PWuhDn/R+qkc1E6XlLMRqXOTquGCHjLjQ9dc6Q0+nOqsQr7sRlmSXFsTP5P7mA= 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=VSD1IvwY; 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="VSD1IvwY" 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 68MI7R7w964628; Tue, 22 Sep 2026 19:52: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=q6hiabvjECSV60h3P cN8TqF1ioYqUF6qtCyzILAiGgs=; b=VSD1IvwYpAx7RUcim0HZeqGw1il68rElN m8r+EQ6sxlIbDTHNNRUeObGszd1Bf0vR7JHv0QEdMtd9Q2lVD9fCKgPtDwdjnKg1 lAZBH7OyoTC2XgLERL9HIewa3xHrXJUyaa4yq5do9rU5HTmd+V159/n7xdq0XlWv I9uPwO62el5g3hEbnAUeydcllbwuZsZc/eAWfV6WufJguZiSmUzvfmQ7y3ixh3v+ Yrkf2hTzUjxiHONdjCuO4xaehNAcwU3Gw3+0sLd4u4Y98FzYTAzo9Of+RozdMUU7 pNsTMJ4XaNSBKc7gnYYO71Zld5C237OOUFPEis8vviEsfTdn8+PAw== 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 4gske1fdua-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Tue, 22 Sep 2026 19:52:05 +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 68MIHVDd3239732; Tue, 22 Sep 2026 19:52:04 GMT Received: from smtprelay03.dal12v.mail.ibm.com ([172.16.1.5]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4gt67gu676-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 22 Sep 2026 19:52:04 +0000 (GMT) Received: from smtpav04.wdc07v.mail.ibm.com (smtpav04.wdc07v.mail.ibm.com [10.39.53.231]) by smtprelay03.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68MJq2LG23528096 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Sep 2026 19:52:02 GMT Received: from smtpav04.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8E76158054; Tue, 22 Sep 2026 19:52:02 +0000 (GMT) Received: from smtpav04.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id BE55558045; Tue, 22 Sep 2026 19:52:00 +0000 (GMT) Received: from Mac.ibm.com (unknown [9.61.246.118]) by smtpav04.wdc07v.mail.ibm.com (Postfix) with ESMTP; Tue, 22 Sep 2026 19:52:00 +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 v7 2/4] s390/pci: Reuse FMB buffer and preserve state in device re-enablement Date: Tue, 22 Sep 2026 15:51:39 -0400 Message-ID: <20260922195141.94548-3-oelghoul@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260922195141.94548-1-oelghoul@linux.ibm.com> References: <20260922195141.94548-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-ORIG-GUID: pVYBPRtYWfNx_-k3_FePfEJd4cRR-xwe X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIyMDI4NyBTYWx0ZWRfX8R4x8FZkTWvQ 8x4JiUIK9vHibVW80HAHIl7rOZe/B7v2lMI6RlbPLZlh0Xl/8BdVG4epGoCzShydU1Ht/XjbN1e 3c3Bunal4fZTob+69QFSoDqR0Wq0HctaJ0nnnZK7Rx1SYB7+1bOtHVYyH1BFWd7xJldS+CZE91y Y+sOaVQPLhBmewvhWXkemidfmM0Kjha2rH/nTeU+/+3GEWoW751byIxc1tW09TlP63cgyr42yPa HQWMc+Gx609XkQENnIZAtUW+/TiJU1J/CStKCX7GV415e0R4gjPiFz+pegQBaH6F5aeSJ5pY+5+ JmysBTGLRzJd/M2dH6ipGBqZ1sTvn2FCY5ib5wXqMhZzatrbEKRDVa+Lxt0Rkm7ugQFZ8zuiqVR oI+Jg3CFrf6NkJ2VWw5Wp81uSm3mo03I8ICSYTlk6cxbzOeFvlbZNMZRP3uhxQxdJH80zcnviJd jBjZ2nroIbhBa0xCfgw== X-Authority-Analysis: v=2.4 cv=O/KsLx9W c=1 sm=1 tr=0 ts=6ab2dc65 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=LP0gC_cnHC4A9rhkzj4A:9 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIyMDI4NyBTYWx0ZWRfX9W2Cr9ZNdaxH jSlNSJUE/eWgSE1h4wyKtg9fdnvxM42UnUU2c8fvpRMY2Dt3JoGensFjSj72dRzKmqylSRlEREB h+EtNHfW5aqKt+i7zdzcgnmWLxk8RDo= X-Proofpoint-GUID: pVYBPRtYWfNx_-k3_FePfEJd4cRR-xwe 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-22_03,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 malwarescore=0 phishscore=0 impostorscore=0 suspectscore=0 bulkscore=0 priorityscore=1501 lowpriorityscore=0 adultscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609220287 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 | 77 +++++++++++++++++++++++++++++-------- arch/s390/pci/pci_debug.c | 2 +- 3 files changed, 63 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..815257ddb6c8 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,8 +768,14 @@ 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; + } + + guard(mutex)(&zdev->fmb_lock); + if (zdev->fmb_enabled) + zpci_fmb_reenable_device(zdev); =20 return rc; } @@ -1003,6 +1040,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 Thu Sep 24 14:26:05 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 627CF4AE8DC; Tue, 22 Sep 2026 19:52:11 +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=1790106732; cv=none; b=Topmwkx7TFqHyWOZRxsbQvudfRLmKYvrKu1t3wWtbqzTzVr8uvu64Wool/sb/+Y2PFnWo4XaVP9PSCA54+XhHix12iIJoAdD7UyEd+OhEWJUjeMv5f2O7HQ4L5c+tBhWSaLrWet8kBnlWMvERS9h8+FaRTz2sulYRfqh3GR6QXA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790106732; c=relaxed/simple; bh=I1fVx7xkfzQZGNlOcQsdhAgR+UHVKsjkiVSiEjNinOU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UqY5gAeUtm4aqRWfdyp2Btzj2SKT6W67l6Q+Hg3CKUuEB+2TMDlJv/PoNDx+B3EE/c6YVaEUPSdEvSXv0bAbBCU+/PREv9YhX4zI7uK2sF5ybqs0MXo6DCKEoqu+oLn9S6X6MJ3tAnUmGqE4bd9KyzbhtZ4SaGGTdzs/KhWwBkU= 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=IbfGAjqT; 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="IbfGAjqT" 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 68MI78Qt1156917; Tue, 22 Sep 2026 19:52:08 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=Rz0dDOvRH7Cb2Oji0 W3dPt+bW/NxAh3YonG9VziKXq8=; b=IbfGAjqTj2gqHpWwnfuNXbUgL8QqSGPlX +AMEiQp2myF4+3bJMzqeTNRrtheocylMW9KHL4BoIrIscSTagVgerG8Y0+4u1Uq6 JAL7ysre0d52Tgx3lgGTiioMQggd5UCKU9wWS8ZntvP9DSQ2xHOFY2Oew0zYtWdJ Jnv+cG70ozPQiW1LkTknGhHgm7c+8c9MVI8difgWX2fBQOjpCQO4PsNzpLujAux+ ol3nRn81snhB/JkEJ6hTkyRHv+ptYqQd2Km7nKYDq2h370toXS63ySeHS+9zCL3L KMUIkkNM+yJgs3HmCOrDh+b6DDMUgfypRTlLRgGcQCfwKNYr5xUbg== Received: from ppma11.dal12v.mail.ibm.com (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4gskdv7ctn-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Tue, 22 Sep 2026 19:52:08 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.11/8.18.1.11) with ESMTP id 68MIHUrB4187941; Tue, 22 Sep 2026 19:52:08 GMT Received: from smtprelay05.dal12v.mail.ibm.com ([172.16.1.7]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gt7dyb174-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 22 Sep 2026 19:52:08 +0000 (GMT) Received: from smtpav04.wdc07v.mail.ibm.com (smtpav04.wdc07v.mail.ibm.com [10.39.53.231]) by smtprelay05.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68MJq4eu29753686 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Sep 2026 19:52:04 GMT Received: from smtpav04.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 887C458045; Tue, 22 Sep 2026 19:52:04 +0000 (GMT) Received: from smtpav04.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id BB14A58056; Tue, 22 Sep 2026 19:52:02 +0000 (GMT) Received: from Mac.ibm.com (unknown [9.61.246.118]) by smtpav04.wdc07v.mail.ibm.com (Postfix) with ESMTP; Tue, 22 Sep 2026 19:52:02 +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 v7 3/4] s390/pci: Fence FMB enable/disable via debugfs for passthrough devices Date: Tue, 22 Sep 2026 15:51:40 -0400 Message-ID: <20260922195141.94548-4-oelghoul@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260922195141.94548-1-oelghoul@linux.ibm.com> References: <20260922195141.94548-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-ORIG-GUID: SAIoarXcB7oAvNnxcniHfG-RK1AKzhsJ X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIyMDI4NyBTYWx0ZWRfX0N+t3swFV2O0 5Ac9EGMHNba7J6VuIaB6A2gPZTQw2DRcj2zREtlQTjCj5GCNUOpC1DNSFwnXebTCDhHp85iYuED q6/YJ1yt3rWj5smn62W/yMYju65lPmI= X-Authority-Analysis: v=2.4 cv=FLiOVOos c=1 sm=1 tr=0 ts=6ab2dc68 cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=VdqzKS8jKosA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VnNF1IyMAAAA:8 a=0_QKAakMeY9AEM467WoA:9 X-Proofpoint-GUID: SAIoarXcB7oAvNnxcniHfG-RK1AKzhsJ X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTIyMDI4NyBTYWx0ZWRfX7qM+K733pWv/ VXd8y1z5XQDrHTLBVg9QsfbBZBh4o1d3eUR+89Ta+QohsYd+Bo5IikJcTw+YAjxt2B/uTkFz7PQ Z5qkZ7fzdq6BUz+/N3HauGV8czQ30o60vxFUw7WGpdHq5XXCPVlmTj1/B6dIDH/Px3ceOs2Egyg QMX2hMOQjpwEpP7MYd6Vcj9yeWlGeIYqYsyiLBAOUbhHUaDXwJpm5QRB0vcYiLMHHCrsvIIVRO2 5cmebRMtidGS/83yPWtSHwEWTuOrrARVpNr9vTIYqvHBO/1EYEq9/J2Uj8dSDbXCf2DnCUhr13U ZAGqVStqgyMBDLZkfTkduaA5RpOX39bxhNklaGfe8VnmMoiYBPFiQW6VbDnrPQv0rGgq8bK0ebv FMeNwBVwArr72DlP5pMxGWaJ+kaNAftxdbv6UBQ97+7oCY24FSWrOkAG7W5zRHZGbO70E9c7naS tKkaW4tGes1J5CbRqbA== 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-22_03,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 impostorscore=0 phishscore=0 spamscore=0 clxscore=1015 suspectscore=0 bulkscore=0 lowpriorityscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609220287 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 Thu Sep 24 14:26:05 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 CB8464A6CFC; Tue, 22 Sep 2026 19:52:12 +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=1790106734; cv=none; b=dcqQ1vFmPxU5s76Wit9iZK6RCmwxtrosUnv+lTm8FpbCGik+LSqmzuQ7KRy58XCSDDxzi5vsB3CqwgkuW1uuhjc53o8czKgxsnJeIueQK5mzNqK2nqSi4k7A3MW9nMoDQ/DctupOXqQdS8sESgpnz60iE3+ReADFvdD6YJYuOjk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790106734; c=relaxed/simple; bh=mY4UP2f4L77OnrXNl12uKtgZB9nrnrL7BdEDy+bgdE8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HK1h9GvUq96UzMCQ3CUfPr2znHyH/Nudpasd2NogDtIfsiRVAO/mraN8uWPK/Xqe31GBS36flyYmw0Z+gnW2Q8Iyf5CVLqASH1BeBCawJCKQINmFMXbqRwrHYlJbnn/Lk0MFxB8WnuPTBS55xuLp4PJPJNaQ3DzhfdCmo6GgzeE= 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=e3wOmI5r; 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="e3wOmI5r" 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 68MI6wXn1128975; Tue, 22 Sep 2026 19:52:10 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=e3wOmI5rhFd7wTrWoXfAc2KdIk4p1Tvma Oeln3MPhqQCOIbRp01YRQBNGt89r7kwKbZKFkEpxS2pg5kjaf0I2yB1S4dO/9HxS h8tS39NAg/dSbA3rwskTN8n1oZvjhUAUHvk2jP04uY1LfIY3ACD5o5a8VE7WksJw 6J+SJNiBBvOOg/6L6UVyBmSsSihzBmmbTpzuANCdlW8cH0Eyq5Z7GsD5GlGs5epx 7C6wUPE9D2LCs/fsyw9ZVfXUdw20OA/KYBxVbz065SQBgWmYE0JmL/bkyIl5ZePw eA+EGYuiD2bmq4ctPT0cUuWVgCS2qapXlb/RMd3tkBEq5iTt0p/kA== 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 4gskg2fr1j-1 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Tue, 22 Sep 2026 19:52:09 +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 68MIHdGj3279480; Tue, 22 Sep 2026 19:52:09 GMT Received: from smtprelay07.dal12v.mail.ibm.com ([172.16.1.9]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 4gt4qqbd04-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 22 Sep 2026 19:52:09 +0000 (GMT) Received: from smtpav04.wdc07v.mail.ibm.com (smtpav04.wdc07v.mail.ibm.com [10.39.53.231]) by smtprelay07.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 68MJq6OX51183982 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Sep 2026 19:52:06 GMT Received: from smtpav04.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 886F958052; Tue, 22 Sep 2026 19:52:06 +0000 (GMT) Received: from smtpav04.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B4C2358050; Tue, 22 Sep 2026 19:52:04 +0000 (GMT) Received: from Mac.ibm.com (unknown [9.61.246.118]) by smtpav04.wdc07v.mail.ibm.com (Postfix) with ESMTP; Tue, 22 Sep 2026 19:52:04 +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 v7 4/4] vfio-pci/zdev: Add VFIO FMB device features Date: Tue, 22 Sep 2026 15:51:41 -0400 Message-ID: <20260922195141.94548-5-oelghoul@linux.ibm.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260922195141.94548-1-oelghoul@linux.ibm.com> References: <20260922195141.94548-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-ORIG-GUID: Ih2ZwN7__0c5mkxLI7SuZyeFSp3J2mJ- X-Authority-Analysis: v=2.4 cv=I43w19gg c=1 sm=1 tr=0 ts=6ab2dc69 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-Spam-Details-Enc: AW1haW4tMjYwOTIyMDI4NyBTYWx0ZWRfXxsObF/FjpK+d oNrS/XTNC3H6/1bqX3Qu4fmRyvJQWZc6T1Uyu7S8AZIqr+Od0mModclZKL+7gbp7yXR5i6tv8IR d1dFrQ1HNard2twTWaPt+bhOsxzS+mUQnJ4ohnQIOFLIpumYhxMFzLhsXudupWzqPPktzvrt5oH QLl7SaX2v2/7jvM4x78UhO6giOMk3kqp2gDsLAMKq8rqy/7iFLP5h4P9RjlJ9GuzF7N2ZMLPm7F 0frkQOgn2v3gIdKOTmXsTQG3eRvcyOF3XXKgA8eDZlNhjibiRuPCiGrN3zhH3KzqLdkv6eCU6Jn USzBg6IPQC8GHl04iSGqdvP2Ima38TIN/3QM/rrbuO70jhK/ijq0wWMghMjPC742dzlXnE9wUMG sivyJeSWi9frqn7U4pt0Z42AU2nlRKSeWD9I3l7xLVEURLFRDtmEFqQRItas37m7W7PHcqHl0l3 4vqkN+adOP6HSg/LR+Q== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTIyMDI4NyBTYWx0ZWRfXzKTaGNEsx5Ha Waz0eyrkeTZoVgw/ikSwlJ7X76DOOz9mfcIilxUIw7Q8h5Kl22BHQY9QReNbgL7tTAiPVby0qOD LdPcTCyo20FO1BEfb03xjw81918Qk4A= X-Proofpoint-GUID: Ih2ZwN7__0c5mkxLI7SuZyeFSp3J2mJ- 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-22_03,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 clxscore=1015 adultscore=0 suspectscore=0 impostorscore=0 lowpriorityscore=0 bulkscore=0 phishscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609220287 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