X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fi386%2Fkernel%2Fsmp-xen.c;h=38166e2da6fc7f74e2496367b250bbecab7996d4;hb=refs%2Fheads%2Fvserver;hp=78e3784514817e6510e973623ffe828ae67fbaa0;hpb=1db395853d4f30d6120458bd279ede1f882a8525;p=linux-2.6.git diff --git a/arch/i386/kernel/smp-xen.c b/arch/i386/kernel/smp-xen.c index 78e378451..38166e2da 100644 --- a/arch/i386/kernel/smp-xen.c +++ b/arch/i386/kernel/smp-xen.c @@ -118,7 +118,17 @@ DEFINE_PER_CPU(struct tlb_state, cpu_tlbstate) ____cacheline_aligned = { &init_m static inline int __prepare_ICR (unsigned int shortcut, int vector) { - return APIC_DM_FIXED | shortcut | vector | APIC_DEST_LOGICAL; + unsigned int icr = shortcut | APIC_DEST_LOGICAL; + + switch (vector) { + default: + icr |= APIC_DM_FIXED | vector; + break; + case NMI_VECTOR: + icr |= APIC_DM_NMI; + break; + } + return icr; } static inline int __prepare_ICR2 (unsigned int mask) @@ -167,16 +177,17 @@ void fastcall send_IPI_self(int vector) /* * This is only used on smaller machines. */ -void send_IPI_mask_bitmask(cpumask_t mask, int vector) +void send_IPI_mask_bitmask(cpumask_t cpumask, int vector) { + unsigned long mask = cpus_addr(cpumask)[0]; unsigned long flags; unsigned int cpu; local_irq_save(flags); - WARN_ON(cpus_addr(mask)[0] & ~cpus_addr(cpu_online_map)[0]); + WARN_ON(mask & ~cpus_addr(cpu_online_map)[0]); for (cpu = 0; cpu < NR_CPUS; ++cpu) { - if (cpu_isset(cpu, mask)) { + if (cpu_isset(cpu, cpumask)) { __send_IPI_one(cpu, vector); } } @@ -409,7 +420,7 @@ void flush_tlb_page(struct vm_area_struct * vma, unsigned long va) if (current->active_mm == mm) { if(current->mm) __flush_tlb_one(va); - else + else leave_mm(smp_processor_id()); } @@ -582,7 +593,6 @@ void smp_send_stop(void) irqreturn_t smp_reschedule_interrupt(int irq, void *dev_id, struct pt_regs *regs) { - return IRQ_HANDLED; }