If dev->suspended the function returns not relasing the semaphore, so
the only solution to be able to use the device is to reset again from
userspace.  Convert the semaphore functions to the equivalent guard() to
avoid it.

Fixes: 6c141c034c1b ("vduse: Add suspend")
Signed-off-by: Eugenio Pérez <[email protected]>
---
 drivers/vdpa/vdpa_user/vduse_dev.c | 9 ++-------
 1 file changed, 2 insertions(+), 7 deletions(-)

diff --git a/drivers/vdpa/vdpa_user/vduse_dev.c 
b/drivers/vdpa/vdpa_user/vduse_dev.c
index 0500da043761..86bd3116eda7 100644
--- a/drivers/vdpa/vdpa_user/vduse_dev.c
+++ b/drivers/vdpa/vdpa_user/vduse_dev.c
@@ -1281,21 +1281,16 @@ static int vduse_dev_queue_irq_work(struct vduse_dev 
*dev,
 {
        int ret = -EINVAL;
 
-       down_read(&dev->rwsem);
-       if (dev->suspended)
+       guard(rwsem_read)(&dev->rwsem);
+       if (dev->suspended || !(dev->status & VIRTIO_CONFIG_S_DRIVER_OK))
                return ret;
 
-       if (!(dev->status & VIRTIO_CONFIG_S_DRIVER_OK))
-               goto unlock;
-
        ret = 0;
        if (irq_effective_cpu == IRQ_UNBOUND)
                queue_work(vduse_irq_wq, irq_work);
        else
                queue_work_on(irq_effective_cpu,
                              vduse_irq_bound_wq, irq_work);
-unlock:
-       up_read(&dev->rwsem);
 
        return ret;
 }
-- 
2.54.0


Reply via email to