From nobody Thu Jun 11 22:53:36 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 523053D5671; Mon, 8 Jun 2026 17:20:18 +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=1780939219; cv=none; b=XBg91ULU8f9Sl5pNg4hiENzr1b05g7vxRkqPVBc5Zy1T62uCrkBYMIFkwCzlIG30w1T0aJFrEFHD5ouBJ9uzo1IKOxQz4YWCBr4/43XQEe9rkei25VmOqwrtTv1WHGUP+i8fDT2tj7JkiaVnP04qBbzNMPl7l3axB0PLK4H8fVk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780939219; c=relaxed/simple; bh=CTdsnjvENitaKcBHbnJI+lMPMsxDw/NS89qtmmj3m50=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OO7BGHbp0FIi1sGWjqNvZ/fPIwBoc+AZwtBQgzLgsDL0FkiJNtfxcVYjmZVLfK5MQNDw115rNeXdjPyybpQqsqwGI9r0eB/nfEheOW6W3A0dBsTBqPvrttlh8Njs6tuYli0zUsL9gNnelFnY8NnlnY2KbmQwtTrmVjnJs3yCFfI= 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=o8xGqwy+; 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="o8xGqwy+" 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 658E4dCk3934488; Mon, 8 Jun 2026 17:20:15 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=ZLEwJOF00jQW0ElHk J3+PTGcXToawy4Upyvmscf5aL4=; b=o8xGqwy+/EUsnjXsFJ6XDpij55G13Z/iT CfYumlLMKg24EgdOuJA9+0tvzMwWx3D1ybUklT3eH/GBYd+HZGKYcNJAKnE8uOnc FNU3R41cSYOXR6rlf6yxu6cLrTPis0lxy9SoiUBqM92LU3LDdUzZnQeLzIBAk4bj ka1FiHH5Bd4YL5LQtvYT5yac1vK7H4QwYJlsgnnSC6k5KQ6dY62mDv1gOFssEW3m BsA/LSB9TINWBxZOL6DwqMjof6LpsO9mxN0xmCT1/xewdvpfWPYkm4GceZuDdIFI 7h9Oj88PSFJBjdq10i6eXNWXEjz9+6U8BYUFt5/ifv0CJWZypwdRw== 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 4emb6sraf7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 08 Jun 2026 17:20:15 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 658H4dQ2003185; Mon, 8 Jun 2026 17:20:14 GMT Received: from smtprelay02.dal12v.mail.ibm.com ([172.16.1.4]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4en0jy63vt-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 08 Jun 2026 17:20:14 +0000 (GMT) Received: from smtpav06.wdc07v.mail.ibm.com (smtpav06.wdc07v.mail.ibm.com [10.39.53.233]) by smtprelay02.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 658HKCLV13828662 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 8 Jun 2026 17:20:13 GMT Received: from smtpav06.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A57C658054; Mon, 8 Jun 2026 17:20:12 +0000 (GMT) Received: from smtpav06.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4BA605803F; Mon, 8 Jun 2026 17:20:11 +0000 (GMT) Received: from localhost.localdomain (unknown [9.12.78.81]) by smtpav06.wdc07v.mail.ibm.com (Postfix) with ESMTP; Mon, 8 Jun 2026 17:20:11 +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 v3 1/4] s390/pci: Hold fmb_lock when enabling or disabling PCI devices Date: Mon, 8 Jun 2026 13:18:47 -0400 Message-ID: <20260608171850.62829-2-oelghoul@linux.ibm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260608171850.62829-1-oelghoul@linux.ibm.com> References: <20260608171850.62829-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: Yjwj9d0ywR1IPjad2QdJBu9vfgUxeeC5 X-Proofpoint-GUID: Yjwj9d0ywR1IPjad2QdJBu9vfgUxeeC5 X-Authority-Analysis: v=2.4 cv=ZbEt8MVA c=1 sm=1 tr=0 ts=6a26f9cf cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=FelO9ux0wxsA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=RzCfie-kr_QcCd8fBx8p:22 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=5NbLduwtq9nBFWGw9KEA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNjA4MDE2MiBTYWx0ZWRfX6/BSqNpemuvW ph+qiwRZy9ffCyCt37x9+UPXBcJLiOU5kvMDutqFNd89FWTzzA6C1HYkoH3zVwJ/K8Vh/7f1/J0 Ac1bUakamuPYnla+uHBl8+l1YLeIjqWj69dQr/RHNgThWqD9hsWmIDqERJO4/jQG8HBRzN/SNFK wOwNhdIVNMW+MwtF4zsRJ5TOOCFSPXGZL7O1QGVPLPXUeET5joUR2/vOsrhBpsco1nzs7CJIHR3 7MfWQ9OuzZ9Q9vr/d0uCenmMzHkJA0CcrVd+yhpwISwzw5GC5BLa3pYvrslcCkeLz0s6saCbKdD rQDSRUVWHmJTzQuZRarb2absb1S7emzCEjsTRVJx3kRR0J1V6PC1UTkfnVUCxtvnwYCEqXvW9Ek CqHCE8mPxCbGYmDpdqOH9o6nK/UIvX6U7hnAZZbUMC5rF4oeofO2Tw/xVtw890lvou96EPiMzw+ Lm2OIMPw+epjOeINQLA== 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-08_04,2026-06-05_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 impostorscore=0 malwarescore=0 lowpriorityscore=0 clxscore=1011 adultscore=0 spamscore=0 priorityscore=1501 bulkscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605210000 definitions=main-2606080162 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 Thu Jun 11 22:53:36 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 C411D3D9049; Mon, 8 Jun 2026 17:20:20 +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=1780939222; cv=none; b=Yx/jPINAVud0cygyqwi8NBZU/znnW7pWOW4JQeCjKLx+S/8hIAWhZH3GoV+HOqi6nT+L18tcV5HDdJku8A4onerjOcZsjvyHPnaXgmVooD+w5i+xY4EtrqvU+V/Vu0O7iyC6hqyoXWhfiqMfKetnTctpMV2S7q+ADzCMsvEwpag= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780939222; c=relaxed/simple; bh=lGYWXHOh1KO3b7KM58MKy3iF6WpXrtwyauv0s/bMl+0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PsFiE+xK8wrxzgoFrnI0TYE1HEFHdKl/vJAMLMYsvrQSi5Gtn36p+SrdyrlPgZcDAKRBi1SxQZ6BcJHvom0ub4v6wL6e8h5xfIF0dinyPtVl1nuAxlfBMsow7fMOyzW3r12P7xY8spNjpxC+Et9agkALE1/YDIbXcYuesh9WvQU= 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=TCq/8MqB; 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="TCq/8MqB" 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 658DlC48458596; Mon, 8 Jun 2026 17:20:18 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=iWVLpdzEPDvmlH+4K Qy4naQGATN6IZkCBJo61YTYJrM=; b=TCq/8MqBL3nu+icBmjEHYOKTZfcHGp8EA n6c0hUUa/UJ5qJWyhtIFG1EHSROZK6OsQHjdPMlrGXBmbpg/dfyCGqcnVSdKrsyR YRAlVZcyfZjJYpFqP68MvfJKPXBnsjn3IaQi3U2oxD61XjHihQEL+sm/AsbKOFfr JPSfrctIjKZCLfv+ZfPk1skcsrmxzgHfQ3QLeWEBlOsEmfM9E8uZmnYhYbBO4E8F Scedogj8eTHaRkW66bY7syINI6mS7wR40h4N4Ng5m+j422/MrYr1NuTQlGmdhcOo YklYquZiNgGYB8m/FENTf8FrKGvSEkw6Vp5onJLO5fdU6rU764dmQ== 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 4em9ye0en5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 08 Jun 2026 17:20:18 +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 658HJfOh019267; Mon, 8 Jun 2026 17:20:17 GMT Received: from smtprelay04.dal12v.mail.ibm.com ([172.16.1.6]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4emycgx92y-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 08 Jun 2026 17:20:17 +0000 (GMT) Received: from smtpav06.wdc07v.mail.ibm.com (smtpav06.wdc07v.mail.ibm.com [10.39.53.233]) by smtprelay04.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 658HKEFC19923496 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 8 Jun 2026 17:20:14 GMT Received: from smtpav06.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 280B35804E; Mon, 8 Jun 2026 17:20:14 +0000 (GMT) Received: from smtpav06.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C844958055; Mon, 8 Jun 2026 17:20:12 +0000 (GMT) Received: from localhost.localdomain (unknown [9.12.78.81]) by smtpav06.wdc07v.mail.ibm.com (Postfix) with ESMTP; Mon, 8 Jun 2026 17:20:12 +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 v3 2/4] s390/pci: Preserve FMB state in device re-enablement Date: Mon, 8 Jun 2026 13:18:48 -0400 Message-ID: <20260608171850.62829-3-oelghoul@linux.ibm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260608171850.62829-1-oelghoul@linux.ibm.com> References: <20260608171850.62829-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: AW1haW4tMjYwNjA4MDE2MiBTYWx0ZWRfX41G65X6z8E5+ V7LCWxW1WYxpJbl/dQ6U5+6zL2UbxjaO2mFUB/Y9MY3QscPCVDGEa7LAJ3K0RcQSLPI9KNCoYO/ rB9RmN63bVwidZnXa0ouGGRqnVSNFE9dXSlgqMa9w0/KdFBhC5J6WbCGQr5b6rnj4MLomGEbBPs FO1vxE966e3WxgMD+nHgHFGdf0qO15WkeoXLPisL4NtuYA0lBsgK8fl4SfedFUgnivviVS6k0BJ LFWa7O+sSUU3fqsyXeMEaBHkdWiO4Cn6UIatDPPLlLEYTJMu2b4KLeQlHSM1cod0/4jn+wmGyGl JIKcKAHqPKBLj77cKP3G9do2qexIHJTamInTKK8GcEfl4miElMipP1ekagzwSIf+KxDuCA9XPcH 4vxtd4wWKvkxkrKYECViPurSVCH+Grnkihz5P+vA48ElqtRvwZYCUcjrWYtipE3DYOvKZdFKXww p6Vmp1S812IEv+IEWjQ== X-Authority-Analysis: v=2.4 cv=QKhYgALL c=1 sm=1 tr=0 ts=6a26f9d2 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=FelO9ux0wxsA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VnNF1IyMAAAA:8 a=6Vtv6p8LYkiH6MEZsLwA:9 X-Proofpoint-GUID: 6QlsgfZDLCv5MbuQL9ogMY3qUyZspVMj X-Proofpoint-ORIG-GUID: 6QlsgfZDLCv5MbuQL9ogMY3qUyZspVMj 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-08_04,2026-06-05_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 lowpriorityscore=0 bulkscore=0 adultscore=0 phishscore=0 malwarescore=0 impostorscore=0 suspectscore=0 spamscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605210000 definitions=main-2606080162 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 | 96 +++++++++++++++++++++++++++++-------- 2 files changed, 78 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..652f0b7e8893 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,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; + } =20 + mutex_lock(&zdev->fmb_lock); + zpci_fmb_reenable_device(zdev); + mutex_unlock(&zdev->fmb_lock); return rc; } EXPORT_SYMBOL_GPL(zpci_reenable_device); --=20 2.54.0 From nobody Thu Jun 11 22:53:36 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 67B753D7D6C; Mon, 8 Jun 2026 17:20:22 +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=1780939223; cv=none; b=sR5+H/ZDNbi0ABaUPzZC0dNWpaWJgl8nS8g1qTlXle/gNkOn3EnTFMczUAIIp0nyRIwvu/fCnZ5jJnGFuNqWqYmnvWa+ZckJBUMx81hOvmdHjN0v28jeLuj8ivAjxH9bzP2awveKaujl0/IRL+9xSAZB5drmUmvRkL+5YxIvKFU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780939223; c=relaxed/simple; bh=CBrkamJy3FIYuK1gFczZaD8DxdodxAq7HlhfYfDLaTc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fQ9JMrIdFNo2u95bGaAFfQbwYnDKNMHXWyWqavkJruiEPfymB4Oz1sf/FDQOJlYKb3+Y9K5C3r0/wElo/OwS1jlSLfs+X0LLvsrUOVVC7cfWhmgzbYs8QvtNAaIGsXEqTsr8vjFIZk6cSoi5JalJR2pHslhzZsPeFi7giZONzJc= 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=hxRbKJAa; 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="hxRbKJAa" 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 658BggrW647384; Mon, 8 Jun 2026 17:20:20 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=5ft+gZUk5hSgkcxbd ++kdstLQcsgFedkiN78GilRTfI=; b=hxRbKJAadWtuiMqJUPYracKplBPN4+iNb 8CoLkzDOIsnH5nXBXczh8GTIamI+qvzpmwgE4YMWKmSAAtV9WQCegrqfHDqvrwvX gy2jc0jCmYpPmc8FARwBcBhFsHBnD94BvXhBPls9CeL+7cnFEhZAHuFHuk3lojZn pmyRQqnMDFzRLtdZ44nWm4v8vBuULTZOV+9jaYcoSbMAkptP4+WOP6N8jb08zxqw 5cpVlAnc0iUgGh5+hW2NA8ACvfoZnZjjn0ZNCMwXFs5xwZsg65PZZwmnjD5ptiY+ +pWQx4QmBTNgMPS61H99YzavplKo2IOv+sW/fd9c88lT36wr3NYCA== Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4em9ye0en9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 08 Jun 2026 17:20:19 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 658HJeHN004039; Mon, 8 Jun 2026 17:20:19 GMT Received: from smtprelay05.dal12v.mail.ibm.com ([172.16.1.7]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4emx8vxf25-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 08 Jun 2026 17:20:19 +0000 (GMT) Received: from smtpav06.wdc07v.mail.ibm.com (smtpav06.wdc07v.mail.ibm.com [10.39.53.233]) by smtprelay05.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 658HKFTo21496480 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 8 Jun 2026 17:20:16 GMT Received: from smtpav06.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 943635804E; Mon, 8 Jun 2026 17:20:15 +0000 (GMT) Received: from smtpav06.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4B82E58055; Mon, 8 Jun 2026 17:20:14 +0000 (GMT) Received: from localhost.localdomain (unknown [9.12.78.81]) by smtpav06.wdc07v.mail.ibm.com (Postfix) with ESMTP; Mon, 8 Jun 2026 17:20:14 +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 v3 3/4] vfio-pci/zdev: Add VFIO FMB device features Date: Mon, 8 Jun 2026 13:18:49 -0400 Message-ID: <20260608171850.62829-4-oelghoul@linux.ibm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260608171850.62829-1-oelghoul@linux.ibm.com> References: <20260608171850.62829-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: AW1haW4tMjYwNjA4MDE2MiBTYWx0ZWRfX6QURuQ52S8VI PZHHn//2v7JrcnFaMubNQYN1n3O/bGyWrmtkQBL3rgBZbtvAacGePjk0pRmSKhZ3Bzkv6nHuiub xDi63lSMY6XqxO8fASNXVZBZJSSufmn92/wOTBDRo82lVzojcApl7eMlItuuJapuqc8KoBVN/+4 Ts730MDfytL26ZSoHeLAUy0LzQt9T409dhmxC2ODfYMFy7zRWo5rGKfcbRx3xIci8jA4ZfqWAFC 9xZrfxMkyrzXCrkG5m5APNBuODB8HttMCHw1avYhn8uRU/FQd4ybV4p9wtQNM7+xJJEUbMZALXq opUY/hozPU+5hki6ZZOIrH3E+qY93G67qQBdtJ64pLxTz/j4JjDKx1fe+jygPjS52YWnZoMmmJJ PIap3/4V+wwgdd7Vu40MlPoTf6IMWPzIXD2BjWREMJntgmoZVjHt7gyng51CPKdYy2tL5PWBh3f cnqoPONFHzkBLY9DGtA== X-Authority-Analysis: v=2.4 cv=QKhYgALL c=1 sm=1 tr=0 ts=6a26f9d3 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=FelO9ux0wxsA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=V8glGbnc2Ofi9Qvn3v5h:22 a=VnNF1IyMAAAA:8 a=wtvrgtD0Hc2VqHSVShsA:9 X-Proofpoint-GUID: BpqdmU9PCgIo3C0NkkAZDOh3ORdTwsiZ X-Proofpoint-ORIG-GUID: BpqdmU9PCgIo3C0NkkAZDOh3ORdTwsiZ 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-08_04,2026-06-05_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 lowpriorityscore=0 bulkscore=0 adultscore=0 phishscore=0 malwarescore=0 impostorscore=0 suspectscore=0 spamscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605210000 definitions=main-2606080162 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. 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 | 57 ++++++++++++++++++++++++++++++++ include/uapi/linux/vfio.h | 29 ++++++++++++++++ 4 files changed, 108 insertions(+) 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..09454495ee23 100644 --- a/drivers/vfio/pci/vfio_pci_zdev.c +++ b/drivers/vfio/pci/vfio_pci_zdev.c @@ -167,3 +167,60 @@ 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; + + guard(mutex)(&zdev->fmb_lock); + + if (copy_from_user(&fmb_enable, arg, sizeof(fmb_enable))) + return -EFAULT; + + 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_temp =3D {0}; + 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; + + memcpy(&fmb_temp, zdev->fmb, zdev->fmb_length); + if (copy_to_user(fmb_read.data, &fmb_temp, zdev->fmb_length)) + return -EFAULT; + + return 0; +} diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h index 5de618a3a5ee..3988e8690e0b 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 { + void __user *data; +}; + /* -------- API for Type1 VFIO IOMMU -------- */ =20 /** --=20 2.54.0 From nobody Thu Jun 11 22:53:36 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 7CDDC3DA7F3; Mon, 8 Jun 2026 17:20:23 +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=1780939224; cv=none; b=CJRwuHiCTzEWp8YaomiDahXI8xw+KKt9ivQRh6ediP8k7PmiDdZrrsuoRvcpoZxEzv9uQslirn0s962gm/bWUTNimBw3Vr9Ys564ZS0Jj0m/RhFbZzCRhw2XTUvPtqkFkMcAFvzp4fVnBkwkxNinpHQQlT1kRhBupYlH7fQoz84= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780939224; c=relaxed/simple; bh=+/MJbz1Nx9N5DsM/+uCTrYmoBCKXQgRFW6ylS1HpNR8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VbPa+u+msfJM/L8xbRA+o4VVVpulhh/+Vle+yT8c6ynHZkf+01gxol4KsBosEkyvYVkKzKXqEzmfs8nGrs7lS40ZNoDmn43KqLopt3Ud8aEGHPJNUdIITYukkQz26+Tt304OL5U6R5AxrSDs6Suqz3RYxPCMfj7fwlk9gzVKiTA= 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=l7Coh9Hu; 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="l7Coh9Hu" 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 6589B9Bv2074794; Mon, 8 Jun 2026 17:20:21 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=l7Coh9HuFLooES7Wg+OKgWCv6XzFgnESy o2FjZPyjAgXw+5J2/NT6WNbLGilOUnKv3n6ECi2o4Ic/5Bc1ihEiT0/8+DNYLc4p j8QX+/gdl5Yy6xkWAsqIpngA+lrRfSlrEQ4yf44olu0W2zqI4nsGqkeUS4Vyq8la EjyKHQlu4pVmdItDyEYlaMioEIHvVna7Zpmzo7LLXpGoIctRCgGAL5q/aq5c/yl6 NCh3w5ukznrFR7W5cOWjZM1yQfTNw70C9KQFkQOSiKD/1InlPjJjAidNb7ks7R0k PAXVnCZynAyQ2w58I7sj7wZINTFwkEYULxUbFJ1Arl9pRmu5s3njg== Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4emb958eyb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 08 Jun 2026 17:20:20 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.7/8.18.1.7) with ESMTP id 658HJbbT019348; Mon, 8 Jun 2026 17:20:19 GMT Received: from smtprelay07.dal12v.mail.ibm.com ([172.16.1.9]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4en03fx5g2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 08 Jun 2026 17:20:19 +0000 (GMT) Received: from smtpav06.wdc07v.mail.ibm.com (smtpav06.wdc07v.mail.ibm.com [10.39.53.233]) by smtprelay07.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 658HKHXW29819480 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 8 Jun 2026 17:20:17 GMT Received: from smtpav06.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 16EA758055; Mon, 8 Jun 2026 17:20:17 +0000 (GMT) Received: from smtpav06.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B6FDF58054; Mon, 8 Jun 2026 17:20:15 +0000 (GMT) Received: from localhost.localdomain (unknown [9.12.78.81]) by smtpav06.wdc07v.mail.ibm.com (Postfix) with ESMTP; Mon, 8 Jun 2026 17:20:15 +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 v3 4/4] s390/pci: Fence FMB enable/disable via sysfs for passthrough devices Date: Mon, 8 Jun 2026 13:18:50 -0400 Message-ID: <20260608171850.62829-5-oelghoul@linux.ibm.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260608171850.62829-1-oelghoul@linux.ibm.com> References: <20260608171850.62829-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=N4UZ0W9B c=1 sm=1 tr=0 ts=6a26f9d4 cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=FelO9ux0wxsA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=U7nrCbtTmkRpXpFmAIza:22 a=VnNF1IyMAAAA:8 a=LQOIlC5QHTpW1RRPx_YA:9 X-Proofpoint-ORIG-GUID: oeAvw-mMcnLW6W8SdDO7KRaq9dk7piA8 X-Proofpoint-GUID: oeAvw-mMcnLW6W8SdDO7KRaq9dk7piA8 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNjA4MDE2MiBTYWx0ZWRfX5yuQeHLGXYr6 vTgnwNZePhMF7cVUQYaVGfa7NcCEy+DryGrFPh+jtdXenZNKzK7sOhnc6uTbcBhibzChl7xtDO0 9ittDgmnrDfayOoXyah1YVFZV2Bu/ebAHI+yPuATVhTEHBshJCsHo4S0NQHpY40Ng2qUaPmckaU W3SXcPxfsd4g2v5u5CUqzSGBGgk7aruyLi4qcgax2cGSPiOGTSDpY1AMhp9BdIaPn9k56t5KHZs tgYvT8uRR07eUWMGHddlKABY+5UBq4ihNRxVTcL8EjWuT6rw2Cq83GdhBqKS7eKCHcH6My594oQ PJGh3qHHGClbHadbBh8jFyYZbIvPYgzH6s8Znls1uYW9B1MrDA0YG/1kDlzomtiSJCAPqJaw+mD jV75QyUCh5ZYL6Z9Bh7VYRoPN4BJJhfH0lYdsN9C8VYAs05QG3SLRW7kyF40WNvGEfcSp/w8XKA 2eDxHyb6rh+EUn8WPjg== 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-08_04,2026-06-05_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 malwarescore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 phishscore=0 impostorscore=0 adultscore=0 priorityscore=1501 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605210000 definitions=main-2606080162 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