Re: [PATCH 4/6] virtio-blk: implement init_flush_rq

2014-09-07 Thread Christoph Hellwig
A couple comments not directly related to this patch, it's just
a convenient vehicle for my rants :)

> @@ -556,6 +555,19 @@ static int virtblk_init_request(void *data, struct 
> request *rq,
>   struct virtio_blk *vblk = data;
>   struct virtblk_req *vbr = blk_mq_rq_to_pdu(rq);
>  
> + vbr->req = rq;

I really hate how we need these backpointers in most drivers.  Given
that struct request and the driver privata data are allocated together
we should be able to do this with simple pointer arithmetics.

> + sg_init_table(vbr->sg, vblk->sg_elems);

Jens, what do you think about moving of the SG list handling to the
core block layer?  I'd really like to have the S/G list in struct request,
and if we do that we could also take the scsi-mq code that allows small
S/G lists preallocated in blk-mq and allocating larger ones at runtime
there, avoiding the need to duplicate that code and the whole mempool
magic it requires in drivers that want to make use of it.

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


[PATCH 4/6] virtio-blk: implement init_flush_rq

2014-09-07 Thread Ming Lei
Now we use init_flush_rq callback to initialize pdu of
flush req.

Signed-off-by: Ming Lei 
---
 drivers/block/virtio_blk.c |   15 ++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index 0a58140..f478ec8 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -177,7 +177,6 @@ static int virtio_queue_rq(struct blk_mq_hw_ctx *hctx, 
struct request *req)
 
BUG_ON(req->nr_phys_segments + 2 > vblk->sg_elems);
 
-   vbr->req = req;
if (req->cmd_flags & REQ_FLUSH) {
vbr->out_hdr.type = VIRTIO_BLK_T_FLUSH;
vbr->out_hdr.sector = 0;
@@ -556,6 +555,19 @@ static int virtblk_init_request(void *data, struct request 
*rq,
struct virtio_blk *vblk = data;
struct virtblk_req *vbr = blk_mq_rq_to_pdu(rq);
 
+   vbr->req = rq;
+   sg_init_table(vbr->sg, vblk->sg_elems);
+   return 0;
+}
+
+static int virtblk_init_flush_rq(struct request_queue *q,
+   struct request *rq)
+{
+   /* q->queuedata isn't setup yet */
+   struct virtio_blk *vblk = q->tag_set->driver_data;
+   struct virtblk_req *vbr = blk_mq_rq_to_pdu(rq);
+
+   vbr->req = rq;
sg_init_table(vbr->sg, vblk->sg_elems);
return 0;
 }
@@ -565,6 +577,7 @@ static struct blk_mq_ops virtio_mq_ops = {
.map_queue  = blk_mq_map_queue,
.complete   = virtblk_request_done,
.init_request   = virtblk_init_request,
+   .init_flush_rq  = virtblk_init_flush_rq,
 };
 
 static unsigned int virtblk_queue_depth;
-- 
1.7.9.5

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