forked from Minki/linux
vhost: fix signed/unsigned comparison
To detect that a sequence number is done, we are doing math on unsigned integers so the result is unsigned too. Not what was intended for the <= comparison. The result is user stuck forever in flush call. Convert to int to fix this. Further, get rid of ({}) to make code clearer. Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
0c21e3aaf6
commit
0174b0c30a
@ -97,22 +97,26 @@ void vhost_poll_stop(struct vhost_poll *poll)
|
|||||||
remove_wait_queue(poll->wqh, &poll->wait);
|
remove_wait_queue(poll->wqh, &poll->wait);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool vhost_work_seq_done(struct vhost_dev *dev, struct vhost_work *work,
|
||||||
|
unsigned seq)
|
||||||
|
{
|
||||||
|
int left;
|
||||||
|
spin_lock_irq(&dev->work_lock);
|
||||||
|
left = seq - work->done_seq;
|
||||||
|
spin_unlock_irq(&dev->work_lock);
|
||||||
|
return left <= 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void vhost_work_flush(struct vhost_dev *dev, struct vhost_work *work)
|
static void vhost_work_flush(struct vhost_dev *dev, struct vhost_work *work)
|
||||||
{
|
{
|
||||||
unsigned seq;
|
unsigned seq;
|
||||||
int left;
|
|
||||||
int flushing;
|
int flushing;
|
||||||
|
|
||||||
spin_lock_irq(&dev->work_lock);
|
spin_lock_irq(&dev->work_lock);
|
||||||
seq = work->queue_seq;
|
seq = work->queue_seq;
|
||||||
work->flushing++;
|
work->flushing++;
|
||||||
spin_unlock_irq(&dev->work_lock);
|
spin_unlock_irq(&dev->work_lock);
|
||||||
wait_event(work->done, ({
|
wait_event(work->done, vhost_work_seq_done(dev, work, seq));
|
||||||
spin_lock_irq(&dev->work_lock);
|
|
||||||
left = seq - work->done_seq <= 0;
|
|
||||||
spin_unlock_irq(&dev->work_lock);
|
|
||||||
left;
|
|
||||||
}));
|
|
||||||
spin_lock_irq(&dev->work_lock);
|
spin_lock_irq(&dev->work_lock);
|
||||||
flushing = --work->flushing;
|
flushing = --work->flushing;
|
||||||
spin_unlock_irq(&dev->work_lock);
|
spin_unlock_irq(&dev->work_lock);
|
||||||
|
Loading…
Reference in New Issue
Block a user