All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rusty Russell <rusty-8n+1lVoiYb80n/F98K4Iww@public.gmane.org>
To: kvm-devel <kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org>
Cc: lguest <lguest-mnsaURCQ41sdnm+yROfE0A@public.gmane.org>,
	virtualization
	<virtualization-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org>
Subject: [PATCH 6/6] virtio ring helper
Date: Thu, 20 Sep 2007 22:27:14 +1000	[thread overview]
Message-ID: <1190291234.7262.246.camel@localhost.localdomain> (raw)
In-Reply-To: <1190290761.7262.242.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>

These helper routines supply most of the virtqueue_ops for hypervisors
which want to use a ring for virtio.  Unlike the previous lguest
implementation:

1) The rings are variable sized (2^n-1 elements).
2) They have an unfortunate limit of 65535 bytes per sg element.
3) The page numbers are always 64 bit (PAE anyone?)
4) They no longer place used[] on a separate page, just a separate
   cacheline.
5) We do a modulo on a variable.  We could be tricky if we cared.

Users need only implement the new_vq and free_vq hooks (KVM wants the
guest to allocate the rings, lguest does it sanely).

Signed-off-by: Rusty Russell <rusty-8n+1lVoiYb80n/F98K4Iww@public.gmane.org>
---
 arch/i386/lguest/Kconfig     |    1 
 drivers/virtio/Kconfig       |    5 
 drivers/virtio/Makefile      |    1 
 drivers/virtio/virtio_ring.c |  301 ++++++++++++++++++++++++++++++++++++++++++
 drivers/virtio/vring.h       |   50 ++++++
 include/linux/virtio_ring.h  |   96 +++++++++++++
 6 files changed, 454 insertions(+)

===================================================================
--- a/arch/i386/lguest/Kconfig
+++ b/arch/i386/lguest/Kconfig
@@ -2,6 +2,7 @@ config LGUEST_GUEST
 	bool "Lguest guest support"
 	select PARAVIRT
 	depends on !X86_PAE
+	select VIRTIO_RING
 	help
 	  Lguest is a tiny in-kernel hypervisor.  Selecting this will
 	  allow your kernel to boot under lguest.  This option will increase
===================================================================
--- a/drivers/virtio/Kconfig
+++ b/drivers/virtio/Kconfig
@@ -1,3 +1,8 @@
 # Virtio always gets selected by whoever wants it.
 config VIRTIO
 	bool
+
+# Similarly the virtio ring implementation.
+config VIRTIO_RING
+	bool
+	depends on VIRTIO
===================================================================
--- a/drivers/virtio/Makefile
+++ b/drivers/virtio/Makefile
@@ -1,1 +1,2 @@ obj-$(CONFIG_VIRTIO) += virtio.o config.
 obj-$(CONFIG_VIRTIO) += virtio.o config.o
+obj-$(CONFIG_VIRTIO_RING) += virtio_ring.o
===================================================================
--- /dev/null
+++ b/drivers/virtio/virtio_ring.c
@@ -0,0 +1,301 @@
+/* Virtio ring implementation.
+ *
+ *  Copyright 2007 Rusty Russell IBM Corporation
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+#include <linux/virtio.h>
+#include <linux/virtio_ring.h>
+#include <linux/device.h>
+#include "vring.h"
+
+#ifdef DEBUG
+/* For development, we want to crash whenever the ring is screwed. */
+#define BAD_RING(vvq, fmt...)			\
+	do { dev_err(vvq->dev, fmt); BUG(); } while(0)
+#define START_USE(vvq) \
+	do { if ((vvq)->in_use) panic("in_use = %i\n", (vvq)->in_use); (vvq)->in_use = __LINE__; mb(); } while(0)
+#define END_USE(vvq) \
+	do { BUG_ON(!(vvq)->in_use); (vvq)->in_use = 0; mb(); } while(0)
+#else
+#define BAD_RING(vvq, fmt...)			\
+	do { dev_err(vvq->dev, fmt); (vvq)->broken = true; } while(0)
+#define START_USE(vvq)
+#define END_USE(vvq)
+#endif
+
+struct virtqueue
+{
+	/* Callback for driver when data is consumed. */
+	bool (*callback)(void *);
+	void *cb_data;
+
+	/* Who to blame this on. */
+	struct device *dev;
+
+	/* Actual memory layout for this queue */
+	struct vring vring;
+
+	/* Other side has made a mess, don't try any more. */
+	bool broken;
+
+	/* Number of free buffers */
+	unsigned int num_free;
+	/* Head of free buffer list. */
+	unsigned int free_head;
+	/* Number we've added since last sync. */
+	unsigned int num_added;
+
+	/* Last used index we've seen. */
+	unsigned int last_used_idx;
+
+	/* How to notify other side. FIXME: commonalize hcalls! */
+	void (*notify)(void *priv);
+	void *priv;
+
+	/* Unless they told us to stop */
+	bool running;
+
+#ifdef DEBUG
+	/* They're supposed to lock for us. */
+	unsigned int in_use;
+#endif
+
+	/* Tokens for callbacks. */
+	void *data[];
+};
+
+void *vring_priv(struct virtqueue *vq)
+{
+	return vq->priv;
+}
+
+int vring_add_buf(struct virtqueue *vq,
+		  struct scatterlist sg[],
+		  unsigned int out,
+		  unsigned int in,
+		  void *data)
+{
+	unsigned int i, avail, head, uninitialized_var(prev);
+
+	BUG_ON(data == NULL);
+	BUG_ON(out + in > vq->vring.num);
+	BUG_ON(out + in == 0);
+
+	START_USE(vq);
+
+	if (vq->num_free < out + in) {
+		pr_debug("Can't add buf len %i - avail = %i\n",
+			 out + in, vq->num_free);
+		END_USE(vq);
+		return -ENOSPC;
+	}
+
+	/* We're about to use some buffers from the free list. */
+	vq->num_free -= out + in;
+
+	head = vq->free_head;
+	for (i = vq->free_head; out; i = vq->vring.desc[i].next, out--) {
+		vq->vring.desc[i].flags = VRING_DESC_F_NEXT;
+		vq->vring.desc[i].pfn = page_to_pfn(sg[0].page);
+		BUG_ON(sg[0].offset > 65535);
+		BUG_ON(sg[0].length > 65535);
+		vq->vring.desc[i].offset = sg[0].offset;
+		vq->vring.desc[i].len = sg[0].length;
+		prev = i;
+		sg++;
+	}
+	for (; in; i = vq->vring.desc[i].next, in--) {
+		vq->vring.desc[i].flags=VRING_DESC_F_NEXT|VRING_DESC_F_WRITE;
+		vq->vring.desc[i].pfn = page_to_pfn(sg[0].page);
+		BUG_ON(sg[0].offset > 65535);
+		BUG_ON(sg[0].length > 65535);
+		vq->vring.desc[i].offset = sg[0].offset;
+		vq->vring.desc[i].len = sg[0].length;
+		prev = i;
+		sg++;
+	}
+	/* Last one doesn't continue. */
+	vq->vring.desc[prev].flags &= ~VRING_DESC_F_NEXT;
+
+	/* Update free pointer */
+	vq->free_head = i;
+
+	/* Set token. */
+	vq->data[head] = data;
+
+	/* Put entry in available array (but don't update avail->idx until they
+	 * do sync).  FIXME: avoid modulus here? */
+	avail = (vq->vring.avail->idx + vq->num_added++) % vq->vring.num;
+	vq->vring.avail->ring[avail] = head;
+
+	pr_debug("Added buffer head %i to %p\n", head, vq);
+	END_USE(vq);
+	return 0;
+}
+
+void vring_kick(struct virtqueue *vq)
+{
+	START_USE(vq);
+	/* Descriptors and available array need to be set before we expose the
+	 * new available array entries. */
+	wmb();
+
+	vq->vring.avail->idx += vq->num_added;
+	vq->num_added = 0;
+
+	/* Prod other side to tell it about changes. */
+	vq->notify(vq->priv);
+	END_USE(vq);
+}
+
+static void detach_buf(struct virtqueue *vq, unsigned int head)
+{
+	unsigned int i;
+
+	/* Clear data ptr. */
+	vq->data[head] = NULL;
+
+	/* Put back on free list: find end */
+	i = head;
+	while (vq->vring.desc[i].flags & VRING_DESC_F_NEXT) {
+		i = vq->vring.desc[i].next;
+		vq->num_free++;
+	}
+
+	vq->vring.desc[i].next = vq->free_head;
+	vq->free_head = head;
+	/* Plus final descriptor */
+	vq->num_free++;
+}
+
+/* FIXME: We need to tell other side about removal, to synchronize. */
+void vring_shutdown(struct virtqueue *vq)
+{
+	unsigned int i;
+
+	for (i = 0; i < vq->vring.num; i++)
+		detach_buf(vq, i);
+}
+
+static bool more_used(const struct virtqueue *vq)
+{
+	return vq->last_used_idx != vq->vring.used->idx;
+}
+
+void *vring_get_buf(struct virtqueue *vq, unsigned int *len)
+{
+	void *ret;
+	unsigned int i;
+
+	START_USE(vq);
+
+	if (!more_used(vq)) {
+		pr_debug("No more buffers in queue\n");
+		END_USE(vq);
+		return NULL;
+	}
+
+	i = vq->vring.used->ring[vq->last_used_idx%vq->vring.num].id;
+	*len = vq->vring.used->ring[vq->last_used_idx%vq->vring.num].len;
+
+	if (unlikely(i >= vq->vring.num)) {
+		BAD_RING(vq, "id %u out of range\n", i);
+		return NULL;
+	}
+	if (unlikely(!vq->data[i])) {
+		BAD_RING(vq, "id %u is not a head!\n", i);
+		return NULL;
+	}
+
+	/* detach_buf clears data, so grab it now. */
+	ret = vq->data[i];
+	detach_buf(vq, i);
+	vq->last_used_idx++;
+	END_USE(vq);
+	return ret;
+}
+
+/* FIXME: Put running in shmem */
+bool vring_restart(struct virtqueue *vq)
+{
+	START_USE(vq);
+	BUG_ON(vq->running);
+
+	if (likely(!more_used(vq)) || unlikely(vq->broken))
+		vq->running = true;
+
+	END_USE(vq);
+	return vq->running;
+}
+
+irqreturn_t vring_interrupt(int irq, void *_vq)
+{
+	struct virtqueue *vq = _vq;
+
+	pr_debug("virtqueue interrupt for %p\n", vq);
+
+	if (unlikely(vq->broken))
+		return IRQ_HANDLED;
+
+	if (vq->running && more_used(vq)) {
+		pr_debug("virtqueue callback for %p (%p)\n", vq, vq->callback);
+		vq->running = vq->callback(vq->cb_data);
+	} else
+		pr_debug("virtqueue %p no more used\n", vq);
+
+	return IRQ_HANDLED;
+}
+
+struct virtqueue *vring_new_virtqueue(unsigned int num,
+				      struct device *dev,
+				      void *pages,
+				      void (*notify)(void *priv), void *priv,
+				      bool (*callback)(void *), void *cb_data)
+{
+	struct virtqueue *vq;
+	unsigned int i;
+
+	vq = kmalloc(sizeof(*vq) + sizeof(void *)*num, GFP_KERNEL);
+	if (!vq)
+		return NULL;
+
+	vring_init(&vq->vring, num, pages);
+	vq->callback = callback;
+	vq->cb_data = cb_data;
+	vq->dev = dev;
+	vq->notify = notify;
+	vq->priv = priv;
+	vq->broken = false;
+	vq->last_used_idx = 0;
+	vq->num_added = 0;
+	vq->running = true;
+#ifdef DEBUG
+	vq->in_use = false;
+#endif
+
+	/* Put everything in free lists. */
+	vq->num_free = num;
+	vq->free_head = 0;
+	for (i = 0; i < num-1; i++)
+		vq->vring.desc[i].next = i+1;
+
+	return vq;
+}
+
+void vring_destroy_virtqueue(struct virtqueue *vq)
+{
+	kfree(vq);
+}
===================================================================
--- /dev/null
+++ b/drivers/virtio/vring.h
@@ -0,0 +1,50 @@
+#ifndef _VRING_VRING_H
+#define _VRING_VRING_H
+#include <linux/virtio.h>
+#include <linux/irqreturn.h>
+
+/* A vring consists of a continuous chunk of memory which looks like so:
+ * (use num == 2^n-1 to make it nicely cacheline aligned).
+ *
+ * struct vring
+ * {
+ *	// The actual descriptors.
+ *	struct vring_desc desc[num];
+ *
+ *	// A ring of available descriptor heads with free-running index.
+ *	__u16 avail_idx;
+ *	__u16 available[num];
+ *
+ *	// Padding so a correctly-chosen num value will cache-align used_idx.
+ *	char pad[sizeof(struct vring_desc) - sizeof(__u16)];
+ *
+ *	// A ring of used descriptor heads with free-running index.
+ *	__u16 used_idx;
+ *	struct vring_used_elem used[num];
+ * };
+ */
+struct virtqueue *vring_new_virtqueue(unsigned int num,
+				      struct device *dev,
+				      void *pages,
+				      void (*notify)(void *priv), void *priv,
+				      bool (*callback)(void *), void *cb_data);
+void vring_destroy_virtqueue(struct virtqueue *vq);
+
+irqreturn_t vring_interrupt(int irq, void *_vq);
+
+void *vring_priv(struct virtqueue *vq);
+
+int vring_add_buf(struct virtqueue *vq,
+		  struct scatterlist sg[],
+		  unsigned int out,
+		  unsigned int in,
+		  void *data);
+
+void vring_kick(struct virtqueue *vq);
+
+void *vring_get_buf(struct virtqueue *vq, unsigned int *len);
+
+bool vring_restart(struct virtqueue *vq);
+
+void vring_shutdown(struct virtqueue *vq);
+#endif /* _VRING_VRING_H */
===================================================================
--- /dev/null
+++ b/include/linux/virtio_ring.h
@@ -0,0 +1,96 @@
+#ifndef _LINUX_VIRTIO_RING_H
+#define _LINUX_VIRTIO_RING_H
+/* An interface for efficient virtio implementation, currently for use by KVM
+ * and lguest, but hopefully others soon.  Do NOT change this since it will
+ * break existing servers and clients.
+ *
+ * This header is BSD licensed so anyone can use the definitions to implement
+ * compatible drivers/servers.
+ *
+ * Copyright Rusty Russell IBM Corporation 2007. */
+#include <linux/types.h>
+
+/* This marks a buffer as continuing via the next field. */
+#define VRING_DESC_F_NEXT	1
+/* This marks a buffer as write-only (otherwise read-only). */
+#define VRING_DESC_F_WRITE	2
+
+/* Virtio ring descriptors: 16 bytes.  These can chain together via "next". */
+struct vring_desc
+{
+	/* Page number. */
+	__u64 pfn;
+	/* Length and offset. */
+	__u16 len;
+	__u16 offset;
+	/* The flags as indicated above. */
+	__u16 flags;
+	/* We chain unused descriptors via this, too */
+	__u16 next;
+};
+
+struct vring_avail
+{
+	__u16 idx;
+	__u16 ring[];
+};
+
+/* u32 is used here for ids for padding reasons. */
+struct vring_used_elem
+{
+	/* Index of start of used descriptor chain. */
+	__u32 id;
+	/* Total length of the descriptor chain which was used (written to) */
+	__u32 len;
+};
+
+struct vring_used
+{
+	__u32 idx;
+	struct vring_used_elem ring[];
+};
+
+struct vring {
+	unsigned int num;
+
+	struct vring_desc *desc;
+
+	struct vring_avail *avail;
+
+	struct vring_used *used;
+};
+
+/* The standard layout for the ring is a continuous chunk of memory which looks
+ * like this.  The used fields will be aligned to a "num+1" boundary.
+ *
+ * struct vring
+ * {
+ *	// The actual descriptors (16 bytes each)
+ *	struct vring_desc desc[num];
+ *
+ *	// A ring of available descriptor heads with free-running index.
+ *	__u16 avail_idx;
+ *	__u16 available[num];
+ *
+ *	// Padding so a correctly-chosen num value will cache-align used_idx.
+ *	char pad[sizeof(struct vring_desc)];
+ *
+ *	// A ring of used descriptor heads with free-running index.
+ *	__u32 used_idx;
+ *	struct vring_used_elem used[num];
+ * };
+ */
+static inline void vring_init(struct vring *vr, unsigned int num, void *p)
+{
+	vr->num = num;
+	vr->desc = p;
+	vr->avail = p + num*sizeof(struct vring);
+	vr->used = p + (num+1)*(sizeof(struct vring) + sizeof(__u16));
+}
+
+static inline unsigned vring_size(unsigned int num)
+{
+	return (num + 1) * (sizeof(struct vring_desc) + sizeof(__u16))
+		+ sizeof(__u32) + num * sizeof(struct vring_used_elem);
+}
+#endif /* _LINUX_VIRTIO_RING_H */



-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/

  parent reply	other threads:[~2007-09-20 12:27 UTC|newest]

Thread overview: 79+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-09-20 12:03 [PATCH 0/6] virtio with config abstraction and ring implementation Rusty Russell
2007-09-20 12:09 ` [PATCH 1/6] virtio interace Rusty Russell
2007-09-20 13:43 ` [PATCH 0/6] virtio with config abstraction and ring implementation Dor Laor
     [not found] ` <1190289808.7262.223.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-20 12:09   ` [PATCH 1/6] virtio interace Rusty Russell
2007-09-20 12:12     ` [PATCH 2/6] virtio_config Rusty Russell
     [not found]     ` <1190290140.7262.228.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-20 12:12       ` Rusty Russell
2007-09-20 12:14         ` [PATCH 3/6] virtio net driver Rusty Russell
2007-09-20 12:36         ` [kvm-devel] [PATCH 2/6] virtio_config Avi Kivity
     [not found]         ` <1190290369.7262.231.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-20 12:14           ` [PATCH 3/6] virtio net driver Rusty Russell
2007-09-20 12:16             ` [PATCH 4/6] virtio block driver Rusty Russell
2007-09-21 10:48             ` [kvm-devel] [PATCH 3/6] virtio net driver Christian Borntraeger
     [not found]             ` <1190290495.7262.235.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-20 12:16               ` [PATCH 4/6] virtio block driver Rusty Russell
2007-09-20 12:19                 ` [PATCH 5/6] virtio console driver Rusty Russell
     [not found]                 ` <1190290606.7262.239.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-20 12:19                   ` Rusty Russell
     [not found]                     ` <1190290761.7262.242.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-20 12:27                       ` Rusty Russell [this message]
2007-09-20 12:43                         ` [kvm-devel] [PATCH 6/6] virtio ring helper Avi Kivity
     [not found]                         ` <1190291234.7262.246.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-20 12:43                           ` Avi Kivity
     [not found]                             ` <46F26AF6.60904-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-09-21  2:04                               ` Rusty Russell
2007-09-23 10:05                                 ` [kvm-devel] " Avi Kivity
     [not found]                                 ` <1190340251.19451.36.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-23 10:05                                   ` Avi Kivity
2007-09-23 11:40                                     ` [kvm-devel] " Rusty Russell
     [not found]                                     ` <46F63A64.9070200-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-09-23 11:40                                       ` Rusty Russell
     [not found]                                         ` <1190547607.27805.120.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-23 11:46                                           ` Avi Kivity
2007-09-23 11:46                                         ` [kvm-devel] " Avi Kivity
2007-09-21  2:04                             ` Rusty Russell
2007-09-20 12:27                     ` Rusty Russell
2007-09-20 12:27                   ` [PATCH 4/6] virtio block driver Jens Axboe
2007-09-21 12:00                     ` Rusty Russell
     [not found]                     ` <20070920122713.GK2367-tSWWG44O7X1aa/9Udqfwiw@public.gmane.org>
2007-09-21 12:00                       ` Rusty Russell
2007-09-21 12:27                         ` Jens Axboe
     [not found]                         ` <1190376007.27805.19.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-21 12:27                           ` Jens Axboe
2007-09-23  6:47                             ` Rusty Russell
     [not found]                             ` <20070921122746.GO2367-tSWWG44O7X1aa/9Udqfwiw@public.gmane.org>
2007-09-23  6:47                               ` Rusty Russell
2007-09-20 13:05                   ` Jens Axboe
2007-09-21  2:06                     ` Rusty Russell
2007-09-21 11:47                       ` Jens Axboe
     [not found]                       ` <1190340367.19451.40.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-21 11:47                         ` Jens Axboe
2007-09-21 12:30                           ` Rusty Russell
     [not found]                           ` <20070921114703.GN2367-tSWWG44O7X1aa/9Udqfwiw@public.gmane.org>
2007-09-21 12:30                             ` Rusty Russell
2007-09-20 12:27                 ` Jens Axboe
2007-09-20 13:05                 ` Jens Axboe
2007-09-21 10:48               ` [PATCH 3/6] virtio net driver Christian Borntraeger
     [not found]                 ` <200709211248.11783.borntraeger-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-09-21 11:53                   ` Rusty Russell
2007-09-21 12:36                     ` [kvm-devel] " Christian Borntraeger
     [not found]                     ` <1190375615.27805.9.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-21 12:36                       ` Christian Borntraeger
     [not found]                         ` <200709211436.43964.borntraeger-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-09-21 14:08                           ` Herbert Xu
     [not found]                             ` <20070921140833.GA12242-lOAM2aK0SrRLBo1qDEOMRrpzq4S04n8Q@public.gmane.org>
2007-09-21 14:42                               ` Christian Borntraeger
2007-09-23  7:13                                 ` [kvm-devel] " Rusty Russell
     [not found]                                 ` <200709211642.25208.borntraeger-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>
2007-09-23  7:13                                   ` Rusty Russell
2007-09-21 14:42                             ` [kvm-devel] " Christian Borntraeger
2007-09-21 14:08                         ` Herbert Xu
2007-09-21 11:53                 ` Rusty Russell
2007-09-20 12:36           ` [PATCH 2/6] virtio_config Avi Kivity
2007-09-20 12:55             ` [kvm-devel] " Avi Kivity
     [not found]             ` <46F26958.4080102-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-09-20 12:55               ` Avi Kivity
     [not found]                 ` <46F26DC7.9040001-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-09-21  1:50                   ` Rusty Russell
     [not found]                     ` <1190339435.19451.23.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-22 13:03                       ` Avi Kivity
2007-09-22 13:03                     ` [kvm-devel] " Avi Kivity
2007-09-21  1:50                 ` Rusty Russell
2007-09-20 12:27       ` [PATCH 1/6] virtio interace Avi Kivity
2007-09-21 11:37         ` [kvm-devel] " Rusty Russell
2007-09-21 12:05       ` Arnd Bergmann
     [not found]         ` <200709211405.32116.arnd-r2nGTMty4D4@public.gmane.org>
2007-09-21 12:45           ` Rusty Russell
     [not found]             ` <1190378736.27805.54.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-21 14:22               ` Arnd Bergmann
2007-09-22  9:55                 ` Rusty Russell
     [not found]                   ` <1190454934.27805.80.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-22 10:01                     ` Arnd Bergmann
2007-09-23  8:33                       ` Rusty Russell
     [not found]                       ` <200709221201.33865.arnd-r2nGTMty4D4@public.gmane.org>
2007-09-23  8:33                         ` Rusty Russell
     [not found]                           ` <1190536431.27805.109.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-23 11:20                             ` Dor Laor
2007-09-23 11:20                           ` Dor Laor
2007-09-22 10:01                   ` Arnd Bergmann
2007-09-21 14:22             ` Arnd Bergmann
2007-09-21 12:45         ` Rusty Russell
2007-09-20 12:27     ` [kvm-devel] " Avi Kivity
2007-09-21 12:05     ` Arnd Bergmann
2007-09-20 13:43   ` [PATCH 0/6] virtio with config abstraction and ring implementation Dor Laor
2007-09-20 13:50     ` [Lguest] [PATCH 0/6] virtio with config abstraction and ringimplementation Dor Laor
     [not found]     ` <46F2791A.8070601-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-09-20 13:50       ` Dor Laor
2007-09-21  3:20     ` [PATCH 0/6] virtio with config abstraction and ring implementation Rusty Russell

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=1190291234.7262.246.camel@localhost.localdomain \
    --to=rusty-8n+1lvoiyb80n/f98k4iww@public.gmane.org \
    --cc=kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
    --cc=lguest-mnsaURCQ41sdnm+yROfE0A@public.gmane.org \
    --cc=virtualization-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@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.