Signed-off-by: Kent Overstreet <koverstr...@google.com>
Cc: Zach Brown <z...@redhat.com>
Cc: Felipe Balbi <ba...@ti.com>
Cc: Greg Kroah-Hartman <gre...@linuxfoundation.org>
Cc: Mark Fasheh <mfas...@suse.com>
Cc: Joel Becker <jl...@evilplan.org>
Cc: Rusty Russell <ru...@rustcorp.com.au>
Cc: Jens Axboe <ax...@kernel.dk>
Cc: Asai Thambi S P <asamymuth...@micron.com>
Cc: Selvan Mani <sm...@micron.com>
Cc: Sam Bradshaw <sbrads...@micron.com>
Cc: Jeff Moyer <jmo...@redhat.com>
Cc: Al Viro <v...@zeniv.linux.org.uk>
Cc: Benjamin LaHaise <b...@kvack.org>
Reviewed-by: "Theodore Ts'o" <ty...@mit.edu>
Signed-off-by: Andrew Morton <a...@linux-foundation.org>
---
 drivers/block/virtio_blk.c | 31 ++++++++++++++++++++-----------
 1 file changed, 20 insertions(+), 11 deletions(-)

diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index 6472395..49d0ec2 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -217,7 +217,8 @@ static void virtblk_bio_send_flush_work(struct work_struct 
*work)
        virtblk_bio_send_flush(vbr);
 }
 
-static inline void virtblk_request_done(struct virtblk_req *vbr)
+static inline void virtblk_request_done(struct virtblk_req *vbr,
+                                       struct batch_complete *batch)
 {
        struct virtio_blk *vblk = vbr->vblk;
        struct request *req = vbr->req;
@@ -231,11 +232,12 @@ static inline void virtblk_request_done(struct 
virtblk_req *vbr)
                req->errors = (error != 0);
        }
 
-       __blk_end_request_all(req, error);
+       blk_end_request_all_batch(req, error, batch);
        mempool_free(vbr, vblk->pool);
 }
 
-static inline void virtblk_bio_flush_done(struct virtblk_req *vbr)
+static inline void virtblk_bio_flush_done(struct virtblk_req *vbr,
+                                         struct batch_complete *batch)
 {
        struct virtio_blk *vblk = vbr->vblk;
 
@@ -244,12 +246,13 @@ static inline void virtblk_bio_flush_done(struct 
virtblk_req *vbr)
                INIT_WORK(&vbr->work, virtblk_bio_send_data_work);
                queue_work(virtblk_wq, &vbr->work);
        } else {
-               bio_endio(vbr->bio, virtblk_result(vbr));
+               bio_endio_batch(vbr->bio, virtblk_result(vbr), batch);
                mempool_free(vbr, vblk->pool);
        }
 }
 
-static inline void virtblk_bio_data_done(struct virtblk_req *vbr)
+static inline void virtblk_bio_data_done(struct virtblk_req *vbr,
+                                        struct batch_complete *batch)
 {
        struct virtio_blk *vblk = vbr->vblk;
 
@@ -259,17 +262,18 @@ static inline void virtblk_bio_data_done(struct 
virtblk_req *vbr)
                INIT_WORK(&vbr->work, virtblk_bio_send_flush_work);
                queue_work(virtblk_wq, &vbr->work);
        } else {
-               bio_endio(vbr->bio, virtblk_result(vbr));
+               bio_endio_batch(vbr->bio, virtblk_result(vbr), batch);
                mempool_free(vbr, vblk->pool);
        }
 }
 
-static inline void virtblk_bio_done(struct virtblk_req *vbr)
+static inline void virtblk_bio_done(struct virtblk_req *vbr,
+                                   struct batch_complete *batch)
 {
        if (unlikely(vbr->flags & VBLK_IS_FLUSH))
-               virtblk_bio_flush_done(vbr);
+               virtblk_bio_flush_done(vbr, batch);
        else
-               virtblk_bio_data_done(vbr);
+               virtblk_bio_data_done(vbr, batch);
 }
 
 static void virtblk_done(struct virtqueue *vq)
@@ -279,16 +283,19 @@ static void virtblk_done(struct virtqueue *vq)
        struct virtblk_req *vbr;
        unsigned long flags;
        unsigned int len;
+       struct batch_complete batch;
+
+       batch_complete_init(&batch);
 
        spin_lock_irqsave(vblk->disk->queue->queue_lock, flags);
        do {
                virtqueue_disable_cb(vq);
                while ((vbr = virtqueue_get_buf(vblk->vq, &len)) != NULL) {
                        if (vbr->bio) {
-                               virtblk_bio_done(vbr);
+                               virtblk_bio_done(vbr, &batch);
                                bio_done = true;
                        } else {
-                               virtblk_request_done(vbr);
+                               virtblk_request_done(vbr, &batch);
                                req_done = true;
                        }
                }
@@ -298,6 +305,8 @@ static void virtblk_done(struct virtqueue *vq)
                blk_start_queue(vblk->disk->queue);
        spin_unlock_irqrestore(vblk->disk->queue->queue_lock, flags);
 
+       batch_complete(&batch);
+
        if (bio_done)
                wake_up(&vblk->queue_wait);
 }
-- 
1.8.2.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to