[PATCH] virtio_balloon: Fix interrupt context deadlock

From: David Stevens
Date: Tue Jan 09 2024 - 00:41:21 EST


Use _irq spinlock functions with the adjustment_lock, since
start_update_balloon_size needs to acquire it in an interrupt context.

Fixes: 5b9ce7ecd715 ("virtio_balloon: stay awake while adjusting balloon")
Reported-by: Theodore Ts'o <tytso@xxxxxxx>
Signed-off-by: David Stevens <stevensd@xxxxxxxxxxxx>
---
drivers/virtio/virtio_balloon.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloo=
n.c
index aa6a1a649ad6..1f5b3dd31fcf 100644
--- a/drivers/virtio/virtio_balloon.c
+++ b/drivers/virtio/virtio_balloon.c
@@ -459,12 +459,12 @@ static void start_update_balloon_size(struct
virtio_balloon *vb)

static void end_update_balloon_size(struct virtio_balloon *vb)
{
- spin_lock(&vb->adjustment_lock);
+ spin_lock_irq(&vb->adjustment_lock);
if (!vb->adjustment_signal_pending && vb->adjustment_in_progress) {
vb->adjustment_in_progress =3D false;
pm_relax(vb->vdev->dev.parent);
}
- spin_unlock(&vb->adjustment_lock);
+ spin_unlock_irq(&vb->adjustment_lock);
}

static void virtballoon_changed(struct virtio_device *vdev)
@@ -506,9 +506,9 @@ static void update_balloon_size_func(struct
work_struct *work)
vb =3D container_of(work, struct virtio_balloon,
update_balloon_size_work);

- spin_lock(&vb->adjustment_lock);
+ spin_lock_irq(&vb->adjustment_lock);
vb->adjustment_signal_pending =3D false;
- spin_unlock(&vb->adjustment_lock);
+ spin_unlock_irq(&vb->adjustment_lock);

diff =3D towards_target(vb);

--=20
2.43.0.472.g3155946c3a-goog