VFIO_DEVICE_FEATURE_LOW_POWER_ENTRY_WITH_WAKEUP correctly revokes
DMABUFs on entry and, when paired with a
VFIO_DEVICE_FEATURE_LOW_POWER_EXIT, vfio_pci_runtime_pm_exit()
correctly un-revokes them.

However, when vfio_pci_core_runtime_resume() signals the eventfd on
resume, the bare __vfio_pci_runtime_pm_exit() is used (which does not
un-revoke).  Add a DMABUF move(false) to the resume path, making it
similar to vfio_pci_runtime_pm_exit().

This also reorders the eventfd signal after the un-revoke and
__vfio_pci_runtime_pm_exit() to guarantee that woken threads observe
the new state.

Fixes: 5d74781ebc86 ("vfio/pci: Add dma-buf export support for MMIO regions")
Signed-off-by: Matt Evans <[email protected]>
---
 drivers/vfio/pci/vfio_pci_core.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c
index 7d090be8c9c1..3428322efa6e 100644
--- a/drivers/vfio/pci/vfio_pci_core.c
+++ b/drivers/vfio/pci/vfio_pci_core.c
@@ -526,8 +526,14 @@ static int vfio_pci_core_runtime_resume(struct device *dev)
         */
        down_write(&vdev->memory_lock);
        if (vdev->pm_wake_eventfd_ctx) {
-               eventfd_signal(vdev->pm_wake_eventfd_ctx);
+               struct eventfd_ctx *ctx = vdev->pm_wake_eventfd_ctx;
+
+               vdev->pm_wake_eventfd_ctx = NULL;
                __vfio_pci_runtime_pm_exit(vdev);
+               if (__vfio_pci_memory_enabled(vdev))
+                       vfio_pci_dma_buf_move(vdev, false);
+               eventfd_signal(ctx);
+               eventfd_ctx_put(ctx);
        }
        up_write(&vdev->memory_lock);
 
-- 
2.50.1 (Apple Git-155)

Reply via email to