diff -NurpP linux-2.6.18-vs2.1.1-rc38/arch/cris/kernel/irq.c linux-2.6.18-vs2.1.1-rc38.3/arch/cris/kernel/irq.c --- linux-2.6.18-vs2.1.1-rc38/arch/cris/kernel/irq.c 2006-09-20 16:57:57 +0200 +++ linux-2.6.18-vs2.1.1-rc38.3/arch/cris/kernel/irq.c 2006-10-13 20:52:32 +0200 @@ -35,6 +35,7 @@ #include #include #include +#include #include @@ -92,13 +93,17 @@ skip: asmlinkage void do_IRQ(int irq, struct pt_regs * regs) { unsigned long sp; + struct vx_info_save vxis; + irq_enter(); sp = rdsp(); if (unlikely((sp & (PAGE_SIZE - 1)) < (PAGE_SIZE/8))) { printk("do_IRQ: stack overflow: %lX\n", sp); show_stack(NULL, (unsigned long *)sp); } + __enter_vx_admin(&vxis); __do_IRQ(irq, regs); + __leave_vx_admin(&vxis); irq_exit(); } diff -NurpP linux-2.6.18-vs2.1.1-rc38/arch/frv/kernel/irq.c linux-2.6.18-vs2.1.1-rc38.3/arch/frv/kernel/irq.c --- linux-2.6.18-vs2.1.1-rc38/arch/frv/kernel/irq.c 2006-09-20 16:57:57 +0200 +++ linux-2.6.18-vs2.1.1-rc38.3/arch/frv/kernel/irq.c 2006-10-13 20:52:40 +0200 @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -282,6 +283,7 @@ EXPORT_SYMBOL(enable_irq); asmlinkage void do_IRQ(void) { struct irq_source *source; + struct vx_info_save vxis; int level, cpu; irq_enter(); @@ -298,8 +300,10 @@ asmlinkage void do_IRQ(void) kstat_this_cpu.irqs[level]++; + __enter_vx_admin(&vxis); for (source = frv_irq_levels[level].sources; source; source = source->next) source->doirq(source); + __leave_vx_admin(&vxis); __clr_MASK(level); diff -NurpP linux-2.6.18-vs2.1.1-rc38/arch/i386/kernel/irq.c linux-2.6.18-vs2.1.1-rc38.3/arch/i386/kernel/irq.c --- linux-2.6.18-vs2.1.1-rc38/arch/i386/kernel/irq.c 2006-09-20 16:57:58 +0200 +++ linux-2.6.18-vs2.1.1-rc38.3/arch/i386/kernel/irq.c 2006-10-13 20:52:50 +0200 @@ -18,6 +18,7 @@ #include #include #include +#include DEFINE_PER_CPU(irq_cpustat_t, irq_stat) ____cacheline_internodealigned_in_smp; EXPORT_PER_CPU_SYMBOL(irq_stat); @@ -55,6 +56,7 @@ fastcall unsigned int do_IRQ(struct pt_r { /* high bit used in ret_from_ code */ int irq = ~regs->orig_eax; + struct vx_info_save vxis; #ifdef CONFIG_4KSTACKS union irq_ctx *curctx, *irqctx; u32 *isp; @@ -81,7 +83,7 @@ fastcall unsigned int do_IRQ(struct pt_r } } #endif - + __enter_vx_admin(&vxis); #ifdef CONFIG_4KSTACKS curctx = (union irq_ctx *) current_thread_info(); @@ -120,6 +122,7 @@ fastcall unsigned int do_IRQ(struct pt_r } else #endif __do_IRQ(irq, regs); + __leave_vx_admin(&vxis); irq_exit(); diff -NurpP linux-2.6.18-vs2.1.1-rc38/arch/m32r/kernel/irq.c linux-2.6.18-vs2.1.1-rc38.3/arch/m32r/kernel/irq.c --- linux-2.6.18-vs2.1.1-rc38/arch/m32r/kernel/irq.c 2006-09-20 16:57:58 +0200 +++ linux-2.6.18-vs2.1.1-rc38.3/arch/m32r/kernel/irq.c 2006-10-13 20:53:02 +0200 @@ -20,6 +20,7 @@ #include #include #include +#include #include atomic_t irq_err_count; @@ -77,12 +78,16 @@ skip: */ asmlinkage unsigned int do_IRQ(int irq, struct pt_regs *regs) { + struct vx_info_save vxis; + irq_enter(); #ifdef CONFIG_DEBUG_STACKOVERFLOW /* FIXME M32R */ #endif + __enter_vx_admin(&vxis); __do_IRQ(irq, regs); + __leave_vx_admin(&vxis); irq_exit(); return 1; diff -NurpP linux-2.6.18-vs2.1.1-rc38/arch/mips/kernel/irq.c linux-2.6.18-vs2.1.1-rc38.3/arch/mips/kernel/irq.c --- linux-2.6.18-vs2.1.1-rc38/arch/mips/kernel/irq.c 2006-09-20 16:57:58 +0200 +++ linux-2.6.18-vs2.1.1-rc38.3/arch/mips/kernel/irq.c 2006-10-13 20:53:09 +0200 @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -55,10 +56,14 @@ unsigned long irq_hwmask[NR_IRQS]; */ asmlinkage unsigned int do_IRQ(unsigned int irq, struct pt_regs *regs) { + struct vx_info_save vxis; + irq_enter(); + __enter_vx_admin(&vxis); __DO_IRQ_SMTC_HOOK(); __do_IRQ(irq, regs); + __leave_vx_admin(&vxis); irq_exit(); diff -NurpP linux-2.6.18-vs2.1.1-rc38/arch/powerpc/kernel/irq.c linux-2.6.18-vs2.1.1-rc38.3/arch/powerpc/kernel/irq.c --- linux-2.6.18-vs2.1.1-rc38/arch/powerpc/kernel/irq.c 2006-09-20 16:58:01 +0200 +++ linux-2.6.18-vs2.1.1-rc38.3/arch/powerpc/kernel/irq.c 2006-10-13 20:34:37 +0200 @@ -52,6 +52,7 @@ #include #include #include +#include #include #include @@ -218,6 +219,9 @@ void do_IRQ(struct pt_regs *regs) irq = ppc_md.get_irq(regs); if (irq != NO_IRQ && irq != NO_IRQ_IGNORE) { + struct vx_info_save vxis; + + __enter_vx_admin(&vxis); #ifdef CONFIG_IRQSTACKS /* Switch to the irq stack to handle this */ curtp = current_thread_info(); @@ -236,6 +240,7 @@ void do_IRQ(struct pt_regs *regs) } else #endif generic_handle_irq(irq, regs); + __leave_vx_admin(&vxis); } else if (irq != NO_IRQ_IGNORE) /* That's not SMP safe ... but who cares ? */ ppc_spurious_interrupts++; @@ -244,9 +249,13 @@ void do_IRQ(struct pt_regs *regs) #ifdef CONFIG_PPC_ISERIES if (get_lppaca()->int_dword.fields.decr_int) { + struct vx_info_save vxis; + get_lppaca()->int_dword.fields.decr_int = 0; /* Signal a fake decrementer interrupt */ + __enter_vx_admin(&vxis); timer_interrupt(regs); + __leave_vx_admin(&vxis); } #endif } diff -NurpP linux-2.6.18-vs2.1.1-rc38/arch/sh/kernel/irq.c linux-2.6.18-vs2.1.1-rc38.3/arch/sh/kernel/irq.c --- linux-2.6.18-vs2.1.1-rc38/arch/sh/kernel/irq.c 2006-09-20 16:58:01 +0200 +++ linux-2.6.18-vs2.1.1-rc38.3/arch/sh/kernel/irq.c 2006-10-13 20:53:27 +0200 @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -66,6 +67,7 @@ asmlinkage int do_IRQ(unsigned long r4, struct pt_regs regs) { int irq = r4; + struct vx_info_save vxis; irq_enter(); @@ -87,7 +89,9 @@ asmlinkage int do_IRQ(unsigned long r4, #endif irq = irq_demux(irq); + __enter_vx_admin(&vxis); __do_IRQ(irq, ®s); + __leave_vx_admin(&vxis); irq_exit(); return 1; } diff -NurpP linux-2.6.18-vs2.1.1-rc38/arch/sh64/kernel/irq.c linux-2.6.18-vs2.1.1-rc38.3/arch/sh64/kernel/irq.c --- linux-2.6.18-vs2.1.1-rc38/arch/sh64/kernel/irq.c 2006-09-20 16:58:01 +0200 +++ linux-2.6.18-vs2.1.1-rc38.3/arch/sh64/kernel/irq.c 2006-10-13 20:53:48 +0200 @@ -37,6 +37,7 @@ #include #include #include +#include void ack_bad_irq(unsigned int irq) { @@ -102,7 +103,11 @@ asmlinkage int do_IRQ(unsigned long vect irq = irq_demux(vector_num); if (irq >= 0) { + struct vx_info_save vxis; + + __enter_vx_admin(&vxis); __do_IRQ(irq, regs); + __leave_vx_admin(&vxis); } else { printk("unexpected IRQ trap at vector %03lx\n", vector_num); } diff -NurpP linux-2.6.18-vs2.1.1-rc38/arch/um/kernel/irq.c linux-2.6.18-vs2.1.1-rc38.3/arch/um/kernel/irq.c --- linux-2.6.18-vs2.1.1-rc38/arch/um/kernel/irq.c 2006-09-20 16:58:06 +0200 +++ linux-2.6.18-vs2.1.1-rc38.3/arch/um/kernel/irq.c 2006-10-13 20:54:08 +0200 @@ -19,6 +19,7 @@ #include "linux/seq_file.h" #include "linux/profile.h" #include "linux/hardirq.h" +#include "linux/vs_context.h" #include "asm/irq.h" #include "asm/hw_irq.h" #include "asm/atomic.h" @@ -370,10 +371,15 @@ void forward_interrupts(int pid) */ unsigned int do_IRQ(int irq, union uml_pt_regs *regs) { - irq_enter(); - __do_IRQ(irq, (struct pt_regs *)regs); - irq_exit(); - return 1; + struct vx_info_save vxis; + + irq_enter(); + + __enter_vx_admin(&vxis); + __do_IRQ(irq, (struct pt_regs *)regs); + __leave_vx_admin(&vxis); + irq_exit(); + return 1; } int um_request_irq(unsigned int irq, int fd, int type, diff -NurpP linux-2.6.18-vs2.1.1-rc38/arch/x86_64/kernel/irq.c linux-2.6.18-vs2.1.1-rc38.3/arch/x86_64/kernel/irq.c --- linux-2.6.18-vs2.1.1-rc38/arch/x86_64/kernel/irq.c 2006-09-20 16:58:06 +0200 +++ linux-2.6.18-vs2.1.1-rc38.3/arch/x86_64/kernel/irq.c 2006-10-13 20:54:24 +0200 @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -117,6 +118,7 @@ asmlinkage unsigned int do_IRQ(struct pt { /* high bit used in ret_from_ code */ unsigned irq = ~regs->orig_rax; + struct vx_info_save vxis; if (unlikely(irq >= NR_IRQS)) { printk(KERN_EMERG "%s: cannot handle IRQ %d\n", @@ -129,7 +131,9 @@ asmlinkage unsigned int do_IRQ(struct pt #ifdef CONFIG_DEBUG_STACKOVERFLOW stack_overflow_check(regs); #endif + __enter_vx_admin(&vxis); __do_IRQ(irq, regs); + __leave_vx_admin(&vxis); irq_exit(); return 1; diff -NurpP linux-2.6.18-vs2.1.1-rc38/arch/xtensa/kernel/irq.c linux-2.6.18-vs2.1.1-rc38.3/arch/xtensa/kernel/irq.c --- linux-2.6.18-vs2.1.1-rc38/arch/xtensa/kernel/irq.c 2006-09-20 16:58:06 +0200 +++ linux-2.6.18-vs2.1.1-rc38.3/arch/xtensa/kernel/irq.c 2006-10-13 20:54:36 +0200 @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -48,6 +49,8 @@ void ack_bad_irq(unsigned int irq) unsigned int do_IRQ(int irq, struct pt_regs *regs) { + struct vx_info_save vxis; + irq_enter(); #ifdef CONFIG_DEBUG_STACKOVERFLOW @@ -63,9 +66,9 @@ unsigned int do_IRQ(int irq, struct pt_ sp - sizeof(struct thread_info)); } #endif - + __enter_vx_admin(&vxis); __do_IRQ(irq, regs); - + __leave_vx_admin(&vxis); irq_exit(); return 1; diff -NurpP linux-2.6.18-vs2.1.1-rc38/drivers/s390/cio/cio.c linux-2.6.18-vs2.1.1-rc38.3/drivers/s390/cio/cio.c --- linux-2.6.18-vs2.1.1-rc38/drivers/s390/cio/cio.c 2006-09-20 16:58:27 +0200 +++ linux-2.6.18-vs2.1.1-rc38.3/drivers/s390/cio/cio.c 2006-10-13 20:54:50 +0200 @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -639,12 +640,16 @@ do_IRQ (struct pt_regs *regs) spin_lock(&sch->lock); /* Store interrupt response block to lowcore. */ if (tsch (tpi_info->schid, irb) == 0 && sch) { + struct vx_info_save vxis; + /* Keep subchannel information word up to date. */ memcpy (&sch->schib.scsw, &irb->scsw, sizeof (irb->scsw)); /* Call interrupt handler if there is one. */ + __enter_vx_admin(&vxis); if (sch->driver && sch->driver->irq) sch->driver->irq(&sch->dev); + __leave_vx_admin(&vxis); } if (sch) spin_unlock(&sch->lock); diff -NurpP linux-2.6.18-vs2.1.1-rc38/include/asm-mips/irq.h linux-2.6.18-vs2.1.1-rc38.3/include/asm-mips/irq.h --- linux-2.6.18-vs2.1.1-rc38/include/asm-mips/irq.h 2006-09-20 16:58:41 +0200 +++ linux-2.6.18-vs2.1.1-rc38.3/include/asm-mips/irq.h 2006-10-13 20:55:06 +0200 @@ -10,6 +10,7 @@ #define _ASM_IRQ_H #include +#include #include @@ -57,9 +58,13 @@ do { \ */ #define do_IRQ(irq, regs) \ do { \ + struct vx_info_save vxis; \ + \ irq_enter(); \ __DO_IRQ_SMTC_HOOK(); \ + __enter_vx_admin(&vxis); \ __do_IRQ((irq), (regs)); \ + __leave_vx_admin(&vxis); \ irq_exit(); \ } while (0)