diff options
author | Qin Chuanyu <qinchuanyu@huawei.com> | 2013-06-07 21:50:16 +0800 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2013-09-17 09:21:32 +0300 |
commit | ac9fde2474d04bd6574a037482e3de02b488a6c6 (patch) | |
tree | b653c2581667d160a916f9680f9fd514360b5b54 | |
parent | 272b98c6455f00884f0350f775c5342358ebb73f (diff) | |
download | linux-stable-ac9fde2474d04bd6574a037482e3de02b488a6c6.tar.gz linux-stable-ac9fde2474d04bd6574a037482e3de02b488a6c6.tar.bz2 linux-stable-ac9fde2474d04bd6574a037482e3de02b488a6c6.zip |
vhost: wake up worker outside spin_lock
the wake_up_process func is included by spin_lock/unlock in
vhost_work_queue,
but it could be done outside the spin_lock.
I have test it with kernel 3.0.27 and guest suse11-sp2 using iperf,
the num as below.
original modified
thread_num tp(Gbps) vhost(%) | tp(Gbps) vhost(%)
1 9.59 28.82 | 9.59 27.49
8 9.61 32.92 | 9.62 26.77
64 9.58 46.48 | 9.55 38.99
256 9.6 63.7 | 9.6 52.59
Signed-off-by: Chuanyu Qin <qinchuanyu@huawei.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
-rw-r--r-- | drivers/vhost/vhost.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c index 9a9502a4aa50..69068e0d8f31 100644 --- a/drivers/vhost/vhost.c +++ b/drivers/vhost/vhost.c @@ -161,9 +161,11 @@ void vhost_work_queue(struct vhost_dev *dev, struct vhost_work *work) if (list_empty(&work->node)) { list_add_tail(&work->node, &dev->work_list); work->queue_seq++; + spin_unlock_irqrestore(&dev->work_lock, flags); wake_up_process(dev->worker); + } else { + spin_unlock_irqrestore(&dev->work_lock, flags); } - spin_unlock_irqrestore(&dev->work_lock, flags); } EXPORT_SYMBOL_GPL(vhost_work_queue); |