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

[Xen-devel] Re: [RFC PATCH 23/35] Add support for Xen event channels.



On Tue, 2006-03-21 at 22:31 -0800, Chris Wright wrote:
> plain text document attachment (22-evtchn)
> Support Xen event channels instead of the i8259 PIC.
> 
> Event channels are used to inject events into the kernel, either from
> the hypervisor or from another VM.  The injected events are mapped to
> interrupts.
> 
> If an event needs to be injected, the hypervisor causes an upcall into
> the kernel.  The upcall handler then scans the event pending bitmap
> and calls do_IRQ for each pending event.
> 
> Signed-off-by: Ian Pratt <ian.pratt@xxxxxxxxxxxxx>
> Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>
> Signed-off-by: Chris Wright <chrisw@xxxxxxxxxxxx>
> ---
>  arch/i386/kernel/Makefile               |    6 
>  arch/i386/mach-xen/evtchn.c             |  844 
> ++++++++++++++++++++++++++++++++
>  drivers/xen/core/Makefile               |    2 
>  include/asm-i386/hw_irq.h               |    4 
>  include/asm-i386/mach-xen/irq_vectors.h |  126 ++++
>  include/xen/evtchn.h                    |  113 ++++
>  6 files changed, 1093 insertions(+), 2 deletions(-)
> 
> --- xen-subarch-2.6.orig/arch/i386/kernel/Makefile
> +++ xen-subarch-2.6/arch/i386/kernel/Makefile
> @@ -5,7 +5,7 @@
>  extra-y := head.o init_task.o vmlinux.lds
>  
>  obj-y        := process.o semaphore.o signal.o entry.o traps.o irq.o \
> -             ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_i386.o \
> +             ptrace.o time.o ioport.o ldt.o setup.o hw_irq.o sys_i386.o \
>               pci-dma.o i386_ksyms.o i387.o dmi_scan.o bootflag.o \
>               quirks.o i8237.o topology.o
>  
> @@ -42,6 +42,10 @@ EXTRA_AFLAGS   := -traditional
>  
>  obj-$(CONFIG_SCx200)         += scx200.o
>  
> +hw_irq-y                     := i8259.o
> +
> +hw_irq-$(CONFIG_XEN)         := ../mach-xen/evtchn.o
> +
>  # vsyscall.o contains the vsyscall DSO images as __initdata.
>  # We must build both images before we can assemble it.
>  # Note: kbuild does not track this dependency due to usage of .incbin
> --- xen-subarch-2.6.orig/include/asm-i386/hw_irq.h
> +++ xen-subarch-2.6/include/asm-i386/hw_irq.h
> @@ -68,7 +68,9 @@ extern atomic_t irq_mis_count;
>  
>  #define IO_APIC_IRQ(x) (((x) >= 16) || ((1<<(x)) & io_apic_irqs))
>  
> -#if defined(CONFIG_X86_IO_APIC)
> +#if defined(CONFIG_X86_XEN)
> +extern void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i);
> +#elif defined(CONFIG_X86_IO_APIC)
>  static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i)
>  {
>       if (IO_APIC_IRQ(i))
> --- /dev/null
> +++ xen-subarch-2.6/arch/i386/mach-xen/evtchn.c
> @@ -0,0 +1,844 @@
> +/******************************************************************************
> + * evtchn.c
> + * 
> + * Communication via Xen event channels.
> + * 
> + * Copyright (c) 2002-2005, K A Fraser
> + * 
> + * This file may be distributed separately from the Linux kernel, or
> + * incorporated into other software packages, subject to the following 
> license:
> + * 


again no allowance for use inside the kernel


> + */
> +
> +#include <linux/config.h>
> +#include <linux/module.h>
> +#include <linux/irq.h>
> +#include <linux/interrupt.h>
> +#include <linux/sched.h>
> +#include <linux/kernel_stat.h>
> +#include <linux/version.h>

this highly looks that it's not possible to be used outside the linux
kernel so the license is odd

> +/* Convenient shorthand for packed representation of an unbound IRQ. */
> +#define IRQ_UNBOUND  mk_irq_info(IRQT_UNBOUND, 0, 0)
> +/* Accessor macros for packed IRQ information. */
> +#define evtchn_from_irq(irq) ((u16)(irq_info[irq]))
> +#define index_from_irq(irq)  ((u8)(irq_info[irq] >> 16))
> +#define type_from_irq(irq)   ((u8)(irq_info[irq] >> 24))

static inlines please

> +#ifdef CONFIG_XEN_EVTCHN_DEVICE
> +                             evtchn_device_upcall(port);
> +#else
> +                             mask_evtchn(port);
> +#endif

why this ifdef ?

> +static int find_unbound_irq(void)
> +{
> +     int irq;
> +
> +     for (irq = 0; irq < NR_IRQS; irq++)
> +             if (irq_bindcount[irq] == 0)
> +                     break;
> +
> +     if (irq == NR_IRQS) {
> +             printk(KERN_ERR "No available IRQ to bind to: increase 
> NR_IRQS!\n");

there is no way to share interrupts? A shame


> +EXPORT_SYMBOL(bind_virq_to_irqhandler);

this is highly low level interfact, please make this and the others a
_GPL export




_______________________________________________
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®.