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

[Xen-changelog] [IA64] Fix domain destroy bug when multiple domains exist



# HG changeset patch
# User awilliam@xxxxxxxxxxx
# Node ID 51c79c67908ba7191c590374a9c33d9c420eee1f
# Parent  e45666b8b05f01f9fb43dbc25c085c802c64b52d
[IA64] Fix domain destroy bug when multiple domains exist

Currently vmx irq handler doesn't handle IA64_IPI_VECTOR, which is
instead pended to dom0 incorrectly. That bug made people observing 
system hang when destroying domU with domVTI kept running. Actually
there's no need for two different irq handlers, which should be
same as long as softirq is checked at exit path back to guest. So
remove vmx version here.

With this fix, now we can create two domains (domU+domVTI), then
destroy domU, create another domVTI, destroy domVTI with all steps
successfully finished.

Signed-off-by: Xiantao Zhang <xiantao.zhang@xxxxxxxxx>
Signed-off-by: Kevin Tian <kevin.tian@xxxxxxxxx>

diff -r e45666b8b05f -r 51c79c67908b xen/arch/ia64/vmx/Makefile
--- a/xen/arch/ia64/vmx/Makefile        Fri Mar 24 10:41:48 2006 -0700
+++ b/xen/arch/ia64/vmx/Makefile        Fri Mar 24 10:46:14 2006 -0700
@@ -10,7 +10,6 @@ obj-y += vmx_hypercall.o
 obj-y += vmx_hypercall.o
 obj-y += vmx_init.o
 obj-y += vmx_interrupt.o
-obj-y += vmx_irq_ia64.o
 obj-y += vmx_ivt.o
 obj-y += vmx_phy_mode.o
 obj-y += vmx_process.o
diff -r e45666b8b05f -r 51c79c67908b xen/arch/ia64/vmx/vmx_ivt.S
--- a/xen/arch/ia64/vmx/vmx_ivt.S       Fri Mar 24 10:41:48 2006 -0700
+++ b/xen/arch/ia64/vmx/vmx_ivt.S       Fri Mar 24 10:46:14 2006 -0700
@@ -551,7 +551,7 @@ ENTRY(vmx_interrupt)
        movl r14=ia64_leave_nested
        ;;
        mov rp=r14
-       br.call.sptk.many b6=vmx_ia64_handle_irq
+       br.call.sptk.many b6=ia64_handle_irq
        ;;
 END(vmx_interrupt)
 
@@ -1110,7 +1110,7 @@ ENTRY(vmx_dispatch_interrupt)
        mov rp=r14
        ;;
        add out1=16,sp          // pass pointer to pt_regs as second arg
-       br.call.sptk.many b6=vmx_ia64_handle_irq
+       br.call.sptk.many b6=ia64_handle_irq
 END(vmx_dispatch_interrupt)
 
 
diff -r e45666b8b05f -r 51c79c67908b xen/arch/ia64/vmx/vmx_irq_ia64.c
--- a/xen/arch/ia64/vmx/vmx_irq_ia64.c  Fri Mar 24 10:41:48 2006 -0700
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,133 +0,0 @@
-#include <linux/config.h>
-#include <linux/module.h>
-
-#include <linux/jiffies.h>
-#include <linux/errno.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/kernel_stat.h>
-#include <linux/slab.h>
-#include <linux/ptrace.h>
-#include <linux/random.h>      /* for rand_initialize_irq() */
-#include <linux/signal.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/threads.h>
-#include <linux/bitops.h>
-
-#include <asm/delay.h>
-#include <asm/intrinsics.h>
-#include <asm/io.h>
-#include <asm/hw_irq.h>
-#include <asm/machvec.h>
-#include <asm/pgtable.h>
-#include <asm/system.h>
-
-#include <asm/vcpu.h>
-#include <xen/irq.h>
-#ifdef CONFIG_SMP
-#   define IS_RESCHEDULE(vec)   (vec == IA64_IPI_RESCHEDULE)
-#else
-#   define IS_RESCHEDULE(vec)   (0)
-#endif
-
-#ifdef CONFIG_PERFMON
-# include <asm/perfmon.h>
-#endif
-
-#define IRQ_DEBUG      0
-
-#define vmx_irq_enter()                \
-       add_preempt_count(HARDIRQ_OFFSET);
-
-/* Now softirq will be checked when leaving hypervisor, or else
- * scheduler irq will be executed too early.
- */
-#define vmx_irq_exit(void)     \
-       sub_preempt_count(HARDIRQ_OFFSET);
-/*
- * That's where the IVT branches when we get an external
- * interrupt. This branches to the correct hardware IRQ handler via
- * function ptr.
- */
-void
-vmx_ia64_handle_irq (ia64_vector vector, struct pt_regs *regs)
-{
-       unsigned long saved_tpr;
-       int     wake_dom0 = 0;
-
-
-#if IRQ_DEBUG
-       {
-               unsigned long bsp, sp;
-
-               /*
-                * Note: if the interrupt happened while executing in
-                * the context switch routine (ia64_switch_to), we may
-                * get a spurious stack overflow here.  This is
-                * because the register and the memory stack are not
-                * switched atomically.
-                */
-               bsp = ia64_getreg(_IA64_REG_AR_BSP);
-               sp = ia64_getreg(_IA64_REG_AR_SP);
-
-               if ((sp - bsp) < 1024) {
-                       static unsigned char count;
-                       static long last_time;
-
-                       if (jiffies - last_time > 5*HZ)
-                               count = 0;
-                       if (++count < 5) {
-                               last_time = jiffies;
-                               printk("ia64_handle_irq: DANGER: less than "
-                                      "1KB of free stack space!!\n"
-                                      "(bsp=0x%lx, sp=%lx)\n", bsp, sp);
-                       }
-               }
-       }
-#endif /* IRQ_DEBUG */
-
-       /*
-        * Always set TPR to limit maximum interrupt nesting depth to
-        * 16 (without this, it would be ~240, which could easily lead
-        * to kernel stack overflows).
-        */
-       vmx_irq_enter();
-       saved_tpr = ia64_getreg(_IA64_REG_CR_TPR);
-       ia64_srlz_d();
-       while (vector != IA64_SPURIOUS_INT_VECTOR) {
-           if (!IS_RESCHEDULE(vector)) {
-               ia64_setreg(_IA64_REG_CR_TPR, vector);
-               ia64_srlz_d();
-
-               if (vector != IA64_TIMER_VECTOR) {
-                       /* FIXME: Leave IRQ re-route later */
-                       if (!VMX_DOMAIN(dom0->vcpu[0]))
-                               vcpu_pend_interrupt(dom0->vcpu[0],vector);
-                       else
-                               vmx_vcpu_pend_interrupt(dom0->vcpu[0],vector);
-                       wake_dom0 = 1;
-               }
-               else {  // FIXME: Handle Timer only now
-                       __do_IRQ(local_vector_to_irq(vector), regs);
-               }
-               
-               /*
-                * Disable interrupts and send EOI:
-                */
-               local_irq_disable();
-               ia64_setreg(_IA64_REG_CR_TPR, saved_tpr);
-           }
-           ia64_eoi();
-           vector = ia64_get_ivr();
-       }
-       /*
-        * This must be done *after* the ia64_eoi().  For example, the keyboard 
softirq
-        * handler needs to be able to wait for further keyboard interrupts, 
which can't
-        * come through until ia64_eoi() has been done.
-        */
-       vmx_irq_exit();
-       if (wake_dom0 && current->domain != dom0 ) 
-               vcpu_wake(dom0->vcpu[0]);
-}

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


 


Rackspace

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