[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] Re: More virtio users



On Sun, 2007-06-10 at 11:16 +0300, Avi Kivity wrote:
> Rusty Russell wrote:
> > Lguest doesn't have a framebuffer, so maybe this is a good thing for me
> > to hack on, but I promised myself I'd finish NAPI for the net device,
> > and tag for block device first.
> >   
> 
> If you're touching the block device, passing a request's io priority to 
> the host can be useful.

OK, here's the interdiff.  I still don't handle non-fs requests, but I
haven't seen any yet.  I should probably BUG_ON() there and wait for
Jens to scream...

Changes:
1) Make virtio_blk.h userspace-friendly.
2) /dev/vbN -> /dev/vdN
3) Ordered tags, handed thru to other end.
4) Hand ioprio to other end, too.

diff -u b/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
--- b/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c        Sun Jun 10 22:09:10 2007 +1000
@@ -33,18 +33,19 @@
        struct virtio_blk_inhdr in_hdr;
 };
 
-/* Jens gave me this nice helper to end all chunks of a request. */
-static void end_dequeued_request(struct request *req, int uptodate)
+static void end_tagged_request(struct request *req,
+                              request_queue_t *q, int uptodate)
 {
        if (end_that_request_first(req, uptodate, req->hard_nr_sectors))
                BUG();
        add_disk_randomness(req->rq_disk);
+       blk_queue_end_tag(q, req);
        end_that_request_last(req, uptodate);
 }
 
 static void finish(struct virtio_blk *vblk, struct virtblk_req *vbr)
 {
-       end_dequeued_request(vbr->req, !vbr->failed);
+       end_tagged_request(vbr->req, vblk->disk->queue, !vbr->failed);
        list_del(&vbr->list);
        mempool_free(vbr, vblk->pool);
        /* In case queue is stopped waiting for more buffers. */
@@ -120,7 +121,7 @@
                goto detach_inbuf_full;
 
        pr_debug("Write: %p in=%lu out=%lu\n", vbr,
-                vbr->out_hdr.id, vbr->out_id);
+                (long)vbr->out_hdr.id, (long)vbr->out_id);
        list_add_tail(&vbr->list, &vblk->reqs);
        return true;
 
@@ -157,7 +158,7 @@
                goto detach_inbuf_full;
 
        pr_debug("Read: %p in=%lu out=%lu\n", vbr,
-                vbr->out_hdr.id, vbr->out_id);
+                (long)vbr->out_hdr.id, (long)vbr->out_id);
        list_add_tail(&vbr->list, &vblk->reqs);
        return true;
 
@@ -178,10 +179,9 @@
 
                /* FIXME: handle these iff capable. */
                if (!blk_fs_request(req)) {
-                       pr_debug("Got non-command 0x%08x\n", req->cmd_type);
+                       printk("Got non-command 0x%08x\n", req->cmd_type);
                        req->errors++;
-                       blkdev_dequeue_request(req);
-                       end_dequeued_request(req, 0);
+                       end_tagged_request(req, vblk->disk->queue, 0);
                        continue;
                }
 
@@ -193,6 +193,8 @@
                vbr->req = req;
                vbr->out_hdr.type = rq_data_dir(req);
                vbr->out_hdr.sector = req->sector;
+               vbr->out_hdr.tag = req->tag;
+               vbr->out_hdr.ioprio = req->ioprio;
 
                if (rq_data_dir(req) == WRITE) {
                        if (!do_write(q, vblk, vbr))
@@ -201,7 +203,6 @@
                        if (!do_read(q, vblk, vbr))
                                goto stop;
                }
-               blkdev_dequeue_request(req);
        }
 
 sync:
@@ -261,16 +262,25 @@
                goto out_put_disk;
        }
 
-       sprintf(vblk->disk->disk_name, "vb%c", virtblk_index++);
+       sprintf(vblk->disk->disk_name, "vd%c", virtblk_index++);
        vblk->disk->major = major;
        vblk->disk->first_minor = 0;
        vblk->disk->private_data = vblk;
        vblk->disk->fops = &virtblk_fops;
 
+       err = blk_queue_init_tags(vblk->disk->queue, 100 /* FIXME */, NULL);
+       if (err)
+               goto out_cleanup_queue;
+
+       blk_queue_ordered(vblk->disk->queue, QUEUE_ORDERED_TAG, NULL);
+       blk_queue_prep_rq(vblk->disk->queue, blk_queue_start_tag);
+
        /* Caller can do blk_queue_max_hw_segments(), set_capacity()
         * etc then add_disk(). */
        return vblk->disk;
 
+out_cleanup_queue:
+       blk_cleanup_queue(vblk->disk->queue);
 out_put_disk:
        put_disk(vblk->disk);
 out_unregister_blkdev:
diff -u b/include/linux/virtio_blk.h b/include/linux/virtio_blk.h
--- b/include/linux/virtio_blk.h
+++ b/include/linux/virtio_blk.h        Sun Jun 10 22:09:10 2007 +1000
@@ -3,26 +3,31 @@
 #include <linux/types.h>
-struct gendisk;
-struct virtio_device;
-struct hd_geometry;
 
 /* This is the first element of the scatter-gather list. */
 struct virtio_blk_outhdr
 {
        /* 0 == read, 1 == write */
-       u32 type;
+       __u32 type;
+       /* Ordered tag. */
+       __u16 tag;
+       /* Linux's ioprio. */
+       __u16 ioprio;
        /* Sector (ie. 512 byte offset) */
-       unsigned long sector;
+       __u64 sector;
        /* Where to put reply. */
-       unsigned long id;
+       __u64 id;
 };
 
 struct virtio_blk_inhdr
 {
        /* 1 = OK, 0 = not ok. */
-       unsigned long status;
+       unsigned char status;
 };
 
+#ifdef __KERNEL__
+struct gendisk;
+struct virtio_device;
+
 struct gendisk *virtblk_probe(struct virtio_device *vdev);
 void virtblk_remove(struct gendisk *disk);
-
+#endif /* __KERNEL__ */
 #endif /* _LINUX_VIRTIO_BLK_H */
only in patch2:
unchanged:
--- a/include/linux/Kbuild      Sun Jun 10 18:25:37 2007 +1000
+++ b/include/linux/Kbuild      Sun Jun 10 22:09:10 2007 +1000
@@ -341,6 +341,7 @@ unifdef-y += utsname.h
 unifdef-y += utsname.h
 unifdef-y += videodev2.h
 unifdef-y += videodev.h
+unifdef-y += virtio_blk.h
 unifdef-y += wait.h
 unifdef-y += wanrouter.h
 unifdef-y += watchdog.h



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.