Thread (33 messages) 33 messages, 9 authors, 2012-07-04

Re: [PATCH 3/3] virtio-blk: Add bio-based IO path for virtio-blk

From: Stefan Hajnoczi <hidden>
Date: 2012-06-18 10:45:55
Also in: kvm, lkml

On Mon, Jun 18, 2012 at 11:21 AM, Michael S. Tsirkin [off-list ref] wrote:
On Mon, Jun 18, 2012 at 02:53:10PM +0800, Asias He wrote:
quoted
+static void virtblk_make_request(struct request_queue *q, struct bio *bio)
+{
+     struct virtio_blk *vblk = q->queuedata;
+     unsigned int num, out = 0, in = 0;
+     struct virtblk_req *vbr;
+
+     BUG_ON(bio->bi_phys_segments + 2 > vblk->sg_elems);
+     BUG_ON(bio->bi_rw & (REQ_FLUSH | REQ_FUA));
+
+     vbr = virtblk_alloc_req(vblk, GFP_NOIO);
+     if (!vbr) {
+             bio_endio(bio, -ENOMEM);
+             return;
+     }
+
+     vbr->bio = bio;
+     vbr->req = NULL;
+     vbr->out_hdr.type = 0;
+     vbr->out_hdr.sector = bio->bi_sector;
+     vbr->out_hdr.ioprio = bio_prio(bio);
+
+     sg_set_buf(&vbr->sg[out++], &vbr->out_hdr, sizeof(vbr->out_hdr));
+
+     num = blk_bio_map_sg(q, bio, vbr->sg + out);
+
+     sg_set_buf(&vbr->sg[num + out + in++], &vbr->status,
+                sizeof(vbr->status));
+
+     if (num) {
+             if (bio->bi_rw & REQ_WRITE) {
+                     vbr->out_hdr.type |= VIRTIO_BLK_T_OUT;
+                     out += num;
+             } else {
+                     vbr->out_hdr.type |= VIRTIO_BLK_T_IN;
+                     in += num;
+             }
+     }
+
+     spin_lock_irq(vblk->disk->queue->queue_lock);
+     if (virtqueue_add_buf(vblk->vq, vbr->sg, out, in, vbr,
+                           GFP_ATOMIC) < 0) {
+             spin_unlock_irq(vblk->disk->queue->queue_lock);
Any implications of dropping lock like that?
E.g. for suspend. like we are still discussing with
unlocked kick?
Since we aquired the lock in this function there should be no problem.
 Whatever protects against vblk or vblk->disk disappearing upon
entering this function also protects after unlocking queue_lock.
Otherwise all .make_request_fn() functions would be broken.

I'd still like to understand the details though.

Stefan
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help