diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2013-04-08 09:32:07 -0400 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2013-04-08 09:36:53 -0400 |
commit | 10f34f64d3a50912ae49c67c08c9162effdf546a (patch) | |
tree | 0f5bfa34fdd3f94670362affa42720b03aedee4c | |
parent | 7f82b3c9158f3ce8eb9eaf0320a359de9ab6392c (diff) |
virtio-scsi: push vq lock/unlock into virtscsi_vq_done
Avoid duplicated code in all of the callers.
Cc: linux-scsi@vger.kernel.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Wanlong Gao <gaowanlong@cn.fujitsu.com>
Reviewed-by: Asias He <asias@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
-rw-r--r-- | drivers/scsi/virtio_scsi.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c index c23560c6a32e..dc2daec9a10d 100644 --- a/drivers/scsi/virtio_scsi.c +++ b/drivers/scsi/virtio_scsi.c | |||
@@ -165,28 +165,30 @@ static void virtscsi_complete_cmd(struct virtio_scsi *vscsi, void *buf) | |||
165 | sc->scsi_done(sc); | 165 | sc->scsi_done(sc); |
166 | } | 166 | } |
167 | 167 | ||
168 | static void virtscsi_vq_done(struct virtio_scsi *vscsi, struct virtqueue *vq, | 168 | static void virtscsi_vq_done(struct virtio_scsi *vscsi, |
169 | struct virtio_scsi_vq *virtscsi_vq, | ||
169 | void (*fn)(struct virtio_scsi *vscsi, void *buf)) | 170 | void (*fn)(struct virtio_scsi *vscsi, void *buf)) |
170 | { | 171 | { |
171 | void *buf; | 172 | void *buf; |
172 | unsigned int len; | 173 | unsigned int len; |
174 | unsigned long flags; | ||
175 | struct virtqueue *vq = virtscsi_vq->vq; | ||
173 | 176 | ||
177 | spin_lock_irqsave(&virtscsi_vq->vq_lock, flags); | ||
174 | do { | 178 | do { |
175 | virtqueue_disable_cb(vq); | 179 | virtqueue_disable_cb(vq); |
176 | while ((buf = virtqueue_get_buf(vq, &len)) != NULL) | 180 | while ((buf = virtqueue_get_buf(vq, &len)) != NULL) |
177 | fn(vscsi, buf); | 181 | fn(vscsi, buf); |
178 | } while (!virtqueue_enable_cb(vq)); | 182 | } while (!virtqueue_enable_cb(vq)); |
183 | spin_unlock_irqrestore(&virtscsi_vq->vq_lock, flags); | ||
179 | } | 184 | } |
180 | 185 | ||
181 | static void virtscsi_req_done(struct virtqueue *vq) | 186 | static void virtscsi_req_done(struct virtqueue *vq) |
182 | { | 187 | { |
183 | struct Scsi_Host *sh = virtio_scsi_host(vq->vdev); | 188 | struct Scsi_Host *sh = virtio_scsi_host(vq->vdev); |
184 | struct virtio_scsi *vscsi = shost_priv(sh); | 189 | struct virtio_scsi *vscsi = shost_priv(sh); |
185 | unsigned long flags; | ||
186 | 190 | ||
187 | spin_lock_irqsave(&vscsi->req_vq.vq_lock, flags); | 191 | virtscsi_vq_done(vscsi, &vscsi->req_vq, virtscsi_complete_cmd); |
188 | virtscsi_vq_done(vscsi, vq, virtscsi_complete_cmd); | ||
189 | spin_unlock_irqrestore(&vscsi->req_vq.vq_lock, flags); | ||
190 | }; | 192 | }; |
191 | 193 | ||
192 | static void virtscsi_complete_free(struct virtio_scsi *vscsi, void *buf) | 194 | static void virtscsi_complete_free(struct virtio_scsi *vscsi, void *buf) |
@@ -203,11 +205,8 @@ static void virtscsi_ctrl_done(struct virtqueue *vq) | |||
203 | { | 205 | { |
204 | struct Scsi_Host *sh = virtio_scsi_host(vq->vdev); | 206 | struct Scsi_Host *sh = virtio_scsi_host(vq->vdev); |
205 | struct virtio_scsi *vscsi = shost_priv(sh); | 207 | struct virtio_scsi *vscsi = shost_priv(sh); |
206 | unsigned long flags; | ||
207 | 208 | ||
208 | spin_lock_irqsave(&vscsi->ctrl_vq.vq_lock, flags); | 209 | virtscsi_vq_done(vscsi, &vscsi->ctrl_vq, virtscsi_complete_free); |
209 | virtscsi_vq_done(vscsi, vq, virtscsi_complete_free); | ||
210 | spin_unlock_irqrestore(&vscsi->ctrl_vq.vq_lock, flags); | ||
211 | }; | 210 | }; |
212 | 211 | ||
213 | static int virtscsi_kick_event(struct virtio_scsi *vscsi, | 212 | static int virtscsi_kick_event(struct virtio_scsi *vscsi, |
@@ -342,11 +341,8 @@ static void virtscsi_event_done(struct virtqueue *vq) | |||
342 | { | 341 | { |
343 | struct Scsi_Host *sh = virtio_scsi_host(vq->vdev); | 342 | struct Scsi_Host *sh = virtio_scsi_host(vq->vdev); |
344 | struct virtio_scsi *vscsi = shost_priv(sh); | 343 | struct virtio_scsi *vscsi = shost_priv(sh); |
345 | unsigned long flags; | ||
346 | 344 | ||
347 | spin_lock_irqsave(&vscsi->event_vq.vq_lock, flags); | 345 | virtscsi_vq_done(vscsi, &vscsi->event_vq, virtscsi_complete_event); |
348 | virtscsi_vq_done(vscsi, vq, virtscsi_complete_event); | ||
349 | spin_unlock_irqrestore(&vscsi->event_vq.vq_lock, flags); | ||
350 | }; | 346 | }; |
351 | 347 | ||
352 | /** | 348 | /** |