Messages in this thread Patch in this message | | | Date | Sat, 10 Aug 2002 19:25:15 +0400 | From | Ivan Kokshaysky <> | Subject | [patch 2.5.30] alpha: IPI update [2/10] |
| |
- send_ipi_message() fix from Jeff Wiedemeier: The 2.5.30 IPI algorithm (with the to_whom == set test) incorrectly sends IPI messages to CPU 0 in a SMP system running with one processor. In this case to_whom is often 0 (cpu_present_mask & ~1UL << smp_processor_id()) which ends up triggering the to_whom == set case. - migration IPI removed;
Ivan.
--- 2.5.30/arch/alpha/kernel/smp.c Fri Aug 2 01:16:16 2002 +++ linux/arch/alpha/kernel/smp.c Thu Aug 8 19:45:19 2002 @@ -62,7 +63,6 @@ static struct { enum ipi_message_type { IPI_RESCHEDULE, - IPI_MIGRATION, IPI_CALL_FUNC, IPI_CPU_STOP, }; @@ -668,33 +658,21 @@ send_ipi_message(unsigned long to_whom, { unsigned long i, set, n; - set = to_whom & -to_whom; - if (to_whom == set) { + mb(); + for (i = to_whom; i ; i &= ~set) { + set = i & -i; n = __ffs(set); - mb(); set_bit(operation, &ipi_data[n].bits); - mb(); - wripir(n); - } else { - mb(); - for (i = to_whom; i ; i &= ~set) { - set = i & -i; - n = __ffs(set); - set_bit(operation, &ipi_data[n].bits); - } + } - mb(); - for (i = to_whom; i ; i &= ~set) { - set = i & -i; - n = __ffs(set); - wripir(n); - } + mb(); + for (i = to_whom; i ; i &= ~set) { + set = i & -i; + n = __ffs(set); + wripir(n); } } -/* Data for IPI_MIGRATION. */ -static task_t *migration_task; - /* Structure and data for smp_call_function. This is designed to minimize static memory requirements. Plus it looks cleaner. */ @@ -768,15 +746,6 @@ handle_ipi(struct pt_regs *regs) is done by the interrupt return path. */ break; - case IPI_MIGRATION: - { - task_t *t = migration_task; - mb(); - migration_task = 0; - sched_task_migrated(t); - break; - } - case IPI_CALL_FUNC: { struct smp_call_struct *data; @@ -835,19 +804,6 @@ smp_send_reschedule(int cpu) } void -smp_migrate_task(int cpu, task_t *t) -{ -#if DEBUG_IPI_MSG - if (cpu == hard_smp_processor_id()) - printk(KERN_WARNING - "smp_migrate_task: Sending IPI to self.\n"); -#endif - /* Acquire the migration_task mutex. */ - pointer_lock(&migration_task, t, 1); - send_ipi_message(1UL << cpu, IPI_MIGRATION); -} - -void smp_send_stop(void) { unsigned long to_whom = cpu_present_mask & ~(1UL << smp_processor_id()); - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |