[PATCH 2/2] vhost: Avoid that vhost_work_flush() returns early

Bart Van Assche
2013-08-14T07:03:28Z

If two or more items are queued on dev->work_list before
vhost_worker() starts processing these then the value of
work->done_seq will be set to the sequence number of a work item
that has not yet been processed. Avoid this by letting
vhost_worker() count the number of items that have already been
processed.

Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: Asias He <asias@redhat.com>
---
drivers/vhost/vhost.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index e7ffc10..11d668a 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -202,7 +202,7 @@ static int vhost_worker(void *data)
{
struct vhost_dev *dev = data;
struct vhost_work *work;
- unsigned seq;
+ unsigned seq = 0;
mm_segment_t oldfs = get_fs();

set_fs(USER_DS);
@@ -216,14 +216,13 @@ static int vhost_worker(void *data)
work = list_first_entry(&dev->work_list,
struct vhost_work, node);
list_del_init(&work->node);
- seq = work->queue_seq;
spin_unlock_irq(&dev->work_lock);

__set_current_state(TASK_RUNNING);
work->fn(work);

spin_lock_irq(&dev->work_lock);
- work->done_seq = seq;
+ work->done_seq = ++seq;
if (work->flushing)
wake_up_all(&work->done);
}
--
1.7.10.4