From: Rusty Russell <rusty-8n+1lVoiYb80n/F98K4Iww@public.gmane.org>
To: kvm-devel <kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org>
Cc: Jimi Xenidis <jimix-aZOuKsOsJu3MbYB6QlFGEg@public.gmane.org>,
Stephen Rothwell <sfr-3FnU+UHB4dNDw9hX6IcOSA@public.gmane.org>,
Xen Mailing List
<xen-devel-GuqFBffKawuULHF6PoxzQEEOCMrvLtNR@public.gmane.org>,
"jmk-zzFmDc4TPjtKvsKVC3L/VUEOCMrvLtNR@public.gmane.org"
<jmk-zzFmDc4TPjtKvsKVC3L/VUEOCMrvLtNR@public.gmane.org>,
Herbert Xu
<herbert-lOAM2aK0SrRLBo1qDEOMRrpzq4S04n8Q@public.gmane.org>,
Christian Borntraeger
<cborntra-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>,
virtualization
<virtualization-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org>,
Suzanne McIntosh
<skranjac-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>,
Martin Schwidefsky
<schwidefsky-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
Subject: [PATCH RFC 3/3] virtio infrastructure: example block driver
Date: Thu, 31 May 2007 22:21:31 +1000 [thread overview]
Message-ID: <1180614091.11133.63.camel@localhost.localdomain> (raw)
In-Reply-To: <1180614044.11133.61.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
Example block driver using virtio.
The block driver uses outbufs with sg[0] being the request information
(struct virtio_blk_outhdr) with the type, sector and inbuf id. For a
write, the rest of the sg will contain the data to be written.
The first segment of the inbuf is a result code (struct
virtio_blk_inhdr). For a read, the rest of the sg points to the input
buffer.
TODO:
1) Ordered tag support.
Signed-off-by: Rusty Russell <rusty-8n+1lVoiYb80n/F98K4Iww@public.gmane.org>
---
drivers/block/Makefile | 1
drivers/block/virtio_blk.c | 269 ++++++++++++++++++++++++++++++++++++++++++++
include/linux/virtio_blk.h | 29 ++++
3 files changed, 299 insertions(+)
diff -r 8f6c1b0efb6a drivers/block/Makefile
--- a/drivers/block/Makefile Thu May 31 17:54:08 2007 +1000
+++ b/drivers/block/Makefile Thu May 31 17:54:13 2007 +1000
@@ -20,6 +20,7 @@ obj-$(CONFIG_BLK_CPQ_CISS_DA) += cciss.
obj-$(CONFIG_BLK_CPQ_CISS_DA) += cciss.o
obj-$(CONFIG_BLK_DEV_DAC960) += DAC960.o
obj-$(CONFIG_CDROM_PKTCDVD) += pktcdvd.o
+obj-y += virtio_blk.o
obj-$(CONFIG_BLK_DEV_UMEM) += umem.o
obj-$(CONFIG_BLK_DEV_NBD) += nbd.o
diff -r 8f6c1b0efb6a drivers/block/virtio_blk.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/drivers/block/virtio_blk.c Thu May 31 17:55:12 2007 +1000
@@ -0,0 +1,270 @@
+#include <linux/spinlock.h>
+#include <linux/blkdev.h>
+#include <linux/hdreg.h>
+#include <linux/virtio.h>
+#include <linux/virtio_blk.h>
+
+static unsigned char virtblk_index = 'a';
+struct virtio_blk
+{
+ struct virtio_device *vdev;
+
+ spinlock_t lock;
+
+ /* The disk structure for the kernel. */
+ struct gendisk *disk;
+
+ /* Request tracking (by inbuf id). */
+ struct list_head reqs;
+
+ mempool_t *pool;
+
+ /* Scatterlist: can be too big for stack. */
+ struct scatterlist sg[1+MAX_PHYS_SEGMENTS];
+};
+
+struct virtblk_req
+{
+ struct list_head list;
+ struct request *req;
+ unsigned long out_id;
+ struct virtio_blk_outhdr out_hdr;
+ struct virtio_blk_inhdr in_hdr;
+ unsigned long in_used;
+};
+
+/* Jens gave me this nice helper to end all chunks of a request. */
+static void end_entire_request(struct request *req, int uptodate)
+{
+ if (end_that_request_first(req, uptodate, req->hard_nr_sectors))
+ BUG();
+ add_disk_randomness(req->rq_disk);
+ end_that_request_last(req, uptodate);
+}
+
+static bool do_write(request_queue_t *q, struct virtio_blk *vblk,
+ struct virtblk_req *vbr)
+{
+ unsigned long num;
+
+ /* Set up for reply. */
+ vblk->sg[0].page = virt_to_page(&vbr->in_hdr);
+ vblk->sg[0].offset = offset_in_page(&vbr->in_hdr);
+ vblk->sg[0].length = sizeof(vbr->in_hdr);
+ vbr->out_hdr.id = vblk->vdev->ops->add_inbuf(vblk->vdev, vblk->sg, 1,
+ &vbr->in_used);
+ if (IS_ERR_VALUE(vbr->out_hdr.id))
+ goto full;
+
+ /* First sg element points to output header. */
+ vblk->sg[0].page = virt_to_page(&vbr->out_hdr);
+ vblk->sg[0].offset = offset_in_page(&vbr->out_hdr);
+ vblk->sg[0].length = sizeof(vbr->out_hdr);
+
+ num = blk_rq_map_sg(q, vbr->req, vblk->sg+1);
+ vbr->out_id = vblk->vdev->ops->add_outbuf(vblk->vdev, vblk->sg, 1+num,
+ NULL);
+ if (IS_ERR_VALUE(vbr->out_id))
+ goto detach_inbuf_full;
+
+ list_add_tail(&vbr->list, &vblk->reqs);
+ return true;
+
+detach_inbuf_full:
+ vblk->vdev->ops->detach_inbuf(vblk->vdev, vbr->out_hdr.id);
+full:
+ return false;
+}
+
+static bool do_read(request_queue_t *q, struct virtio_blk *vblk,
+ struct virtblk_req *vbr)
+{
+ unsigned long num;
+
+ /* Set up for reply. */
+ vblk->sg[0].page = virt_to_page(&vbr->in_hdr);
+ vblk->sg[0].offset = offset_in_page(&vbr->in_hdr);
+ vblk->sg[0].length = sizeof(vbr->in_hdr);
+ num = blk_rq_map_sg(q, vbr->req, vblk->sg+1);
+ vbr->out_hdr.id = vblk->vdev->ops->add_inbuf(vblk->vdev, vblk->sg,
+ 1+num, &vbr->in_used);
+ if (IS_ERR_VALUE(vbr->out_hdr.id))
+ goto full;
+
+ vblk->sg[0].page = virt_to_page(&vbr->out_hdr);
+ vblk->sg[0].offset = offset_in_page(&vbr->out_hdr);
+ vblk->sg[0].length = sizeof(vbr->out_hdr);
+
+ vbr->out_id = vblk->vdev->ops->add_outbuf(vblk->vdev, vblk->sg, 1,
+ NULL);
+ if (IS_ERR_VALUE(vbr->out_id))
+ goto detach_inbuf_full;
+
+ pr_debug("%s: read at offset %lu %lu->%lu\n",
+ vblk->disk->disk_name,
+ vbr->out_hdr.sector*512, vbr->out_id, vbr->out_hdr.id);
+ list_add_tail(&vbr->list, &vblk->reqs);
+ return true;
+
+detach_inbuf_full:
+ vblk->vdev->ops->detach_inbuf(vblk->vdev, vbr->out_hdr.id);
+full:
+ return false;
+}
+
+static void do_virtblk_request(request_queue_t *q)
+{
+ struct virtio_blk *vblk = NULL;
+ struct request *req;
+ struct virtblk_req *vbr;
+
+ while ((req = elv_next_request(q)) != NULL) {
+ vblk = req->rq_disk->private_data;
+
+ /* FIXME: handle these iff capable. */
+ if (!blk_fs_request(req)) {
+ pr_debug("Got non-command 0x%08x\n", req->cmd_type);
+ req->errors++;
+ end_entire_request(req, 0);
+ continue;
+ }
+
+ vbr = mempool_alloc(vblk->pool, GFP_ATOMIC);
+ if (!vbr)
+ goto stop;
+
+ BUG_ON(req->nr_phys_segments > ARRAY_SIZE(vblk->sg));
+ vbr->req = req;
+ vbr->out_hdr.type = rq_data_dir(req);
+ vbr->out_hdr.sector = req->sector;
+ vbr->in_used = 0;
+
+ if (rq_data_dir(req) == WRITE) {
+ if (!do_write(q, vblk, vbr))
+ goto stop;
+ } else {
+ if (!do_read(q, vblk, vbr))
+ goto stop;
+ }
+ blkdev_dequeue_request(req);
+ }
+
+sync:
+ if (vblk)
+ virtio_sync(vblk->vdev);
+ return;
+
+stop:
+ /* Queue full? Wait. */
+ blk_stop_queue(q);
+ mempool_free(vbr, vblk->pool);
+ goto sync;
+}
+
+int virtblk_interrupt(struct gendisk *disk)
+{
+ struct virtio_blk *vblk = disk->private_data;
+ struct virtblk_req *i, *next;
+ unsigned long flags;
+
+ spin_lock_irqsave(&vblk->lock, flags);
+ list_for_each_entry_safe(i, next, &vblk->reqs, list) {
+ /* Reply hasn't come back? */
+ if (!i->in_used)
+ continue;
+ /* Make sure other side can no longer read/write */
+ vblk->vdev->ops->detach_outbuf(vblk->vdev, i->out_id);
+ vblk->vdev->ops->detach_inbuf(vblk->vdev, i->out_hdr.id);
+ pr_debug("%s: finished request %lu %s\n", disk->disk_name,
+ i->out_id, i->in_hdr.status == 1 ? "OK" : "FAILED");
+ /* Finish and free request */
+ end_entire_request(i->req, i->in_hdr.status == 1);
+ list_del(&i->list);
+ mempool_free(i, vblk->pool);
+ }
+ blk_start_queue(disk->queue);
+ spin_unlock_irqrestore(&vblk->lock, flags);
+ return IRQ_HANDLED;
+}
+EXPORT_SYMBOL_GPL(virtblk_interrupt);
+
+static struct block_device_operations virtblk_fops = {
+ .owner = THIS_MODULE,
+};
+
+struct gendisk *virtblk_probe(struct virtio_device *vdev)
+{
+ struct virtio_blk *vblk;
+ int err, major;
+
+ vblk = kmalloc(sizeof(*vblk), GFP_KERNEL);
+ if (!vblk) {
+ err = -ENOMEM;
+ goto out;
+ }
+
+ spin_lock_init(&vblk->lock);
+ INIT_LIST_HEAD(&vblk->reqs);
+ vblk->vdev = vdev;
+
+ vblk->pool = mempool_create_kmalloc_pool(1,sizeof(struct virtblk_req));
+ if (!vblk->pool) {
+ err = -ENOMEM;
+ goto out_free_vblk;
+ }
+
+ major = register_blkdev(0, "virtblk");
+ if (major < 0) {
+ err = major;
+ goto out_mempool;
+ }
+
+ /* FIXME: How many partitions? How long is a piece of string? */
+ vblk->disk = alloc_disk(1 << 3);
+ if (!vblk->disk) {
+ err = -ENOMEM;
+ goto out_unregister_blkdev;
+ }
+
+ vblk->disk->queue = blk_init_queue(do_virtblk_request, &vblk->lock);
+ if (!vblk->disk->queue) {
+ err = -ENOMEM;
+ goto out_put_disk;
+ }
+
+ sprintf(vblk->disk->disk_name, "vb%c", virtblk_index++);
+ vblk->disk->major = major;
+ vblk->disk->first_minor = 0;
+ vblk->disk->private_data = vblk;
+ vblk->disk->fops = &virtblk_fops;
+
+ /* Caller can do blk_queue_max_hw_segments(), set_capacity()
+ * etc then add_disk(). */
+ return vblk->disk;
+
+out_put_disk:
+ put_disk(vblk->disk);
+out_unregister_blkdev:
+ unregister_blkdev(major, "virtblk");
+out_mempool:
+ mempool_destroy(vblk->pool);
+out_free_vblk:
+ kfree(vblk);
+out:
+ return ERR_PTR(err);
+}
+EXPORT_SYMBOL_GPL(virtblk_probe);
+
+void virtblk_remove(struct gendisk *disk)
+{
+ struct virtio_blk *vblk = disk->private_data;
+ int major = vblk->disk->major;
+
+ BUG_ON(!list_empty(&vblk->reqs));
+ blk_cleanup_queue(vblk->disk->queue);
+ put_disk(vblk->disk);
+ unregister_blkdev(major, "virtblk");
+ mempool_destroy(vblk->pool);
+ kfree(vblk);
+}
+EXPORT_SYMBOL_GPL(virtblk_remove);
diff -r 8f6c1b0efb6a include/linux/virtio_blk.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/linux/virtio_blk.h Thu May 31 17:54:13 2007 +1000
@@ -0,0 +1,29 @@
+#ifndef _LINUX_VIRTIO_BLK_H
+#define _LINUX_VIRTIO_BLK_H
+#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;
+ /* Sector (ie. 512 byte offset) */
+ unsigned long sector;
+ /* Where to put reply. */
+ unsigned long id;
+};
+
+struct virtio_blk_inhdr
+{
+ /* 1 = OK, 0 = not ok. */
+ unsigned long status;
+};
+
+struct gendisk *virtblk_probe(struct virtio_device *vdev);
+int virtblk_interrupt(struct gendisk *disk);
+void virtblk_remove(struct gendisk *disk);
+
+#endif /* _LINUX_VIRTIO_BLK_H */
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
next prev parent reply other threads:[~2007-05-31 12:21 UTC|newest]
Thread overview: 81+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-05-31 12:19 [PATCH RFC 1/3] virtio infrastructure Rusty Russell
2007-05-31 12:20 ` [PATCH RFC 2/3] virtio infrastructure: example net driver Rusty Russell
2007-05-31 12:53 ` [kvm-devel] [PATCH RFC 1/3] virtio infrastructure Carsten Otte
2007-05-31 13:01 ` Dor Laor
2007-06-01 23:35 ` Santos, Jose Renato G
2007-06-02 10:12 ` [Xen-devel] " Rusty Russell
2007-06-02 10:12 ` Rusty Russell
[not found] ` <1180779167.9228.66.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-06-04 21:14 ` [Xen-devel] " Santos, Jose Renato G
[not found] ` <08CA2245AFCF444DB3AC415E47CC40AFBD2FD4-VylnnfFjWmASZAcGdq5asR6epYMZPwEe5NbjCUgZEJk@public.gmane.org>
2007-06-04 21:19 ` Jeremy Fitzhardinge
2007-06-05 2:05 ` Santos, Jose Renato G
[not found] ` <466481ED.8050209-TSDbQ3PG+2Y@public.gmane.org>
2007-06-05 2:05 ` Santos, Jose Renato G
2007-06-05 2:27 ` Rusty Russell
[not found] ` <08CA2245AFCF444DB3AC415E47CC40AFBD30B4-VylnnfFjWmASZAcGdq5asR6epYMZPwEe5NbjCUgZEJk@public.gmane.org>
2007-06-05 2:27 ` Rusty Russell
2007-06-05 2:49 ` Santos, Jose Renato G
2007-06-05 2:49 ` [Xen-devel] " Santos, Jose Renato G
2007-06-05 1:44 ` Rusty Russell
[not found] ` <1181007892.25878.112.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-06-05 2:39 ` Santos, Jose Renato G
2007-06-05 2:39 ` Santos, Jose Renato G
2007-06-04 21:19 ` Jeremy Fitzhardinge
2007-06-05 1:44 ` Rusty Russell
2007-06-04 21:14 ` Santos, Jose Renato G
2007-06-01 23:35 ` Santos, Jose Renato G
2007-06-02 6:30 ` [kvm-devel] " Avi Kivity
[not found] ` <1180613947.11133.58.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-05-31 12:20 ` [PATCH RFC 2/3] virtio infrastructure: example net driver Rusty Russell
2007-05-31 12:21 ` [PATCH RFC 3/3] virtio infrastructure: example block driver Rusty Russell
[not found] ` <1180614044.11133.61.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-05-31 12:21 ` Rusty Russell [this message]
2007-05-31 12:57 ` [kvm-devel] " Carsten Otte
[not found] ` <1180614091.11133.63.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-05-31 12:57 ` Carsten Otte
2007-05-31 15:02 ` [kvm-devel] " Troy Benjegerdes
[not found] ` <465EC637.7020504-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-05-31 15:02 ` Troy Benjegerdes
2007-05-31 17:01 ` [kvm-devel] " Carsten Otte
[not found] ` <20070531150206.GB6474-na1kE3HDu0idQnJuSAr7PQ@public.gmane.org>
2007-05-31 17:01 ` Carsten Otte
[not found] ` <465EFF72.5070100-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-05-31 17:36 ` Avi Kivity
2007-05-31 17:36 ` [kvm-devel] " Avi Kivity
2007-05-31 23:39 ` Rusty Russell
2007-06-01 7:10 ` [kvm-devel] " Carsten Otte
[not found] ` <1180654765.10999.6.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-06-01 7:10 ` Carsten Otte
2007-06-01 13:13 ` [kvm-devel] " Jens Axboe
2007-06-02 9:28 ` Rusty Russell
[not found] ` <465FC65C.6020905-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-06-01 13:13 ` Jens Axboe
[not found] ` <20070601131315.GW32105-tSWWG44O7X1aa/9Udqfwiw@public.gmane.org>
2007-06-04 13:40 ` Carsten Otte
[not found] ` <4664164A.40604-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-06-04 13:43 ` Jens Axboe
[not found] ` <20070604134322.GC32105-tSWWG44O7X1aa/9Udqfwiw@public.gmane.org>
2007-06-04 13:52 ` Rusty Russell
2007-06-04 13:54 ` [kvm-devel] " Jens Axboe
[not found] ` <1180965161.25878.47.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-06-04 13:54 ` Jens Axboe
[not found] ` <20070604135433.GG32105-tSWWG44O7X1aa/9Udqfwiw@public.gmane.org>
2007-06-04 14:12 ` Carsten Otte
2007-06-04 14:31 ` [kvm-devel] " Jens Axboe
[not found] ` <46641DC9.5050600-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-06-04 14:31 ` Jens Axboe
2007-06-04 14:12 ` [kvm-devel] " Carsten Otte
2007-06-04 13:52 ` Rusty Russell
2007-06-04 13:43 ` Jens Axboe
2007-06-04 13:40 ` Carsten Otte
2007-06-02 9:28 ` Rusty Russell
2007-06-04 12:53 ` [kvm-devel] " Carsten Otte
[not found] ` <1180776482.9228.22.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-06-04 12:53 ` Carsten Otte
2007-05-31 23:39 ` [kvm-devel] " Rusty Russell
2007-05-31 12:53 ` [PATCH RFC 1/3] virtio infrastructure Carsten Otte
2007-05-31 13:01 ` Dor Laor
2007-06-02 6:30 ` Avi Kivity
2007-06-02 9:50 ` [kvm-devel] " Rusty Russell
[not found] ` <46610E8D.10706-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-06-02 9:50 ` Rusty Russell
[not found] ` <1180777836.9228.44.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-06-03 5:28 ` Avi Kivity
2007-06-03 10:29 ` [kvm-devel] " Rusty Russell
[not found] ` <46625192.5020108-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-06-03 10:29 ` Rusty Russell
[not found] ` <1180866540.17442.74.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-06-03 11:39 ` [Xen-devel] " Avi Kivity
[not found] ` <4662A86A.7010706-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-06-03 23:53 ` Rusty Russell
2007-06-04 9:55 ` [Xen-devel] Re: [kvm-devel] " Avi Kivity
[not found] ` <1180914836.17442.104.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-06-04 9:55 ` [Xen-devel] " Avi Kivity
2007-06-04 10:32 ` [Xen-devel] Re: [kvm-devel] " Herbert Xu
[not found] ` <4663E18D.4030007-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-06-04 10:32 ` [Xen-devel] " Herbert Xu
2007-06-04 11:19 ` Rusty Russell
2007-06-04 11:25 ` [kvm-devel] " Avi Kivity
[not found] ` <1180955964.25878.27.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-06-04 11:25 ` Avi Kivity
2007-06-04 11:40 ` [kvm-devel] " Rusty Russell
2007-06-04 12:17 ` Herbert Xu
[not found] ` <4663F6AC.7070100-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-06-04 11:40 ` Rusty Russell
2007-06-04 12:17 ` Herbert Xu
2007-06-04 11:19 ` [kvm-devel] " Rusty Russell
2007-06-03 23:53 ` [Xen-devel] " Rusty Russell
2007-06-03 11:39 ` Avi Kivity
2007-06-03 5:28 ` Avi Kivity
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1180614091.11133.63.camel@localhost.localdomain \
--to=rusty-8n+1lvoiyb80n/f98k4iww@public.gmane.org \
--cc=cborntra-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org \
--cc=herbert-lOAM2aK0SrRLBo1qDEOMRrpzq4S04n8Q@public.gmane.org \
--cc=jimix-aZOuKsOsJu3MbYB6QlFGEg@public.gmane.org \
--cc=jmk-zzFmDc4TPjtKvsKVC3L/VUEOCMrvLtNR@public.gmane.org \
--cc=kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
--cc=schwidefsky-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org \
--cc=sfr-3FnU+UHB4dNDw9hX6IcOSA@public.gmane.org \
--cc=skranjac-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org \
--cc=virtualization-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=xen-devel-GuqFBffKawuULHF6PoxzQEEOCMrvLtNR@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.