diff options
author | Qin Chuanyu <qinchuanyu@huawei.com> | 2013-06-07 09:50:16 -0400 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2013-09-17 02:21:32 -0400 |
commit | ac9fde2474d04bd6574a037482e3de02b488a6c6 (patch) | |
tree | b653c2581667d160a916f9680f9fd514360b5b54 /drivers/vhost/vhost.c | |
parent | 272b98c6455f00884f0350f775c5342358ebb73f (diff) |
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>
Diffstat (limited to 'drivers/vhost/vhost.c')
-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) | |||
161 | if (list_empty(&work->node)) { | 161 | if (list_empty(&work->node)) { |
162 | list_add_tail(&work->node, &dev->work_list); | 162 | list_add_tail(&work->node, &dev->work_list); |
163 | work->queue_seq++; | 163 | work->queue_seq++; |
164 | spin_unlock_irqrestore(&dev->work_lock, flags); | ||
164 | wake_up_process(dev->worker); | 165 | wake_up_process(dev->worker); |
166 | } else { | ||
167 | spin_unlock_irqrestore(&dev->work_lock, flags); | ||
165 | } | 168 | } |
166 | spin_unlock_irqrestore(&dev->work_lock, flags); | ||
167 | } | 169 | } |
168 | EXPORT_SYMBOL_GPL(vhost_work_queue); | 170 | EXPORT_SYMBOL_GPL(vhost_work_queue); |
169 | 171 | ||