ia64/xen-unstable

changeset 7382:bb22622a15fc

Merged.
author emellor@leeni.uk.xensource.com
date Thu Oct 13 17:51:35 2005 +0100 (2005-10-13)
parents cd6f7b548218 5a97ee0633e8
children 3fd239d8b640
files tools/python/xen/xend/server/event.py xen/Rules.mk
line diff
     1.1 --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/process.c	Thu Oct 13 17:49:56 2005 +0100
     1.2 +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/process.c	Thu Oct 13 17:51:35 2005 +0100
     1.3 @@ -112,44 +112,6 @@ void xen_idle(void)
     1.4  	}
     1.5  }
     1.6  
     1.7 -#ifdef CONFIG_HOTPLUG_CPU
     1.8 -#include <asm/nmi.h>
     1.9 -#ifdef CONFIG_SMP
    1.10 -extern void smp_suspend(void);
    1.11 -extern void smp_resume(void);
    1.12 -#endif
    1.13 -/* We don't actually take CPU down, just spin without interrupts. */
    1.14 -static inline void play_dead(void)
    1.15 -{
    1.16 -	/* Death loop */
    1.17 -	while (__get_cpu_var(cpu_state) != CPU_UP_PREPARE)
    1.18 -		HYPERVISOR_sched_op(SCHEDOP_yield, 0);
    1.19 -
    1.20 -	__flush_tlb_all();
    1.21 -   /* 
    1.22 -    * Restore IPI/IRQ mappings before marking online to prevent 
    1.23 -    * race between pending interrupts and restoration of handler. 
    1.24 -    */
    1.25 -#ifdef CONFIG_SMP
    1.26 -	local_irq_enable(); /* XXX Needed for smp_resume(). Clean me up. */
    1.27 -	smp_resume();
    1.28 -#endif
    1.29 -	cpu_set(smp_processor_id(), cpu_online_map);
    1.30 -}
    1.31 -#else
    1.32 -static inline void play_dead(void)
    1.33 -{
    1.34 -	BUG();
    1.35 -}
    1.36 -#endif /* CONFIG_HOTPLUG_CPU */
    1.37 -
    1.38 -void cpu_restore(void)
    1.39 -{
    1.40 -	play_dead();
    1.41 -	local_irq_enable();
    1.42 -	cpu_idle();
    1.43 -}
    1.44 -
    1.45  /*
    1.46   * The idle thread. There's no useful work to be
    1.47   * done, so just try to conserve power and have a
    1.48 @@ -158,7 +120,9 @@ void cpu_restore(void)
    1.49   */
    1.50  void cpu_idle (void)
    1.51  {
    1.52 +#if defined(CONFIG_HOTPLUG_CPU)
    1.53  	int cpu = _smp_processor_id();
    1.54 +#endif
    1.55  
    1.56  	/* endless idle loop with no priority at all */
    1.57  	while (1) {
    1.58 @@ -168,23 +132,12 @@ void cpu_idle (void)
    1.59  				__get_cpu_var(cpu_idle_state) = 0;
    1.60  			rmb();
    1.61  
    1.62 +#if defined(CONFIG_HOTPLUG_CPU)
    1.63  			if (cpu_is_offline(cpu)) {
    1.64 -				local_irq_disable();
    1.65 -#ifdef CONFIG_SMP
    1.66 -				smp_suspend();
    1.67 -#endif
    1.68 -#if defined(CONFIG_XEN) && defined(CONFIG_HOTPLUG_CPU)
    1.69 -				/* Ack it.  From this point on until
    1.70 -				   we get woken up, we're not allowed
    1.71 -				   to take any locks.  In particular,
    1.72 -				   don't printk. */
    1.73 -				__get_cpu_var(cpu_state) = CPU_DEAD;
    1.74 -				/* Tell hypervisor to take vcpu down. */
    1.75  				HYPERVISOR_vcpu_op(VCPUOP_down, cpu, NULL);
    1.76 -#endif
    1.77 -				play_dead();
    1.78  				local_irq_enable();
    1.79  			}
    1.80 +#endif
    1.81  
    1.82  			__get_cpu_var(irq_stat).idle_timestamp = jiffies;
    1.83  			xen_idle();
     2.1 --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/smpboot.c	Thu Oct 13 17:49:56 2005 +0100
     2.2 +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/smpboot.c	Thu Oct 13 17:51:35 2005 +0100
     2.3 @@ -66,6 +66,9 @@
     2.4  #include <asm-xen/xen-public/vcpu.h>
     2.5  #include <asm-xen/xenbus.h>
     2.6  
     2.7 +static void xen_smp_intr_init(unsigned int cpu);
     2.8 +static void xen_smp_intr_exit(unsigned int cpu);
     2.9 +
    2.10  /* Set if we find a B stepping CPU */
    2.11  static int __initdata smp_b_stepping;
    2.12  
    2.13 @@ -352,9 +355,9 @@ static atomic_t init_deasserted;
    2.14  static void __init smp_callin(void)
    2.15  {
    2.16  	int cpuid, phys_id;
    2.17 +#if 0
    2.18  	unsigned long timeout;
    2.19  
    2.20 -#if 0
    2.21  	/*
    2.22  	 * If waken up by an INIT in an 82489DX configuration
    2.23  	 * we may get here before an INIT-deassert IPI reaches
    2.24 @@ -376,6 +379,7 @@ static void __init smp_callin(void)
    2.25  	}
    2.26  	Dprintk("CPU#%d (phys ID: %d) waiting for CALLOUT\n", cpuid, phys_id);
    2.27  
    2.28 +#if 0
    2.29  	/*
    2.30  	 * STARTUP IPIs are fragile beasts as they might sometimes
    2.31  	 * trigger some glue motherboard logic. Complete APIC bus
    2.32 @@ -403,7 +407,6 @@ static void __init smp_callin(void)
    2.33  		BUG();
    2.34  	}
    2.35  
    2.36 -#if 0
    2.37  	/*
    2.38  	 * the boot CPU has finished the init stage and is spinning
    2.39  	 * on callin_map until we finish. We are free to set up this
    2.40 @@ -448,8 +451,6 @@ static void __init smp_callin(void)
    2.41  
    2.42  static int cpucount;
    2.43  
    2.44 -extern void local_setup_timer(void);
    2.45 -
    2.46  /*
    2.47   * Activate a secondary processor.
    2.48   */
    2.49 @@ -464,8 +465,6 @@ static void __init start_secondary(void 
    2.50  	smp_callin();
    2.51  	while (!cpu_isset(smp_processor_id(), smp_commenced_mask))
    2.52  		rep_nop();
    2.53 -	local_setup_timer();
    2.54 -	smp_intr_init();
    2.55  	local_irq_enable();
    2.56  	/*
    2.57  	 * low-memory mappings have been cleared, flush them from
    2.58 @@ -1133,7 +1132,7 @@ static void __init smp_boot_cpus(unsigne
    2.59  		return;
    2.60  	}
    2.61  
    2.62 -	smp_intr_init();
    2.63 +	xen_smp_intr_init(0);
    2.64  
    2.65  #if 0
    2.66  	connect_bsp_APIC();
    2.67 @@ -1340,29 +1339,6 @@ static int __init setup_vcpu_hotplug_eve
    2.68  
    2.69  subsys_initcall(setup_vcpu_hotplug_event);
    2.70  
    2.71 -/* must be called with the cpucontrol mutex held */
    2.72 -static int __devinit cpu_enable(unsigned int cpu)
    2.73 -{
    2.74 -#ifdef CONFIG_SMP_ALTERNATIVES
    2.75 -	if (num_online_cpus() == 1)
    2.76 -		prepare_for_smp();
    2.77 -#endif
    2.78 -
    2.79 -	/* get the target out of its holding state */
    2.80 -	per_cpu(cpu_state, cpu) = CPU_UP_PREPARE;
    2.81 -	wmb();
    2.82 -
    2.83 -	/* wait for the processor to ack it. timeout? */
    2.84 -	while (!cpu_online(cpu))
    2.85 -		cpu_relax();
    2.86 -
    2.87 -	fixup_irqs(cpu_online_map);
    2.88 -
    2.89 -	/* counter the disable in fixup_irqs() */
    2.90 -	local_irq_enable();
    2.91 -	return 0;
    2.92 -}
    2.93 -
    2.94  int __cpu_disable(void)
    2.95  {
    2.96  	cpumask_t map = cpu_online_map;
    2.97 @@ -1385,27 +1361,22 @@ int __cpu_disable(void)
    2.98  	/* It's now safe to remove this processor from the online map */
    2.99  	cpu_clear(cpu, cpu_online_map);
   2.100  
   2.101 -#ifdef CONFIG_SMP_ALTERNATIVES
   2.102 -	if (num_online_cpus() == 1)
   2.103 -		unprepare_for_smp();
   2.104 -#endif
   2.105 -
   2.106  	return 0;
   2.107  }
   2.108  
   2.109  void __cpu_die(unsigned int cpu)
   2.110  {
   2.111 -	/* We don't do anything here: idle task is faking death itself. */
   2.112 -	unsigned int i;
   2.113 -
   2.114 -	for (i = 0; i < 10; i++) {
   2.115 -		/* They ack this in play_dead by setting CPU_DEAD */
   2.116 -		if (per_cpu(cpu_state, cpu) == CPU_DEAD)
   2.117 -			return;
   2.118 +	while (HYPERVISOR_vcpu_op(VCPUOP_is_up, cpu, NULL)) {
   2.119  		current->state = TASK_UNINTERRUPTIBLE;
   2.120  		schedule_timeout(HZ/10);
   2.121  	}
   2.122 - 	printk(KERN_ERR "CPU %u didn't die...\n", cpu);
   2.123 +
   2.124 +	xen_smp_intr_exit(cpu);
   2.125 +
   2.126 +#ifdef CONFIG_SMP_ALTERNATIVES
   2.127 +	if (num_online_cpus() == 1)
   2.128 +		unprepare_for_smp();
   2.129 +#endif
   2.130  }
   2.131  
   2.132  #else /* ... !CONFIG_HOTPLUG_CPU */
   2.133 @@ -1430,23 +1401,16 @@ int __devinit __cpu_up(unsigned int cpu)
   2.134  		return -EIO;
   2.135  	}
   2.136  
   2.137 -#ifdef CONFIG_HOTPLUG_CPU
   2.138 -#ifdef CONFIG_XEN
   2.139 -	/* Tell hypervisor to bring vcpu up. */
   2.140 -	HYPERVISOR_vcpu_op(VCPUOP_up, cpu, NULL);
   2.141 -#endif
   2.142 -	/* Already up, and in cpu_quiescent now? */
   2.143 -	if (cpu_isset(cpu, smp_commenced_mask)) {
   2.144 -		cpu_enable(cpu);
   2.145 -		return 0;
   2.146 -	}
   2.147 +#ifdef CONFIG_SMP_ALTERNATIVES
   2.148 +	if (num_online_cpus() == 1)
   2.149 +		prepare_for_smp();
   2.150  #endif
   2.151  
   2.152 -	local_irq_enable();
   2.153 -	/* Unleash the CPU! */
   2.154 +	xen_smp_intr_init(cpu);
   2.155  	cpu_set(cpu, smp_commenced_mask);
   2.156 -	while (!cpu_isset(cpu, cpu_online_map))
   2.157 -		mb();
   2.158 +	cpu_set(cpu, cpu_online_map);
   2.159 +	HYPERVISOR_vcpu_op(VCPUOP_up, cpu, NULL);
   2.160 +
   2.161  	return 0;
   2.162  }
   2.163  
   2.164 @@ -1468,48 +1432,38 @@ void __init smp_cpus_done(unsigned int m
   2.165  extern irqreturn_t smp_reschedule_interrupt(int, void *, struct pt_regs *);
   2.166  extern irqreturn_t smp_call_function_interrupt(int, void *, struct pt_regs *);
   2.167  
   2.168 -void smp_intr_init(void)
   2.169 +extern void local_setup_timer(unsigned int cpu);
   2.170 +extern void local_teardown_timer(unsigned int cpu);
   2.171 +
   2.172 +static void xen_smp_intr_init(unsigned int cpu)
   2.173  {
   2.174 -	int cpu = smp_processor_id();
   2.175 -
   2.176  	per_cpu(resched_irq, cpu) =
   2.177 -		bind_ipi_to_irq(RESCHEDULE_VECTOR);
   2.178 +		bind_ipi_to_irq(RESCHEDULE_VECTOR, cpu);
   2.179  	sprintf(resched_name[cpu], "resched%d", cpu);
   2.180  	BUG_ON(request_irq(per_cpu(resched_irq, cpu), smp_reschedule_interrupt,
   2.181  	                   SA_INTERRUPT, resched_name[cpu], NULL));
   2.182  
   2.183  	per_cpu(callfunc_irq, cpu) =
   2.184 -		bind_ipi_to_irq(CALL_FUNCTION_VECTOR);
   2.185 +		bind_ipi_to_irq(CALL_FUNCTION_VECTOR, cpu);
   2.186  	sprintf(callfunc_name[cpu], "callfunc%d", cpu);
   2.187  	BUG_ON(request_irq(per_cpu(callfunc_irq, cpu),
   2.188  	                   smp_call_function_interrupt,
   2.189  	                   SA_INTERRUPT, callfunc_name[cpu], NULL));
   2.190 -}
   2.191  
   2.192 -static void smp_intr_exit(void)
   2.193 -{
   2.194 -	int cpu = smp_processor_id();
   2.195 -
   2.196 -	free_irq(per_cpu(resched_irq, cpu), NULL);
   2.197 -	unbind_ipi_from_irq(RESCHEDULE_VECTOR);
   2.198 -
   2.199 -	free_irq(per_cpu(callfunc_irq, cpu), NULL);
   2.200 -	unbind_ipi_from_irq(CALL_FUNCTION_VECTOR);
   2.201 +	if (cpu != 0)
   2.202 +		local_setup_timer(cpu);
   2.203  }
   2.204  
   2.205 -extern void local_setup_timer_irq(void);
   2.206 -extern void local_teardown_timer_irq(void);
   2.207 -
   2.208 -void smp_suspend(void)
   2.209 +static void xen_smp_intr_exit(unsigned int cpu)
   2.210  {
   2.211 -	local_teardown_timer_irq();
   2.212 -	smp_intr_exit();
   2.213 -}
   2.214 +	if (cpu != 0)
   2.215 +		local_teardown_timer(cpu);
   2.216  
   2.217 -void smp_resume(void)
   2.218 -{
   2.219 -	smp_intr_init();
   2.220 -	local_setup_timer();
   2.221 +	free_irq(per_cpu(resched_irq, cpu), NULL);
   2.222 +	unbind_ipi_from_irq(RESCHEDULE_VECTOR, cpu);
   2.223 +
   2.224 +	free_irq(per_cpu(callfunc_irq, cpu), NULL);
   2.225 +	unbind_ipi_from_irq(CALL_FUNCTION_VECTOR, cpu);
   2.226  }
   2.227  
   2.228  void vcpu_prepare(int vcpu)
   2.229 @@ -1517,7 +1471,6 @@ void vcpu_prepare(int vcpu)
   2.230  	extern void hypervisor_callback(void);
   2.231  	extern void failsafe_callback(void);
   2.232  	extern void smp_trap_init(trap_info_t *);
   2.233 -	extern void cpu_restore(void);
   2.234  	vcpu_guest_context_t ctxt;
   2.235  	struct task_struct *idle = idle_task(vcpu);
   2.236  
   2.237 @@ -1532,7 +1485,7 @@ void vcpu_prepare(int vcpu)
   2.238  	ctxt.user_regs.gs = 0;
   2.239  	ctxt.user_regs.ss = __KERNEL_DS;
   2.240  	ctxt.user_regs.cs = __KERNEL_CS;
   2.241 -	ctxt.user_regs.eip = (unsigned long)cpu_restore;
   2.242 +	ctxt.user_regs.eip = (unsigned long)cpu_idle;
   2.243  	ctxt.user_regs.esp = idle->thread.esp;
   2.244  	ctxt.user_regs.eflags = X86_EFLAGS_IF | X86_EFLAGS_IOPL_RING1;
   2.245  
   2.246 @@ -1556,7 +1509,6 @@ void vcpu_prepare(int vcpu)
   2.247  	ctxt.ctrlreg[3] = virt_to_mfn(swapper_pg_dir) << PAGE_SHIFT;
   2.248  
   2.249  	(void)HYPERVISOR_vcpu_op(VCPUOP_initialise, vcpu, &ctxt);
   2.250 -	(void)HYPERVISOR_vcpu_op(VCPUOP_up, vcpu, NULL);
   2.251  }
   2.252  
   2.253  /*
     3.1 --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/time.c	Thu Oct 13 17:49:56 2005 +0100
     3.2 +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/time.c	Thu Oct 13 17:51:35 2005 +0100
     3.3 @@ -785,7 +785,7 @@ void __init time_init(void)
     3.4  	rdtscll(vxtime.last_tsc);
     3.5  #endif
     3.6  
     3.7 -	per_cpu(timer_irq, 0) = bind_virq_to_irq(VIRQ_TIMER);
     3.8 +	per_cpu(timer_irq, 0) = bind_virq_to_irq(VIRQ_TIMER, 0);
     3.9  	(void)setup_irq(per_cpu(timer_irq, 0), &irq_timer);
    3.10  }
    3.11  
    3.12 @@ -852,21 +852,12 @@ void time_resume(void)
    3.13  
    3.14  #ifdef CONFIG_SMP
    3.15  static char timer_name[NR_CPUS][15];
    3.16 -void local_setup_timer_irq(void)
    3.17 -{
    3.18 -	int cpu = smp_processor_id();
    3.19  
    3.20 -	if (cpu == 0)
    3.21 -		return;
    3.22 -	per_cpu(timer_irq, cpu) = bind_virq_to_irq(VIRQ_TIMER);
    3.23 -	sprintf(timer_name[cpu], "timer%d", cpu);
    3.24 -	BUG_ON(request_irq(per_cpu(timer_irq, cpu), timer_interrupt,
    3.25 -	                   SA_INTERRUPT, timer_name[cpu], NULL));
    3.26 -}
    3.27 +void local_setup_timer(unsigned int cpu)
    3.28 +{
    3.29 +	int seq;
    3.30  
    3.31 -void local_setup_timer(void)
    3.32 -{
    3.33 -	int seq, cpu = smp_processor_id();
    3.34 +	BUG_ON(cpu == 0);
    3.35  
    3.36  	do {
    3.37  		seq = read_seqbegin(&xtime_lock);
    3.38 @@ -874,17 +865,17 @@ void local_setup_timer(void)
    3.39  			per_cpu(shadow_time, cpu).system_timestamp;
    3.40  	} while (read_seqretry(&xtime_lock, seq));
    3.41  
    3.42 -	local_setup_timer_irq();
    3.43 +	per_cpu(timer_irq, cpu) = bind_virq_to_irq(VIRQ_TIMER, cpu);
    3.44 +	sprintf(timer_name[cpu], "timer%d", cpu);
    3.45 +	BUG_ON(request_irq(per_cpu(timer_irq, cpu), timer_interrupt,
    3.46 +	                   SA_INTERRUPT, timer_name[cpu], NULL));
    3.47  }
    3.48  
    3.49 -void local_teardown_timer_irq(void)
    3.50 +void local_teardown_timer(unsigned int cpu)
    3.51  {
    3.52 -	int cpu = smp_processor_id();
    3.53 -
    3.54 -	if (cpu == 0)
    3.55 -		return;
    3.56 +	BUG_ON(cpu == 0);
    3.57  	free_irq(per_cpu(timer_irq, cpu), NULL);
    3.58 -	unbind_virq_from_irq(VIRQ_TIMER);
    3.59 +	unbind_virq_from_irq(VIRQ_TIMER, cpu);
    3.60  }
    3.61  #endif
    3.62  
     4.1 --- a/linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c	Thu Oct 13 17:49:56 2005 +0100
     4.2 +++ b/linux-2.6-xen-sparse/arch/xen/kernel/evtchn.c	Thu Oct 13 17:51:35 2005 +0100
     4.3 @@ -178,11 +178,10 @@ static int find_unbound_irq(void)
     4.4  	return irq;
     4.5  }
     4.6  
     4.7 -int bind_virq_to_irq(int virq)
     4.8 +int bind_virq_to_irq(int virq, int cpu)
     4.9  {
    4.10  	evtchn_op_t op = { .cmd = EVTCHNOP_bind_virq };
    4.11  	int evtchn, irq;
    4.12 -	int cpu = smp_processor_id();
    4.13  
    4.14  	spin_lock(&irq_mapping_update_lock);
    4.15  
    4.16 @@ -209,10 +208,9 @@ int bind_virq_to_irq(int virq)
    4.17  }
    4.18  EXPORT_SYMBOL(bind_virq_to_irq);
    4.19  
    4.20 -void unbind_virq_from_irq(int virq)
    4.21 +void unbind_virq_from_irq(int virq, int cpu)
    4.22  {
    4.23  	evtchn_op_t op = { .cmd = EVTCHNOP_close };
    4.24 -	int cpu    = smp_processor_id();
    4.25  	int irq    = per_cpu(virq_to_irq, cpu)[virq];
    4.26  	int evtchn = irq_to_evtchn[irq];
    4.27  
    4.28 @@ -240,11 +238,10 @@ void unbind_virq_from_irq(int virq)
    4.29  }
    4.30  EXPORT_SYMBOL(unbind_virq_from_irq);
    4.31  
    4.32 -int bind_ipi_to_irq(int ipi)
    4.33 +int bind_ipi_to_irq(int ipi, int cpu)
    4.34  {
    4.35  	evtchn_op_t op = { .cmd = EVTCHNOP_bind_ipi };
    4.36  	int evtchn, irq;
    4.37 -	int cpu = smp_processor_id();
    4.38  
    4.39  	spin_lock(&irq_mapping_update_lock);
    4.40  
    4.41 @@ -272,10 +269,9 @@ int bind_ipi_to_irq(int ipi)
    4.42  }
    4.43  EXPORT_SYMBOL(bind_ipi_to_irq);
    4.44  
    4.45 -void unbind_ipi_from_irq(int ipi)
    4.46 +void unbind_ipi_from_irq(int ipi, int cpu)
    4.47  {
    4.48  	evtchn_op_t op = { .cmd = EVTCHNOP_close };
    4.49 -	int cpu    = smp_processor_id();
    4.50  	int evtchn = per_cpu(ipi_to_evtchn, cpu)[ipi];
    4.51  	int irq    = evtchn_to_irq[evtchn];
    4.52  
     5.1 --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/smpboot.c	Thu Oct 13 17:49:56 2005 +0100
     5.2 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/smpboot.c	Thu Oct 13 17:51:35 2005 +0100
     5.3 @@ -1224,13 +1224,13 @@ void smp_intr_init(void)
     5.4  	int cpu = smp_processor_id();
     5.5  
     5.6  	per_cpu(resched_irq, cpu) =
     5.7 -		bind_ipi_to_irq(RESCHEDULE_VECTOR);
     5.8 +		bind_ipi_to_irq(RESCHEDULE_VECTOR, cpu);
     5.9  	sprintf(resched_name[cpu], "resched%d", cpu);
    5.10  	BUG_ON(request_irq(per_cpu(resched_irq, cpu), smp_reschedule_interrupt,
    5.11  	                   SA_INTERRUPT, resched_name[cpu], NULL));
    5.12  
    5.13  	per_cpu(callfunc_irq, cpu) =
    5.14 -		bind_ipi_to_irq(CALL_FUNCTION_VECTOR);
    5.15 +		bind_ipi_to_irq(CALL_FUNCTION_VECTOR, cpu);
    5.16  	sprintf(callfunc_name[cpu], "callfunc%d", cpu);
    5.17  	BUG_ON(request_irq(per_cpu(callfunc_irq, cpu),
    5.18  	                   smp_call_function_interrupt,
    5.19 @@ -1242,10 +1242,10 @@ static void smp_intr_exit(void)
    5.20  	int cpu = smp_processor_id();
    5.21  
    5.22  	free_irq(per_cpu(resched_irq, cpu), NULL);
    5.23 -	unbind_ipi_from_irq(RESCHEDULE_VECTOR);
    5.24 +	unbind_ipi_from_irq(RESCHEDULE_VECTOR, cpu);
    5.25  
    5.26  	free_irq(per_cpu(callfunc_irq, cpu), NULL);
    5.27 -	unbind_ipi_from_irq(CALL_FUNCTION_VECTOR);
    5.28 +	unbind_ipi_from_irq(CALL_FUNCTION_VECTOR, cpu);
    5.29  }
    5.30  
    5.31  extern void local_setup_timer_irq(void);
     6.1 --- a/linux-2.6-xen-sparse/drivers/xen/console/console.c	Thu Oct 13 17:49:56 2005 +0100
     6.2 +++ b/linux-2.6-xen-sparse/drivers/xen/console/console.c	Thu Oct 13 17:51:35 2005 +0100
     6.3 @@ -768,7 +768,7 @@ static int __init xencons_init(void)
     6.4  #endif
     6.5  
     6.6  	if (xen_start_info->flags & SIF_INITDOMAIN) {
     6.7 -		xencons_priv_irq = bind_virq_to_irq(VIRQ_CONSOLE);
     6.8 +		xencons_priv_irq = bind_virq_to_irq(VIRQ_CONSOLE, 0);
     6.9  		(void)request_irq(xencons_priv_irq,
    6.10  				  xencons_priv_interrupt, 0, "console", NULL);
    6.11  	} else {
     7.1 --- a/linux-2.6-xen-sparse/drivers/xen/netback/netback.c	Thu Oct 13 17:49:56 2005 +0100
     7.2 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/netback.c	Thu Oct 13 17:51:35 2005 +0100
     7.3 @@ -817,7 +817,7 @@ static int __init netback_init(void)
     7.4  
     7.5  	netif_xenbus_init();
     7.6  
     7.7 -	(void)request_irq(bind_virq_to_irq(VIRQ_DEBUG),
     7.8 +	(void)request_irq(bind_virq_to_irq(VIRQ_DEBUG, 0),
     7.9  			  netif_be_dbg, SA_SHIRQ, 
    7.10  			  "net-be-dbg", &netif_be_dbg);
    7.11  
     8.1 --- a/linux-2.6-xen-sparse/include/asm-xen/evtchn.h	Thu Oct 13 17:49:56 2005 +0100
     8.2 +++ b/linux-2.6-xen-sparse/include/asm-xen/evtchn.h	Thu Oct 13 17:51:35 2005 +0100
     8.3 @@ -44,12 +44,12 @@
     8.4   */
     8.5  
     8.6  /* Dynamically bind a VIRQ source to Linux IRQ space. */
     8.7 -extern int  bind_virq_to_irq(int virq);
     8.8 -extern void unbind_virq_from_irq(int virq);
     8.9 +extern int  bind_virq_to_irq(int virq, int cpu);
    8.10 +extern void unbind_virq_from_irq(int virq, int cpu);
    8.11  
    8.12  /* Dynamically bind an IPI source to Linux IRQ space. */
    8.13 -extern int  bind_ipi_to_irq(int ipi);
    8.14 -extern void unbind_ipi_from_irq(int ipi);
    8.15 +extern int  bind_ipi_to_irq(int ipi, int cpu);
    8.16 +extern void unbind_ipi_from_irq(int ipi, int cpu);
    8.17  
    8.18  /*
    8.19   * Dynamically bind an event-channel port to an IRQ-like callback handler.
     9.1 --- a/tools/python/xen/xend/server/event.py	Thu Oct 13 17:49:56 2005 +0100
     9.2 +++ b/tools/python/xen/xend/server/event.py	Thu Oct 13 17:51:35 2005 +0100
     9.3 @@ -185,11 +185,13 @@ class EventFactory(protocol.ServerFactor
     9.4          return EventProtocol(self.daemon)
     9.5  
     9.6  def listenEvent(daemon):
     9.7 -    factory = EventFactory(daemon)
     9.8 -    if xroot.get_xend_unix_server():
     9.9 -        path = '/var/lib/xend/event-socket'
    9.10 -        unix.listenUNIX(path, factory)
    9.11 -    if xroot.get_xend_http_server():
    9.12 -        port = xroot.get_xend_event_port()
    9.13 -        interface = xroot.get_xend_address()
    9.14 -        tcp.listenTCP(port, factory, interface=interface)
    9.15 +    pass
    9.16 +
    9.17 +#     factory = EventFactory(daemon)
    9.18 +#     if xroot.get_xend_unix_server():
    9.19 +#         path = '/var/lib/xend/event-socket'
    9.20 +#         unix.listenUNIX(path, factory)
    9.21 +#     if xroot.get_xend_http_server():
    9.22 +#         port = xroot.get_xend_event_port()
    9.23 +#         interface = xroot.get_xend_address()
    9.24 +#         tcp.listenTCP(port, factory, interface=interface)
    10.1 --- a/xen/Rules.mk	Thu Oct 13 17:49:56 2005 +0100
    10.2 +++ b/xen/Rules.mk	Thu Oct 13 17:51:35 2005 +0100
    10.3 @@ -3,7 +3,7 @@
    10.4  # 'make clean' before rebuilding.
    10.5  #
    10.6  verbose     ?= y
    10.7 -debug       ?= n
    10.8 +debug       ?= y
    10.9  perfc       ?= n
   10.10  perfc_arrays?= n
   10.11  trace       ?= n