* [PATCH v9 0/4] vfio-pci/zdev: Improved zPCI Function Measurement Support
@ 2026-10-07 13:59 Omar Elghoul
2026-10-07 13:59 ` [PATCH v9 1/4] s390/pci: Hold fmb_lock when enabling or disabling PCI devices Omar Elghoul
` (3 more replies)
0 siblings, 4 replies; 10+ messages in thread
From: Omar Elghoul @ 2026-10-07 13:59 UTC (permalink / raw)
To: linux-s390, linux-kernel, kvm
Cc: oelghoul, hca, gor, agordeev, borntraeger, svens, schnelle,
mjrosato, alifm, farman, gbayer, pasic, alex, frankja, imbrenda
Hi,
This patch series improves support for function measurement for zPCI
passthrough devices on s390.
Changelog
=========
v8 -> v9:
* Patch 2/4:
- Remove the intermediate disable step from zpci_fmb_reenable_device()
for more uniform semantics
- Rename fmb_enabled to fmb_requested with the intent of tracking the
desired status of FMB enablement
- Make zpci_fmb_enable_device() delegate to zpci_fmb_reenable_device()
* Patch 4/4:
- Set fmb_requested when the user enables measurement
v7 -> v8:
* Patch 2/4:
- Replace the fmb_enabled bitfield in struct zpci_dev with a dedicated
bool to avoid future tearing bugs
- Rewrite commit message for a more natural flow
* Patch 4/4:
- Replace mutex_lock/unlock() in vfio_pci_zdev_feature_fmb_read() with
a scoped_guard()
v6 -> v7:
* Patch 2/4:
- Don't re-enable FMB if it wasn't already enabled
v5 -> v6:
* Patch 2/4:
- Rework the FMB re-enablement code to reuse the same buffer again
- Make the FMB buffer persistent once allocated for as long as the
device's lifetime to accommodate an architectural quirk
* Patch 4/4:
- Update the liveness check to use the new FMB enabled bool
v4 -> v5:
* Typo in the cover letter
* Swap the ordering of patches 3/4 and 4/4 to ease merging (i.e., to
ensure the three s390 patches are ordered before the VFIO patch)
* Patch 2/4:
- Drop the refactor of zpci_fmb_enable_device() and the separation of
zpci_fmb_clear_iommu_ctrs() and zpci_fmb_do_enable()
- Allocate a new buffer in zpci_fmb_reenable_device() rather than
reusing the same buffer to avoid firmware edge cases
* Patch 3/4 (previously 4/4):
- Avoid reading from userspace while holding kzdev_lock unnecessarily
* Patch 4/4 (previously 3/4):
- Drop allowing usercopy of the FMB when initializing the kmem_cache
- Avoid copying to userspace while holding fmb_lock unnecessarily
- Restore the FMB bounce buffer to achieve this one
- Clarify uAPI documentation and ensure it accurately describes the
behavior of the VFIO features
v3 -> v4:
* Patch 2/4:
- Replace mutex_lock/unlock in zpci_reenable_device() with a guard
* Patch 3/4:
- Allow usercopy of the FMB when initializing its kmem_cache
- Move the guard in vfio_pci_zdev_feature_fmb_enable() lower to only
protect the FMB
- Ensure vfio_pci_zdev_feature_fmb_enable() fails on double-enable for
consistency with the documentation
- Eliminate the bounce buffer in vfio_pci_zdev_feature_fmb_read()
- Replace the void pointer with __aligned_u64 in the FMB read uAPI
structure
v2 -> v3:
* Patch 1/4 (new patch):
- Fix race conditions in pcibios_enable/disable_device() with regard to
the FMB enable/disable
- Assert that fmb_lock is held within zpci_fmb_enable_device() and
zpci_fmb_disable_device()
* Patch 2/4 (previously 1/3):
- Move the FMB enable logic into a static function zpci_fmb_do_enable()
to reduce code duplication between zpci_fmb_enable_device() and
zpci_fmb_reenable_device()
- Reword commit message to use the imperative voice more consistently
* Patch 3/4 (previously 2/3):
- Split the previous VFIO feature into a SET-only and a GET-only feature
for enabling/disabling and reading the FMB respectively
- Remove FMB definitions from the VFIO uAPI and instead treat it as an
opaque structure
* Patch 4/4 (previously 3/3):
- Clarify goto label name to reduce misunderstandings
v1 -> v2:
* Patch 1/3:
- Address a possible race condition in zpci_reenable_device() caused by
calling zpci_fmb_reenable_device() without holding fmb_lock
- Assert that fmb_lock is held within zpci_fmb_reenable_device()
* Patch 3/3:
- Address a possible race condition in pci_perf_seq_write() caused by
consuming zdev->kzdev without holding kzdev_lock
Motivation
==========
The firmware on s390x machines allows for tracking a variety of statistics
relating to zPCI devices in a function measurement block (FMB). However,
the kernel currently lacks a structured mechanism of sharing this
information with userspace, beyond /sys/kernel/debug/pci/ID/statistics.
This can lead to shortcomings when running a guest on KVM with PCI
passthrough devices, as QEMU is unable to provide an accurate FMB snapshot
to the guest.
Proposal
========
We propose adding a new VFIO device feature to zPCI passthrough devices,
allowing userspace programs to read the latest FMB snapshot as it is
written by the firmware. We ensure that function measurement enablement is
preserved across device resets on the host. Furthermore, we guard against
host tampering with the FMB via sysfs when the zPCI device is in
passthrough to protect the VM's state.
I'd appreciate some feedback on these patches.
Thanks in advance.
Omar Elghoul (4):
s390/pci: Hold fmb_lock when enabling or disabling PCI devices
s390/pci: Reuse FMB buffer and preserve state in device re-enablement
s390/pci: Fence FMB enable/disable via debugfs for passthrough devices
vfio-pci/zdev: Add VFIO FMB device features
arch/s390/include/asm/pci.h | 2 +
arch/s390/pci/pci.c | 108 ++++++++++++++++++++-----------
arch/s390/pci/pci_debug.c | 11 +++-
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 +++++++++
7 files changed, 195 insertions(+), 37 deletions(-)
--
2.56.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v9 1/4] s390/pci: Hold fmb_lock when enabling or disabling PCI devices
2026-10-07 13:59 [PATCH v9 0/4] vfio-pci/zdev: Improved zPCI Function Measurement Support Omar Elghoul
@ 2026-10-07 13:59 ` Omar Elghoul
2026-10-07 14:13 ` sashiko-bot
2026-10-07 13:59 ` [PATCH v9 2/4] s390/pci: Reuse FMB buffer and preserve state in device re-enablement Omar Elghoul
` (2 subsequent siblings)
3 siblings, 1 reply; 10+ messages in thread
From: Omar Elghoul @ 2026-10-07 13:59 UTC (permalink / raw)
To: linux-s390, linux-kernel, kvm
Cc: oelghoul, hca, gor, agordeev, borntraeger, svens, schnelle,
mjrosato, alifm, farman, gbayer, pasic, alex, frankja, imbrenda,
stable
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 <oelghoul@linux.ibm.com>
Reviewed-by: Niklas Schnelle <schnelle@linux.ibm.com>
Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
---
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;
+ lockdep_assert_held(&zdev->fmb_lock);
+
if (zdev->fmb || sizeof(*zdev->fmb) < zdev->fmb_length)
return -EINVAL;
@@ -211,6 +213,8 @@ int zpci_fmb_disable_device(struct zpci_dev *zdev)
struct zpci_fib fib = {0};
u8 cc, status;
+ lockdep_assert_held(&zdev->fmb_lock);
+
if (!zdev->fmb)
return -EINVAL;
@@ -639,7 +643,9 @@ int pcibios_enable_device(struct pci_dev *pdev, int mask)
struct zpci_dev *zdev = to_zpci(pdev);
zpci_debug_init_device(zdev, dev_name(&pdev->dev));
+ mutex_lock(&zdev->fmb_lock);
zpci_fmb_enable_device(zdev);
+ mutex_unlock(&zdev->fmb_lock);
return pci_enable_resources(pdev, mask);
}
@@ -648,7 +654,9 @@ void pcibios_disable_device(struct pci_dev *pdev)
{
struct zpci_dev *zdev = to_zpci(pdev);
+ mutex_lock(&zdev->fmb_lock);
zpci_fmb_disable_device(zdev);
+ mutex_unlock(&zdev->fmb_lock);
zpci_debug_exit_device(zdev);
}
--
2.56.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v9 2/4] s390/pci: Reuse FMB buffer and preserve state in device re-enablement
2026-10-07 13:59 [PATCH v9 0/4] vfio-pci/zdev: Improved zPCI Function Measurement Support Omar Elghoul
2026-10-07 13:59 ` [PATCH v9 1/4] s390/pci: Hold fmb_lock when enabling or disabling PCI devices Omar Elghoul
@ 2026-10-07 13:59 ` Omar Elghoul
2026-10-07 14:11 ` sashiko-bot
2026-10-07 13:59 ` [PATCH v9 3/4] s390/pci: Fence FMB enable/disable via debugfs for passthrough devices Omar Elghoul
2026-10-07 13:59 ` [PATCH v9 4/4] vfio-pci/zdev: Add VFIO FMB device features Omar Elghoul
3 siblings, 1 reply; 10+ messages in thread
From: Omar Elghoul @ 2026-10-07 13:59 UTC (permalink / raw)
To: linux-s390, linux-kernel, kvm
Cc: oelghoul, hca, gor, agordeev, borntraeger, svens, schnelle,
mjrosato, alifm, farman, gbayer, pasic, alex, frankja, imbrenda
Don't free the FMB buffer when disabling measurement in
zpci_fmb_disable_device(). Instead, make the buffer persistent for the
lifetime of the device and reuse it across enable/disable cycles. Defer
freeing the buffer until teardown in zpci_release_device().
Introduce the bool fmb_requested to struct zpci_dev to track whether FMB
enablement has been requested. This decouples tracking the enablement
from whether the buffer had been previously allocated, allowing us to
account for implicit disablement by firmware in zpci_disable_device().
Audit the only consumer of zdev->fmb and update its liveness check to
reflect this change.
Separate the buffer allocation and measurement enablement step into the
new function zpci_fmb_reenable_device(), which allocates the FMB buffer
on first use, zeroes it on reuse, resets the software IOMMU counters,
and enables measurement. Make zpci_fmb_enable_device() delegate to this
function, and call the latter from zpci_reenable_device() when
fmb_requested is true.
Signed-off-by: Omar Elghoul <oelghoul@linux.ibm.com>
---
arch/s390/include/asm/pci.h | 2 +
arch/s390/pci/pci.c | 106 +++++++++++++++++++++++-------------
arch/s390/pci/pci_debug.c | 2 +-
3 files changed, 70 insertions(+), 40 deletions(-)
diff --git a/arch/s390/include/asm/pci.h b/arch/s390/include/asm/pci.h
index 88a125b92bdd..77c8c49ba6c8 100644
--- a/arch/s390/include/asm/pci.h
+++ b/arch/s390/include/asm/pci.h
@@ -208,6 +208,7 @@ struct zpci_dev {
struct zpci_fmb *fmb;
u16 fmb_update; /* update interval */
u16 fmb_length;
+ bool fmb_requested; /* desired FMB enablement state */
u8 version;
enum pci_bus_speed max_bus_speed;
@@ -351,6 +352,7 @@ void zpci_remove_parent_msi_domain(struct zpci_bus *zbus);
/* 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);
/* Debug */
int zpci_debug_init(void);
diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c
index c055a9ad0972..bda91d79bafd 100644
--- a/arch/s390/pci/pci.c
+++ b/arch/s390/pci/pci.c
@@ -167,43 +167,13 @@ int zpci_unregister_ioat(struct zpci_dev *zdev, u8 dmaas)
/* Modify PCI: Set PCI function measurement parameters */
int zpci_fmb_enable_device(struct zpci_dev *zdev)
{
- u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, ZPCI_MOD_FC_SET_MEASURE);
- struct zpci_iommu_ctrs *ctrs;
- struct zpci_fib fib = {0};
- unsigned long flags;
- u8 cc, status;
-
lockdep_assert_held(&zdev->fmb_lock);
- if (zdev->fmb || sizeof(*zdev->fmb) < zdev->fmb_length)
+ if (zdev->fmb_requested || sizeof(*zdev->fmb) < zdev->fmb_length)
return -EINVAL;
- zdev->fmb = kmem_cache_zalloc(zdev_fmb_cache, GFP_KERNEL);
- if (!zdev->fmb)
- return -ENOMEM;
- WARN_ON((u64) zdev->fmb & 0xf);
-
- /* reset software counters */
- spin_lock_irqsave(&zdev->dom_lock, flags);
- ctrs = zpci_get_iommu_ctrs(zdev);
- if (ctrs) {
- atomic64_set(&ctrs->mapped_pages, 0);
- atomic64_set(&ctrs->unmapped_pages, 0);
- atomic64_set(&ctrs->global_rpcits, 0);
- atomic64_set(&ctrs->sync_map_rpcits, 0);
- atomic64_set(&ctrs->sync_rpcits, 0);
- }
- spin_unlock_irqrestore(&zdev->dom_lock, flags);
-
-
- fib.fmb_addr = virt_to_phys(zdev->fmb);
- fib.gd = zdev->gisa;
- cc = zpci_mod_fc(req, &fib, &status);
- if (cc) {
- kmem_cache_free(zdev_fmb_cache, zdev->fmb);
- zdev->fmb = NULL;
- }
- return cc ? -EIO : 0;
+ zdev->fmb_requested = true;
+ return zpci_fmb_reenable_device(zdev);
}
/* Modify PCI: Disable PCI function measurement */
@@ -215,22 +185,68 @@ int zpci_fmb_disable_device(struct zpci_dev *zdev)
lockdep_assert_held(&zdev->fmb_lock);
- if (!zdev->fmb)
+ if (!zdev->fmb_requested)
return -EINVAL;
+ zdev->fmb_requested = false;
fib.gd = zdev->gisa;
/* Function measurement is disabled if fmb address is zero */
cc = zpci_mod_fc(req, &fib, &status);
if (cc == 3) /* Function already gone. */
cc = 0;
+ if (cc)
+ return -EIO;
- if (!cc) {
- kmem_cache_free(zdev_fmb_cache, zdev->fmb);
- zdev->fmb = NULL;
+ return 0;
+}
+EXPORT_SYMBOL_GPL(zpci_fmb_disable_device);
+
+/* Re-enable PCI function measurement: clear the software IOMMU counters
+ * and (re-)enable the FMB. This function is used to restore the desired
+ * FMB enablement state when measurement may be implicitly disabled by
+ * firmware (i.e., via CLP in zpci_disable_device())
+ */
+int zpci_fmb_reenable_device(struct zpci_dev *zdev)
+{
+ u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, ZPCI_MOD_FC_SET_MEASURE);
+ struct zpci_iommu_ctrs *ctrs;
+ struct zpci_fib fib = {0};
+ unsigned long flags;
+ u8 cc, status;
+
+ lockdep_assert_held(&zdev->fmb_lock);
+
+ if (!zdev->fmb) {
+ zdev->fmb = kmem_cache_zalloc(zdev_fmb_cache, GFP_KERNEL);
+ if (!zdev->fmb)
+ return -ENOMEM;
+ } else {
+ /* reuse the same FMB buffer for as long the zdev lives */
+ memset(zdev->fmb, 0, sizeof(*zdev->fmb));
}
- return cc ? -EIO : 0;
+
+ /* reset software counters */
+ spin_lock_irqsave(&zdev->dom_lock, flags);
+ ctrs = zpci_get_iommu_ctrs(zdev);
+ if (ctrs) {
+ atomic64_set(&ctrs->mapped_pages, 0);
+ atomic64_set(&ctrs->unmapped_pages, 0);
+ atomic64_set(&ctrs->global_rpcits, 0);
+ atomic64_set(&ctrs->sync_map_rpcits, 0);
+ atomic64_set(&ctrs->sync_rpcits, 0);
+ }
+ spin_unlock_irqrestore(&zdev->dom_lock, flags);
+
+ fib.fmb_addr = virt_to_phys(zdev->fmb);
+ fib.gd = zdev->gisa;
+ cc = zpci_mod_fc(req, &fib, &status);
+ if (cc)
+ return -EIO;
+
+ return 0;
}
+EXPORT_SYMBOL_GPL(zpci_fmb_reenable_device);
static int zpci_cfg_load(struct zpci_dev *zdev, int offset, u32 *val, u8 len)
{
@@ -737,8 +753,14 @@ int zpci_reenable_device(struct zpci_dev *zdev)
}
rc = zpci_iommu_register_ioat(zdev, &status);
- if (rc)
+ if (rc) {
zpci_disable_device(zdev);
+ return rc;
+ }
+
+ guard(mutex)(&zdev->fmb_lock);
+ if (zdev->fmb_requested)
+ zpci_fmb_reenable_device(zdev);
return rc;
}
@@ -1003,6 +1025,12 @@ void zpci_release_device(struct kref *kref)
if (zdev->has_resources)
zpci_cleanup_bus_resources(zdev);
+ if (zdev->fmb) {
+ zdev->fmb_requested = false;
+ kmem_cache_free(zdev_fmb_cache, zdev->fmb);
+ zdev->fmb = 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..9a960310d4dd 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;
mutex_lock(&zdev->fmb_lock);
- if (!zdev->fmb) {
+ if (!zdev->fmb_requested) {
mutex_unlock(&zdev->fmb_lock);
seq_puts(m, "FMB statistics disabled\n");
return 0;
--
2.56.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v9 3/4] s390/pci: Fence FMB enable/disable via debugfs for passthrough devices
2026-10-07 13:59 [PATCH v9 0/4] vfio-pci/zdev: Improved zPCI Function Measurement Support Omar Elghoul
2026-10-07 13:59 ` [PATCH v9 1/4] s390/pci: Hold fmb_lock when enabling or disabling PCI devices Omar Elghoul
2026-10-07 13:59 ` [PATCH v9 2/4] s390/pci: Reuse FMB buffer and preserve state in device re-enablement Omar Elghoul
@ 2026-10-07 13:59 ` Omar Elghoul
2026-10-07 14:06 ` sashiko-bot
2026-10-07 13:59 ` [PATCH v9 4/4] vfio-pci/zdev: Add VFIO FMB device features Omar Elghoul
3 siblings, 1 reply; 10+ messages in thread
From: Omar Elghoul @ 2026-10-07 13:59 UTC (permalink / raw)
To: linux-s390, linux-kernel, kvm
Cc: oelghoul, hca, gor, agordeev, borntraeger, svens, schnelle,
mjrosato, alifm, farman, gbayer, pasic, alex, frankja, imbrenda
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 <oelghoul@linux.ibm.com>
Reviewed-by: Matthew Rosato <mjrosato@linux.ibm.com>
Reviewed-by: Niklas Schnelle <schnelle@linux.ibm.com>
---
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 9a960310d4dd..e60ab981d2ff 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, const char __user *ubuf,
if (rc)
return rc;
+ mutex_lock(&zdev->kzdev_lock);
+ if (zdev->kzdev) {
+ rc = -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, const char __user *ubuf,
break;
}
mutex_unlock(&zdev->fmb_lock);
+
+out_unlock_kzdev:
+ mutex_unlock(&zdev->kzdev_lock);
return rc ? rc : count;
}
--
2.56.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v9 4/4] vfio-pci/zdev: Add VFIO FMB device features
2026-10-07 13:59 [PATCH v9 0/4] vfio-pci/zdev: Improved zPCI Function Measurement Support Omar Elghoul
` (2 preceding siblings ...)
2026-10-07 13:59 ` [PATCH v9 3/4] s390/pci: Fence FMB enable/disable via debugfs for passthrough devices Omar Elghoul
@ 2026-10-07 13:59 ` Omar Elghoul
2026-10-07 14:07 ` sashiko-bot
3 siblings, 1 reply; 10+ messages in thread
From: Omar Elghoul @ 2026-10-07 13:59 UTC (permalink / raw)
To: linux-s390, linux-kernel, kvm
Cc: oelghoul, hca, gor, agordeev, borntraeger, svens, schnelle,
mjrosato, alifm, farman, gbayer, pasic, alex, frankja, imbrenda
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 <oelghoul@linux.ibm.com>
---
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_core.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_priv.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_device *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, u32 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 vfio_device *device,
{
return -ENOTTY;
}
+
+static inline int vfio_pci_zdev_feature_fmb_enable(struct vfio_pci_core_device *vdev,
+ u32 flags, void __user *arg,
+ size_t argsz)
+{
+ return -ENOTTY;
+}
+
+static inline int vfio_pci_zdev_feature_fmb_read(struct vfio_pci_core_device *vdev,
+ u32 flags, void __user *arg,
+ size_t argsz)
+{
+ return -ENOTTY;
+}
#endif
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_zdev.c
index f47f36314a1c..1a66f455545a 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_device *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, u32 flags,
+ void __user *arg, size_t argsz)
+{
+ struct zpci_dev *zdev;
+ struct vfio_device_feature_zpci_fmb_enable fmb_enable;
+ int ret;
+
+ ret = vfio_check_feature(flags, argsz, VFIO_DEVICE_FEATURE_SET, sizeof(fmb_enable));
+ if (ret != 1)
+ return ret;
+
+ zdev = 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) {
+ zdev->fmb_requested = true;
+ 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 = vfio_check_feature(flags, argsz, VFIO_DEVICE_FEATURE_GET, sizeof(fmb_read));
+ if (ret != 1)
+ return ret;
+
+ zdev = 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;
+
+ scoped_guard(mutex, &zdev->fmb_lock) {
+ if (!zdev->fmb_requested)
+ return -ENOMSG;
+ memcpy(&fmb_bounce, zdev->fmb, zdev->fmb_length);
+ }
+
+ if (copy_to_user(u64_to_user_ptr(fmb_read.data), &fmb_bounce, zdev->fmb_length))
+ 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 {
#define VFIO_DEVICE_FEATURE_ZPCI_ERROR 13
+/**
+ * Upon VFIO_DEVICE_FEATURE_SET, enable or disable FMB for the VFIO zPCI device.
+ *
+ * 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 devices.
+ *
+ * The user-provided buffer must be at least fmb_length large, where fmb_length
+ * is reported in VFIO_DEVICE_INFO_CAP_ZPCI_BASE.
+ *
+ * Returns: 0 on success, -1 and errno set appropriately on error. errno==ENOMSG
+ * 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 -------- */
/**
--
2.56.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v9 3/4] s390/pci: Fence FMB enable/disable via debugfs for passthrough devices
2026-10-07 13:59 ` [PATCH v9 3/4] s390/pci: Fence FMB enable/disable via debugfs for passthrough devices Omar Elghoul
@ 2026-10-07 14:06 ` sashiko-bot
0 siblings, 0 replies; 10+ messages in thread
From: sashiko-bot @ 2026-10-07 14:06 UTC (permalink / raw)
To: Omar Elghoul
Cc: Christian Borntraeger, Alexander Gordeev, kvm, Heiko Carstens,
Vasily Gorbik, linux-s390
> 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 <oelghoul@linux.ibm.com>
Sashiko has reviewed this patch and found no issues. It looks great!
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261007135926.82935-1-oelghoul@linux.ibm.com?part=3
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v9 4/4] vfio-pci/zdev: Add VFIO FMB device features
2026-10-07 13:59 ` [PATCH v9 4/4] vfio-pci/zdev: Add VFIO FMB device features Omar Elghoul
@ 2026-10-07 14:07 ` sashiko-bot
2026-10-07 14:24 ` Omar Elghoul
0 siblings, 1 reply; 10+ messages in thread
From: sashiko-bot @ 2026-10-07 14:07 UTC (permalink / raw)
To: Omar Elghoul
Cc: Heiko Carstens, Vasily Gorbik, linux-s390, Alexander Gordeev,
Christian Borntraeger, kvm
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] vfio_pci: NULL pointer deref in fmb_read on fmb allocation failure
- [High] vfio_pci: stack buffer overflow in fmb_read via unbounded fmb_length
--
commit 759143700fb3898fd78661e48f994eff036f8cf5
Author: Omar Elghoul <oelghoul@linux.ibm.com>
vfio-pci/zdev: Add VFIO FMB device features
This commit introduces new VFIO features for zPCI devices to provide FMB
passthrough to userspace. It allows enabling or disabling the FMB using a SET
feature, and reading the latest FMB using a GET feature.
> diff --git a/drivers/vfio/pci/vfio_pci_zdev.c b/drivers/vfio/pci/vfio_pci_zdev.c
> index f47f36314a1cc..1a66f455545ab 100644
> --- a/drivers/vfio/pci/vfio_pci_zdev.c
> +++ b/drivers/vfio/pci/vfio_pci_zdev.c
[ ... ]
> +int vfio_pci_zdev_feature_fmb_enable(struct vfio_pci_core_device *vdev, u32 flags,
> + void __user *arg, size_t argsz)
> +{
[ ... ]
> + if (fmb_enable.enabled) {
> + zdev->fmb_requested = true;
> + return zpci_fmb_reenable_device(zdev);
[Severity: High]
If zpci_fmb_reenable_device() fails (for example, if kmem_cache_zalloc()
returns -ENOMEM), does zdev->fmb_requested remain set to true?
Since the failure doesn't revert the flag to false, could this leave the
device state inconsistent for future FMB reads?
[Severity: High]
Is it intentional to bypass the zdev->fmb_length bounds check here?
The standard enablement path typically validates that zdev->fmb_length fits
within the structure boundaries. By calling zpci_fmb_reenable_device()
directly, it appears a hardware-supplied length greater than the size of
struct zpci_fmb could be accepted and saved.
> + }
> +
> + 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;
[ ... ]
> + scoped_guard(mutex, &zdev->fmb_lock) {
> + if (!zdev->fmb_requested)
> + return -ENOMSG;
> + memcpy(&fmb_bounce, zdev->fmb, zdev->fmb_length);
[Severity: High]
If a previous call to vfio_pci_zdev_feature_fmb_enable() failed during
allocation but left zdev->fmb_requested = true, this check will pass.
Will this result in a NULL pointer dereference when accessing zdev->fmb in
this memcpy()?
[Severity: High]
Can zdev->fmb_length be larger than sizeof(struct zpci_fmb)?
If an oversized fmb_length is reported by the hardware or firmware and was not
validated during enablement, could copying up to that length into the
fixed-size local stack variable fmb_bounce result in a stack buffer overflow?
> + }
> +
> + if (copy_to_user(u64_to_user_ptr(fmb_read.data), &fmb_bounce, zdev->fmb_length))
> + return -EFAULT;
> + return 0;
> +}
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261007135926.82935-1-oelghoul@linux.ibm.com?part=4
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v9 2/4] s390/pci: Reuse FMB buffer and preserve state in device re-enablement
2026-10-07 13:59 ` [PATCH v9 2/4] s390/pci: Reuse FMB buffer and preserve state in device re-enablement Omar Elghoul
@ 2026-10-07 14:11 ` sashiko-bot
0 siblings, 0 replies; 10+ messages in thread
From: sashiko-bot @ 2026-10-07 14:11 UTC (permalink / raw)
To: Omar Elghoul
Cc: linux-s390, Alexander Gordeev, Christian Borntraeger, kvm,
Heiko Carstens, Vasily Gorbik
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] pci: NULL pointer deref in pci_perf_show() if FMB allocation fails
- [High] s390/pci: NULL pointer deref if FMB allocation fails during enable
--
commit edcda811c60da07b857039d32e74cbe9c76de00e
Author: Omar Elghoul <oelghoul@linux.ibm.com>
s390/pci: Reuse FMB buffer and preserve state in device re-enablement
Don't free the FMB buffer when disabling measurement in
zpci_fmb_disable_device(). Instead, make the buffer persistent for the
lifetime of the device and reuse it across enable/disable cycles. Defer
freeing the buffer until teardown in zpci_release_device().
> diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c
> index c055a9ad09724..bda91d79bafdc 100644
> --- a/arch/s390/pci/pci.c
> +++ b/arch/s390/pci/pci.c
> @@ -167,43 +167,13 @@ int zpci_unregister_ioat(struct zpci_dev *zdev, u8 dmaas)
> /* Modify PCI: Set PCI function measurement parameters */
> int zpci_fmb_enable_device(struct zpci_dev *zdev)
> {
> lockdep_assert_held(&zdev->fmb_lock);
>
> - if (zdev->fmb || sizeof(*zdev->fmb) < zdev->fmb_length)
> + if (zdev->fmb_requested || sizeof(*zdev->fmb) < zdev->fmb_length)
> return -EINVAL;
>
> + zdev->fmb_requested = true;
> + return zpci_fmb_reenable_device(zdev);
> }
[Severity: High]
If zpci_fmb_reenable_device() fails, is zdev->fmb_requested left set to
true? If the allocation in zpci_fmb_reenable_device() returns -ENOMEM, it
appears this state change is not rolled back.
[ ... ]
> +int zpci_fmb_reenable_device(struct zpci_dev *zdev)
> +{
[ ... ]
> + if (!zdev->fmb) {
> + zdev->fmb = kmem_cache_zalloc(zdev_fmb_cache, GFP_KERNEL);
> + if (!zdev->fmb)
> + return -ENOMEM;
> + } else {
> + /* reuse the same FMB buffer for as long the zdev lives */
> + memset(zdev->fmb, 0, sizeof(*zdev->fmb));
> }
If kmem_cache_zalloc() fails here, zdev->fmb remains NULL, but the caller
zpci_fmb_enable_device() has already set zdev->fmb_requested = true.
> diff --git a/arch/s390/pci/pci_debug.c b/arch/s390/pci/pci_debug.c
> index c7ed7bf254b5e..9a960310d4ddf 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;
>
> mutex_lock(&zdev->fmb_lock);
> - if (!zdev->fmb) {
> + if (!zdev->fmb_requested) {
> mutex_unlock(&zdev->fmb_lock);
> seq_puts(m, "FMB statistics disabled\n");
> return 0;
[Severity: High]
If fmb_requested is left true after an allocation failure, can this
lead to a NULL pointer dereference here?
Since this check now relies entirely on fmb_requested rather than checking
if zdev->fmb is actually allocated, it seems like pci_perf_show() will bypass
this early return and proceed to dereference the NULL zdev->fmb pointer
further down:
arch/s390/pci/pci_debug.c:pci_perf_show() {
...
/* header */
seq_printf(m, "Update interval: %u ms\n", zdev->fmb_update);
seq_printf(m, "Samples: %u\n", zdev->fmb->samples);
...
}
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261007135926.82935-1-oelghoul@linux.ibm.com?part=2
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v9 1/4] s390/pci: Hold fmb_lock when enabling or disabling PCI devices
2026-10-07 13:59 ` [PATCH v9 1/4] s390/pci: Hold fmb_lock when enabling or disabling PCI devices Omar Elghoul
@ 2026-10-07 14:13 ` sashiko-bot
0 siblings, 0 replies; 10+ messages in thread
From: sashiko-bot @ 2026-10-07 14:13 UTC (permalink / raw)
To: Omar Elghoul
Cc: Vasily Gorbik, linux-s390, Alexander Gordeev, kvm,
Christian Borntraeger, Heiko Carstens
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] s390/pci: race in pcibios_disable_device leaves FMB enabled
--
commit 0f2a2ae0e5e387c72b216a0f886fdb95698ac275
Author: Omar Elghoul <oelghoul@linux.ibm.com>
s390/pci: Hold fmb_lock when enabling or disabling PCI devices
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.
> diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c
> index d64c544b32b0c..c055a9ad09724 100644
> --- a/arch/s390/pci/pci.c
> +++ b/arch/s390/pci/pci.c
[ ... ]
> @@ -648,7 +654,9 @@ void pcibios_disable_device(struct pci_dev *pdev)
> {
> struct zpci_dev *zdev = to_zpci(pdev);
>
> + mutex_lock(&zdev->fmb_lock);
> zpci_fmb_disable_device(zdev);
> + mutex_unlock(&zdev->fmb_lock);
> zpci_debug_exit_device(zdev);
> }
[Severity: Medium]
Could this sequence allow a race condition with debugfs?
If a concurrent write to the debugfs statistics file occurs in the window
after mutex_unlock() but before zpci_debug_exit_device(), it appears it could
acquire fmb_lock and invoke zpci_fmb_enable_device().
If this happens, does it leave the FMB running in hardware without a debugfs
interface to control it, while also leaking the zdev->fmb memory?
Would it be safer to call zpci_debug_exit_device(zdev) before acquiring
fmb_lock?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261007135926.82935-1-oelghoul@linux.ibm.com?part=1
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v9 4/4] vfio-pci/zdev: Add VFIO FMB device features
2026-10-07 14:07 ` sashiko-bot
@ 2026-10-07 14:24 ` Omar Elghoul
0 siblings, 0 replies; 10+ messages in thread
From: Omar Elghoul @ 2026-10-07 14:24 UTC (permalink / raw)
To: sashiko-reviews
Cc: Heiko Carstens, Vasily Gorbik, linux-s390, Alexander Gordeev,
Christian Borntraeger, kvm
On 10/7/26 10:07 AM, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
> - [High] vfio_pci: NULL pointer deref in fmb_read on fmb allocation failure
> - [High] vfio_pci: stack buffer overflow in fmb_read via unbounded fmb_length
> --
>
> commit 759143700fb3898fd78661e48f994eff036f8cf5
> Author: Omar Elghoul <oelghoul@linux.ibm.com>
>
> vfio-pci/zdev: Add VFIO FMB device features
>
> This commit introduces new VFIO features for zPCI devices to provide FMB
> passthrough to userspace. It allows enabling or disabling the FMB using a SET
> feature, and reading the latest FMB using a GET feature.
>
>> diff --git a/drivers/vfio/pci/vfio_pci_zdev.c b/drivers/vfio/pci/vfio_pci_zdev.c
>> index f47f36314a1cc..1a66f455545ab 100644
>> --- a/drivers/vfio/pci/vfio_pci_zdev.c
>> +++ b/drivers/vfio/pci/vfio_pci_zdev.c
> [ ... ]
>> +int vfio_pci_zdev_feature_fmb_enable(struct vfio_pci_core_device *vdev, u32 flags,
>> + void __user *arg, size_t argsz)
>> +{
> [ ... ]
>> + if (fmb_enable.enabled) {
>> + zdev->fmb_requested = true;
>> + return zpci_fmb_reenable_device(zdev);
>
> [Severity: High]
> If zpci_fmb_reenable_device() fails (for example, if kmem_cache_zalloc()
> returns -ENOMEM), does zdev->fmb_requested remain set to true?
>
> Since the failure doesn't revert the flag to false, could this leave the
> device state inconsistent for future FMB reads?
This flag is intentionally kept true and is documented in patch 2/4 to
track the desired FMB state, which is not necessarily the actual FMB
enablement state in firmware. In hindsight, the liveness check should've
been zdev->fmb_requested && zdev->fmb rather than just one or the other.
The "inconsistent" device state isn't an issue either because the FMB
sample includes a timestamp, so a consumer would know when it's reading
stale data.
>
> [Severity: High]
> Is it intentional to bypass the zdev->fmb_length bounds check here?
>
> The standard enablement path typically validates that zdev->fmb_length fits
> within the structure boundaries. By calling zpci_fmb_reenable_device()
> directly, it appears a hardware-supplied length greater than the size of
> struct zpci_fmb could be accepted and saved.
In practice this shouldn't be an issue, but it would've been a good idea
to move the sizeof(*zdev->fmb) < zdev->fmb_length check into
zpci_fmb_reenable_device() as well to prevent this issue from existing
even in theory.
>
>> + }
>> +
>> + 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;
> [ ... ]
>> + scoped_guard(mutex, &zdev->fmb_lock) {
>> + if (!zdev->fmb_requested)
>> + return -ENOMSG;
>> + memcpy(&fmb_bounce, zdev->fmb, zdev->fmb_length);
>
> [Severity: High]
> If a previous call to vfio_pci_zdev_feature_fmb_enable() failed during
> allocation but left zdev->fmb_requested = true, this check will pass.
>
> Will this result in a NULL pointer dereference when accessing zdev->fmb in
> this memcpy()?
Admittedly I did miss this one, sorry about that. I will address it in
the next iteration.
>
> [Severity: High]
> Can zdev->fmb_length be larger than sizeof(struct zpci_fmb)?
>
> If an oversized fmb_length is reported by the hardware or firmware and was not
> validated during enablement, could copying up to that length into the
> fixed-size local stack variable fmb_bounce result in a stack buffer overflow?
See above
>
>> + }
>> +
>> + if (copy_to_user(u64_to_user_ptr(fmb_read.data), &fmb_bounce, zdev->fmb_length))
>> + return -EFAULT;
>> + return 0;
>> +}
>
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2026-10-07 14:24 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-07 13:59 [PATCH v9 0/4] vfio-pci/zdev: Improved zPCI Function Measurement Support Omar Elghoul
2026-10-07 13:59 ` [PATCH v9 1/4] s390/pci: Hold fmb_lock when enabling or disabling PCI devices Omar Elghoul
2026-10-07 14:13 ` sashiko-bot
2026-10-07 13:59 ` [PATCH v9 2/4] s390/pci: Reuse FMB buffer and preserve state in device re-enablement Omar Elghoul
2026-10-07 14:11 ` sashiko-bot
2026-10-07 13:59 ` [PATCH v9 3/4] s390/pci: Fence FMB enable/disable via debugfs for passthrough devices Omar Elghoul
2026-10-07 14:06 ` sashiko-bot
2026-10-07 13:59 ` [PATCH v9 4/4] vfio-pci/zdev: Add VFIO FMB device features Omar Elghoul
2026-10-07 14:07 ` sashiko-bot
2026-10-07 14:24 ` Omar Elghoul
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox