aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/vhost/vhost.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2012-03-23 14:46:48 -0400
committerDavid S. Miller <davem@davemloft.net>2012-03-23 14:46:48 -0400
commitf1e84eb3bba3d6a5691ce1832ff7e550768560d8 (patch)
treeaadec1eb55b0281cba4701b85835b2bc4502a9cc /drivers/vhost/vhost.c
parent8c6b0865aa80c4f30baa343d3d707389f738af48 (diff)
parentea5d404655ba3b356d0c06d6a3c4f24112124522 (diff)
Merge branch 'vhost-net' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
Diffstat (limited to 'drivers/vhost/vhost.c')
-rw-r--r--drivers/vhost/vhost.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index bdb2d6436b2b..947f00d8e091 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -222,6 +222,8 @@ static int vhost_worker(void *data)
222 if (work) { 222 if (work) {
223 __set_current_state(TASK_RUNNING); 223 __set_current_state(TASK_RUNNING);
224 work->fn(work); 224 work->fn(work);
225 if (need_resched())
226 schedule();
225 } else 227 } else
226 schedule(); 228 schedule();
227 229
@@ -403,7 +405,7 @@ long vhost_dev_reset_owner(struct vhost_dev *dev)
403 if (!memory) 405 if (!memory)
404 return -ENOMEM; 406 return -ENOMEM;
405 407
406 vhost_dev_cleanup(dev); 408 vhost_dev_cleanup(dev, true);
407 409
408 memory->nregions = 0; 410 memory->nregions = 0;
409 RCU_INIT_POINTER(dev->memory, memory); 411 RCU_INIT_POINTER(dev->memory, memory);
@@ -434,8 +436,8 @@ int vhost_zerocopy_signal_used(struct vhost_virtqueue *vq)
434 return j; 436 return j;
435} 437}
436 438
437/* Caller should have device mutex */ 439/* Caller should have device mutex if and only if locked is set */
438void vhost_dev_cleanup(struct vhost_dev *dev) 440void vhost_dev_cleanup(struct vhost_dev *dev, bool locked)
439{ 441{
440 int i; 442 int i;
441 443
@@ -472,7 +474,8 @@ void vhost_dev_cleanup(struct vhost_dev *dev)
472 dev->log_file = NULL; 474 dev->log_file = NULL;
473 /* No one will access memory at this point */ 475 /* No one will access memory at this point */
474 kfree(rcu_dereference_protected(dev->memory, 476 kfree(rcu_dereference_protected(dev->memory,
475 lockdep_is_held(&dev->mutex))); 477 locked ==
478 lockdep_is_held(&dev->mutex)));
476 RCU_INIT_POINTER(dev->memory, NULL); 479 RCU_INIT_POINTER(dev->memory, NULL);
477 WARN_ON(!list_empty(&dev->work_list)); 480 WARN_ON(!list_empty(&dev->work_list));
478 if (dev->worker) { 481 if (dev->worker) {