From: Dor Laor <dor.laor-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Anthony Liguori <aliguori-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
Avi Kivity <avi-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
Subject: Re: [PATCH 5/6] Remove hypercall driver (v2)
Date: Sun, 11 Nov 2007 19:25:37 +0200 [thread overview]
Message-ID: <47373B11.9030208@qumranet.com> (raw)
In-Reply-To: <1194751246584-git-send-email-aliguori-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
Anthony Liguori wrote:
> I don't think there's any plans for this driver to every be used seriously as
> virtio seems like the agreed upon layer. So let's remove the code from the
> tree so I can use the drivers/ directory for something else.
>
>
There's also some vmchannel cmdline parameter that can be erased.
> Signed-off-by: Anthony Liguori <aliguori-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
>
> diff --git a/drivers/Kbuild b/drivers/Kbuild
> deleted file mode 100644
> index 16075ce..0000000
> --- a/drivers/Kbuild
> +++ /dev/null
> @@ -1,3 +0,0 @@
> -EXTRA_CFLAGS := -I$(src)/../
> -obj-m := hypercall.o
> -#hypercall-objs := hypercall.o
> diff --git a/drivers/Makefile b/drivers/Makefile
> deleted file mode 100644
> index 56facbb..0000000
> --- a/drivers/Makefile
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -include ../config.mak
> -KERNELDIR ?= /lib/modules/$(shell uname -r)/build
> -KVERREL = $(patsubst /lib/modules/%/build,%,$(KERNELDIR))
> -
> -DESTDIR=
> -
> -INSTALLDIR = $(patsubst %/build,%/extra,$(KERNELDIR))
> -
> -all::
> - $(MAKE) -C $(KERNELDIR) M=`pwd` "$$@"
> -
> -install:
> - mkdir -p $(DESTDIR)/$(INSTALLDIR)
> - cp *.ko $(DESTDIR)/$(INSTALLDIR)
> - /sbin/depmod -a
> -
> -clean:
> - $(MAKE) -C $(KERNELDIR) M=`pwd` $@
> -
> -svnclean:
> - svn st | grep '^\?' | awk '{print $2}' | xargs rm -rf
> diff --git a/drivers/hypercall.c b/drivers/hypercall.c
> deleted file mode 100644
> index 8f52c5e..0000000
> --- a/drivers/hypercall.c
> +++ /dev/null
> @@ -1,497 +0,0 @@
> -
> -#include <linux/module.h>
> -#include <linux/kernel.h>
> -#include <linux/compiler.h>
> -#include <linux/pci.h>
> -#include <linux/init.h>
> -#include <linux/ioport.h>
> -#include <linux/completion.h>
> -#include <linux/interrupt.h>
> -#include <asm/io.h>
> -#include <asm/uaccess.h>
> -#include <asm/irq.h>
> -
> -#define HYPERCALL_DRIVER_NAME "Qumranet_hypercall_driver"
> -#define HYPERCALL_DRIVER_VERSION "1"
> -#define PCI_VENDOR_ID_HYPERCALL 0x5002
> -#define PCI_DEVICE_ID_HYPERCALL 0x2258
> -
> -MODULE_AUTHOR ("Dor Laor <dor.laor-atKUWr5tajBWk0Htik3J/w@public.gmane.org>");
> -MODULE_DESCRIPTION (HYPERCALL_DRIVER_NAME);
> -MODULE_LICENSE("GPL");
> -MODULE_VERSION(HYPERCALL_DRIVER_VERSION);
> -
> -static int debug = 0;
> -module_param(debug, int, 0);
> -MODULE_PARM_DESC (debug, "toggle debug flag");
> -
> -#define HYPERCALL_DEBUG 1
> -#if HYPERCALL_DEBUG
> -# define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __FUNCTION__ , ## args)
> -# define assert(expr) \
> - if(unlikely(!(expr))) { \
> - printk(KERN_ERR "Assertion failed! %s,%s,%s,line=%d\n", \
> - #expr,__FILE__,__FUNCTION__,__LINE__); \
> - }
> -#else
> -# define DPRINTK(fmt, args...)
> -# define assert(expr) do {} while (0)
> -#endif
> -
> -static struct pci_device_id hypercall_pci_tbl[] = {
> - {PCI_VENDOR_ID_HYPERCALL, PCI_DEVICE_ID_HYPERCALL, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
> - {0,}
> -};
> -MODULE_DEVICE_TABLE (pci, hypercall_pci_tbl);
> -
> -
> -
> -/****** Hypercall device definitions ***************/
> -#include <qemu/hw/hypercall.h>
> -
> -/* read PIO/MMIO register */
> -#define HIO_READ8(reg, ioaddr) ioread8(ioaddr + (reg))
> -#define HIO_READ16(reg, ioaddr) ioread16(ioaddr + (reg))
> -#define HIO_READ32(reg, ioaddr) ioread32(ioaddr + (reg))
> -
> -/* write PIO/MMIO register */
> -#define HIO_WRITE8(reg, val8, ioaddr) iowrite8((val8), ioaddr + (reg))
> -#define HIO_WRITE16(reg, val16, ioaddr) iowrite16((val16), ioaddr + (reg))
> -#define HIO_WRITE32(reg, val32, ioaddr) iowrite32((val32), ioaddr + (reg))
> -
> -
> -struct hypercall_dev {
> - struct pci_dev *pci_dev;
> - struct kobject kobject;
> - u32 state;
> - spinlock_t lock;
> - u8 name[128];
> - u16 irq;
> - u32 regs_len;
> - void __iomem *io_addr;
> - unsigned long base_addr; /* device I/O address */
> - unsigned long cmd;
> -};
> -
> -
> -static int hypercall_close(struct hypercall_dev* dev);
> -static int hypercall_open(struct hypercall_dev *dev);
> -static void hypercall_cleanup_dev(struct hypercall_dev *dev);
> -static irqreturn_t hypercall_interrupt(int irq, void *dev_instance,
> - struct pt_regs *regs);
> -
> -static void __exit hypercall_sysfs_remove(struct hypercall_dev *dev);
> -static int hypercall_sysfs_add(struct hypercall_dev *dev);
> -
> -
> -static int __devinit hypercall_init_board(struct pci_dev *pdev,
> - struct hypercall_dev **dev_out)
> -{
> - unsigned long ioaddr;
> - struct hypercall_dev *dev;
> - int rc;
> - u32 disable_dev_on_err = 0;
> - unsigned long pio_start, pio_end, pio_flags, pio_len;
> - unsigned long mmio_start, mmio_end, mmio_flags, mmio_len;
> -
> - assert(pdev != NULL);
> -
> - *dev_out = NULL;
> -
> - dev = kzalloc(sizeof(*dev), GFP_KERNEL);
> - if (dev == NULL) {
> - printk (KERN_ERR "%s: Unable to alloc hypercall device\n", pci_name(pdev));
> - return -ENOMEM;
> - }
> - dev->pci_dev = pdev;
> - rc = pci_enable_device(pdev);
> - if (rc)
> - goto err_out;
> - disable_dev_on_err = 1;
> -
> - pio_start = pci_resource_start (pdev, 0);
> - pio_end = pci_resource_end (pdev, 0);
> - pio_flags = pci_resource_flags (pdev, 0);
> - pio_len = pci_resource_len (pdev, 0);
> -
> - mmio_start = pci_resource_start (pdev, 1);
> - mmio_end = pci_resource_end (pdev, 1);
> - mmio_flags = pci_resource_flags (pdev, 1);
> - mmio_len = pci_resource_len (pdev, 1);
> -
> - DPRINTK("PIO region size == 0x%02lX\n", pio_len);
> - DPRINTK("MMIO region size == 0x%02lX\n", mmio_len);
> -
> - rc = pci_request_regions (pdev, "hypercall");
> - if (rc)
> - goto err_out;
> -
> -#define USE_IO_OPS 1
> -#ifdef USE_IO_OPS
> - ioaddr = (unsigned long)pci_iomap(pdev, 0, 0);
> - //ioaddr = ioport_map(pio_start, pio_len);
> - if (!ioaddr) {
> - printk(KERN_ERR "%s: cannot map PIO, aborting\n", pci_name(pdev));
> - rc = -EIO;
> - goto err_out;
> - }
> - dev->base_addr = (unsigned long)pio_start;
> - dev->io_addr = (void*)ioaddr;
> - dev->regs_len = pio_len;
> -#else
> - ioaddr = pci_iomap(pdev, 1, 0);
> - if (ioaddr == NULL) {
> - printk(KERN_ERR "%s: cannot remap MMIO, aborting\n", pci_name(pdev));
> - rc = -EIO;
> - goto err_out;
> - }
> - dev->base_addr = ioaddr;
> - dev->io_addr = (void*)ioaddr;
> - dev->regs_len = mmio_len;
> -#endif /* USE_IO_OPS */
> -
> - *dev_out = dev;
> - return 0;
> -
> -err_out:
> - hypercall_cleanup_dev(dev);
> - if (disable_dev_on_err)
> - pci_disable_device(pdev);
> - return rc;
> -}
> -
> -static int __devinit hypercall_init_one(struct pci_dev *pdev,
> - const struct pci_device_id *ent)
> -{
> - struct hypercall_dev *dev;
> - u8 pci_rev;
> -
> - assert(pdev != NULL);
> - assert(ent != NULL);
> -
> - pci_read_config_byte(pdev, PCI_REVISION_ID, &pci_rev);
> -
> - if (pdev->vendor == PCI_VENDOR_ID_HYPERCALL &&
> - pdev->device == PCI_DEVICE_ID_HYPERCALL) {
> - printk(KERN_INFO "pci dev %s (id %04x:%04x rev %02x) is a guest hypercall device\n",
> - pci_name(pdev), pdev->vendor, pdev->device, pci_rev);
> - }
> -
> - if (hypercall_init_board(pdev, &dev) != 0)
> - return -1;
> -
> - assert(dev != NULL);
> -
> - dev->irq = pdev->irq;
> -
> - spin_lock_init(&dev->lock);
> - pci_set_drvdata(pdev, dev);
> -
> - printk (KERN_INFO "name=%s: base_addr=0x%lx, io_addr=0x%lx, IRQ=%d\n",
> - dev->name, dev->base_addr, (unsigned long)dev->io_addr, dev->irq);
> - hypercall_open(dev);
> -
> - if (hypercall_sysfs_add(dev) != 0)
> - return -1;
> -
> - return 0;
> -}
> -
> -static void __devexit hypercall_remove_one(struct pci_dev *pdev)
> -{
> - struct hypercall_dev *dev = pci_get_drvdata(pdev);
> -
> - assert(dev != NULL);
> -
> - hypercall_close(dev);
> - hypercall_sysfs_remove(dev);
> - hypercall_cleanup_dev(dev);
> - pci_disable_device(pdev);
> -}
> -
> -static int hypercall_tx(struct hypercall_dev *dev, unsigned char *buf, size_t len)
> -{
> - void __iomem *ioaddr = (void __iomem*)dev->io_addr;
> - int i;
> -
> - if (len > HP_MEM_SIZE)
> - return -EINVAL;
> -
> - spin_lock(&dev->lock);
> - HIO_WRITE8(HP_TXSIZE, len, ioaddr);
> - for (i=0; i< len; i++)
> - HIO_WRITE8(HP_TXBUFF, buf[i], ioaddr);
> - spin_unlock(&dev->lock);
> -
> - return 0;
> -}
> -
> -/*
> - * The interrupt handler does all of the rx work and cleans up
> - * after the tx
> - */
> -static irqreturn_t hypercall_interrupt(int irq, void *dev_instance,
> - struct pt_regs *regs)
> -{
> - struct hypercall_dev *dev = (struct hypercall_dev *)dev_instance;
> - void __iomem *ioaddr = (void __iomem*)dev->io_addr;
> - u32 status;
> - int irq_handled = IRQ_NONE;
> - int rx_buf_size;
> - int i;
> - u8 buffer[HP_MEM_SIZE];
> - u8 *pbuf;
> -
> - DPRINTK("base addr is 0x%lx, io_addr=0x%lx\n", dev->base_addr, (long)dev->io_addr);
> -
> - spin_lock(&dev->lock);
> - status = HIO_READ8(HSR_REGISTER, ioaddr);
> - DPRINTK("irq status is 0x%x\n", status);
> -
> - /* shared irq? */
> - if (unlikely((status & HSR_VDR) == 0)) {
> - DPRINTK("not handeling irq, not ours\n");
> - goto out;
> - }
> -
> - /* Disable device interrupts */
> - HIO_WRITE8(HCR_REGISTER, HCR_DI, ioaddr);
> - DPRINTK("disable device interrupts\n");
> -
> - rx_buf_size = HIO_READ8(HP_RXSIZE, ioaddr);
> - DPRINTK("Rx buffer size is %d\n", rx_buf_size);
> -
> - if (rx_buf_size > HP_MEM_SIZE)
> - rx_buf_size = HP_MEM_SIZE;
> -
> - for (i=0, pbuf=buffer; i<rx_buf_size; i++, pbuf++) {
> - *pbuf = HIO_READ8(HP_RXBUFF, ioaddr + i);
> - DPRINTK("Read 0x%x as dword %d\n", *pbuf, i);
> - }
> - *pbuf = '\0';
> - DPRINTK("Read buffer %s", (char*)buffer);
> -
> - HIO_WRITE8(HCR_REGISTER, HCR_EI, ioaddr);
> - DPRINTK("Enable interrupt\n");
> - irq_handled = IRQ_HANDLED;
> - out:
> - spin_unlock(&dev->lock);
> -
> -
> - hypercall_tx(dev, "hello host", sizeof("hello host"));
> - return irq_handled;
> -}
> -
> -
> -static int hypercall_open(struct hypercall_dev *dev)
> -{
> - int rc;
> -
> - rc = request_irq(dev->irq, &hypercall_interrupt,
> - SA_SHIRQ, dev->name, dev);
> - if (rc) {
> - printk(KERN_ERR "%s failed to request an irq\n", __FUNCTION__);
> - return rc;
> - }
> -
> - //hypercall_thread_start(dev);
> -
> - return 0;
> -}
> -
> -static int hypercall_close(struct hypercall_dev* dev)
> -{
> - //hypercall_thread_stop(dev);
> - synchronize_irq(dev->irq);
> - free_irq(dev->irq, dev);
> -
> - return 0;
> -}
> -
> -#ifdef CONFIG_PM
> -
> -static int hypercall_suspend(struct pci_dev *pdev, pm_message_t state)
> -{
> - pci_save_state(pdev);
> - pci_set_power_state(pdev, PCI_D3hot);
> - DPRINTK("Power mgmt suspend, set power state to PCI_D3hot\n");
> -
> - return 0;
> -}
> -
> -static int hypercall_resume(struct pci_dev *pdev)
> -{
> - pci_restore_state(pdev);
> - pci_set_power_state(pdev, PCI_D0);
> - DPRINTK("Power mgmt resume, set power state to PCI_D0\n");
> -
> - return 0;
> -}
> -
> -#endif /* CONFIG_PM */
> -
> -static void hypercall_cleanup_dev(struct hypercall_dev *dev)
> -{
> - DPRINTK("cleaning up\n");
> - pci_release_regions(dev->pci_dev);
> - pci_iounmap(dev->pci_dev, (void*)dev->io_addr);
> - pci_set_drvdata (dev->pci_dev, NULL);
> - kfree(dev);
> -}
> -
> -static struct pci_driver hypercall_pci_driver = {
> - .name = HYPERCALL_DRIVER_NAME,
> - .id_table = hypercall_pci_tbl,
> - .probe = hypercall_init_one,
> - .remove = __devexit_p(hypercall_remove_one),
> -#ifdef CONFIG_PM
> - .suspend = hypercall_suspend,
> - .resume = hypercall_resume,
> -#endif /* CONFIG_PM */
> -};
> -
> -static int __init hypercall_init_module(void)
> -{
> - printk (KERN_INFO HYPERCALL_DRIVER_NAME "\n");
> - return pci_module_init(&hypercall_pci_driver);
> -}
> -
> -static void __exit hypercall_cleanup_module(void)
> -{
> - pci_unregister_driver(&hypercall_pci_driver);
> -}
> -
> -/*
> - * sysfs support
> - */
> -
> -struct hypercall_attribute {
> - struct attribute attr;
> - ssize_t (*show)(struct hypercall_dev*, char *buf);
> - ssize_t (*store)(struct hypercall_dev*, unsigned long val);
> -};
> -
> -static ssize_t hypercall_attribute_show(struct kobject *kobj,
> - struct attribute *attr, char *buf)
> -{
> - struct hypercall_attribute *hypercall_attr;
> - struct hypercall_dev *hdev;
> -
> - hypercall_attr = container_of(attr, struct hypercall_attribute, attr);
> - hdev = container_of(kobj, struct hypercall_dev, kobject);
> -
> - if (!hypercall_attr->show)
> - return -EIO;
> -
> - return hypercall_attr->show(hdev, buf);
> -}
> -
> -static ssize_t hypercall_attribute_store(struct kobject *kobj,
> - struct attribute *attr, const char *buf, size_t count)
> -{
> - struct hypercall_attribute *hypercall_attr;
> - struct hypercall_dev *hdev;
> - char *endp;
> - unsigned long val;
> - int rc;
> -
> - val = simple_strtoul(buf, &endp, 0);
> -
> - hypercall_attr = container_of(attr, struct hypercall_attribute, attr);
> - hdev = container_of(kobj, struct hypercall_dev, kobject);
> -
> - if (!hypercall_attr->store)
> - return -EIO;
> -
> - rc = hypercall_attr->store(hdev, val);
> - if (!rc)
> - rc = count;
> - return rc;
> -}
> -
> -#define MAKE_HYPERCALL_R_ATTR(_name) \
> -static ssize_t _name##_show(struct hypercall_dev *hdev, char *buf) \
> -{ \
> - return sprintf(buf, "%lu\n", (unsigned long)hdev->_name); \
> -} \
> -struct hypercall_attribute hypercall_attr_##_name = __ATTR_RO(_name)
> -
> -#define MAKE_HYPERCALL_WR_ATTR(_name) \
> -static int _name##_store(struct hypercall_dev *hdev, unsigned long val) \
> -{ \
> - hdev->_name = (typeof(hdev->_name))val; \
> - return 0; \
> -} \
> -static ssize_t _name##_show(struct hypercall_dev *hdev, char *buf) \
> -{ \
> - return sprintf(buf, "%lu\n", (unsigned long)hdev->_name); \
> -} \
> -struct hypercall_attribute hypercall_attr_##_name = \
> - __ATTR(_name,S_IRUGO|S_IWUGO,_name##_show,_name##_store)
> -
> -MAKE_HYPERCALL_R_ATTR(base_addr);
> -MAKE_HYPERCALL_R_ATTR(irq);
> -MAKE_HYPERCALL_WR_ATTR(cmd);
> -
> -#define GET_HYPERCALL_ATTR(_name) (&hypercall_attr_##_name.attr)
> -
> -static struct attribute *hypercall_default_attrs[] = {
> - GET_HYPERCALL_ATTR(base_addr),
> - GET_HYPERCALL_ATTR(irq),
> - GET_HYPERCALL_ATTR(cmd),
> - NULL
> -};
> -
> -static struct sysfs_ops hypercall_sysfs_ops = {
> - .show = hypercall_attribute_show,
> - .store = hypercall_attribute_store,
> -};
> -
> -static void hypercall_sysfs_release(struct kobject *kobj)
> -{
> - DPRINTK(" called for obj name %s\n", kobj->name);
> -}
> -
> -static struct kobj_type hypercall_ktype = {
> - .release = hypercall_sysfs_release,
> - .sysfs_ops = &hypercall_sysfs_ops,
> - .default_attrs = hypercall_default_attrs
> -};
> -
> -
> -static int hypercall_sysfs_add(struct hypercall_dev *dev)
> -{
> - int rc;
> -
> - kobject_init(&dev->kobject);
> - dev->kobject.ktype = &hypercall_ktype;
> - rc = kobject_set_name(&dev->kobject, "%s", HYPERCALL_DRIVER_NAME);
> - if (rc != 0) {
> - printk("%s: kobject_set_name failed, err=%d\n", __FUNCTION__, rc);
> - return rc;
> - }
> -
> - rc = kobject_add(&dev->kobject);
> - if (rc != 0) {
> - printk("%s: kobject_add failed, err=%d\n", __FUNCTION__, rc);
> - return rc;
> - }
> -
> - rc = sysfs_create_link(&dev->pci_dev->dev.kobj, &dev->kobject,
> - HYPERCALL_DRIVER_NAME);
> - if (rc != 0) {
> - printk("%s: sysfs_create_link failed, err=%d\n", __FUNCTION__, rc);
> - kobject_del(&dev->kobject);
> - }
> -
> - return rc;
> -}
> -
> -static void hypercall_sysfs_remove(struct hypercall_dev *dev)
> -{
> - sysfs_remove_link(&dev->pci_dev->dev.kobj, HYPERCALL_DRIVER_NAME);
> - kobject_del(&dev->kobject);
> -}
> -
> -module_init(hypercall_init_module);
> -module_exit(hypercall_cleanup_module);
>
>
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
next prev parent reply other threads:[~2007-11-11 17:25 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-11-11 3:20 [PATCH 0/6] QEMU support for virtio (v2) Anthony Liguori
[not found] ` <11947512401155-git-send-email-aliguori-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2007-11-11 3:20 ` [PATCH 1/6] Basic virtio infrastructure for QEMU (v2) Anthony Liguori
2007-11-11 3:20 ` [PATCH 2/6] virtio block driver " Anthony Liguori
[not found] ` <11947512432057-git-send-email-aliguori-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2007-11-11 17:24 ` Dor Laor
[not found] ` <47373ADF.3000607-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-11-11 19:25 ` Anthony Liguori
[not found] ` <47375731.7020007-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2007-11-12 12:21 ` Dor Laor
[not found] ` <4738452F.8070502-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-11-12 23:25 ` Anthony Liguori
[not found] ` <4738E102.2050200-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2007-11-13 0:28 ` Rusty Russell
[not found] ` <200711131128.44492.rusty-8n+1lVoiYb80n/F98K4Iww@public.gmane.org>
2007-11-27 9:47 ` Avi Kivity
2007-11-12 15:02 ` Daniel P. Berrange
[not found] ` <20071112150211.GA14436-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2007-11-12 15:05 ` Avi Kivity
[not found] ` <47386BA9.8050000-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-11-12 23:26 ` Anthony Liguori
2007-11-11 3:20 ` [PATCH 3/6] 9p virtio transport " Anthony Liguori
2007-11-11 3:20 ` [PATCH 4/6] virtio network driver " Anthony Liguori
[not found] ` <11947512454030-git-send-email-aliguori-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2007-11-11 17:31 ` Dor Laor
[not found] ` <47373C6B.7090102-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-11-11 19:29 ` Anthony Liguori
2007-11-11 3:20 ` [PATCH 5/6] Remove hypercall driver (v2) Anthony Liguori
[not found] ` <1194751246584-git-send-email-aliguori-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2007-11-11 17:25 ` Dor Laor [this message]
2007-11-27 12:28 ` Avi Kivity
2007-11-11 3:20 ` [PATCH 6/6] Provide a mechanism to build virtio drivers as modules (v2) Anthony Liguori
[not found] ` <11947512473786-git-send-email-aliguori-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2007-11-27 12:30 ` 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=47373B11.9030208@qumranet.com \
--to=dor.laor-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
--cc=aliguori-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org \
--cc=avi-atKUWr5tajBWk0Htik3J/w@public.gmane.org \
--cc=dor.laor-atKUWr5tajBWk0Htik3J/w@public.gmane.org \
--cc=kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@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.