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)
/*
* 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);
}
}
if (current->active_mm == mm) {
if(current->mm)
__flush_tlb_one(va);
- else
+ else
leave_mm(smp_processor_id());
}
irqreturn_t smp_reschedule_interrupt(int irq, void *dev_id,
struct pt_regs *regs)
{
-
return IRQ_HANDLED;
}