aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2013-04-08 09:32:07 -0400
committerRusty Russell <rusty@rustcorp.com.au>2013-04-08 09:36:53 -0400
commit10f34f64d3a50912ae49c67c08c9162effdf546a (patch)
tree0f5bfa34fdd3f94670362affa42720b03aedee4c
parent7f82b3c9158f3ce8eb9eaf0320a359de9ab6392c (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.c22
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
168static void virtscsi_vq_done(struct virtio_scsi *vscsi, struct virtqueue *vq, 168static 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
181static void virtscsi_req_done(struct virtqueue *vq) 186static 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
192static void virtscsi_complete_free(struct virtio_scsi *vscsi, void *buf) 194static 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
213static int virtscsi_kick_event(struct virtio_scsi *vscsi, 212static 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/**