> --- arch/powerpc/mm/mmu_context_nohash.c.orig 2009-03-24 08:12:14.000000000 +0900
> +++ arch/powerpc/mm/mmu_context_nohash.c 2009-05-21 16:35:09.000000000 +0900
> @@ -107,39 +107,69 @@ static unsigned int steal_context_smp(un
> */
> spin_unlock(&context_lock);
> cpu_relax();
> spin_lock(&context_lock);
> goto again;
> }
> #endif /* CONFIG_SMP */
>
> +/*
> + * We're flushed using the all context
> + */
> +static void flush_all_context(int cpu)
> +{
> + struct mm_struct *mm;
> + int n;
> +
> + for (n = first_context; n <= last_context; n++) {
> +
> + mm = context_mm[n];
> + if (mm == NULL || mm->context.id == MMU_NO_CONTEXT)
> + continue;
> +
> + WARN_ON(mm->context.active != 0);
> +
> + mm->context.id = MMU_NO_CONTEXT;
> + }
> + memset(stale_map[cpu], 0, CTX_MAP_SIZE);
> + memset(context_map, 0, CTX_MAP_SIZE);
> + context_map[0] = (1 << first_context) - 1;
> + nr_free_contexts = last_context - first_context + 1;
> +}
> +
> /* Note that this will also be called on SMP if all other CPUs are
> * offlined, which means that it may be called for cpu != 0. For
> * this to work, we somewhat assume that CPUs that are onlined
> * come up with a fully clean TLB (or are cleaned when offlined)
> */
> static unsigned int steal_context_up(unsigned int id)
> {
> struct mm_struct *mm;
> int cpu = smp_processor_id();
>
> /* Pick up the victim mm */
> mm = context_mm[id];
>
> pr_debug("[%d] steal context %d from mm @%p\n", cpu, id, mm);
>
> - /* Mark this mm has having no context anymore */
> - mm->context.id = MMU_NO_CONTEXT;
> -
> /* Flush the TLB for that context */
> local_flush_tlb_mm(mm);
>
> +#ifdef CONFIG_FSL_BOOKE
> + flush_all_context(cpu);
> + __set_bit(id, context_map);
> + nr_free_contexts--;
> +#else
> + /* Mark this mm has having no context anymore */
> + mm->context.id = MMU_NO_CONTEXT;
> +
> /* XXX This clear should ultimately be part of local_flush_tlb_mm */
> __clear_bit(id, stale_map[cpu]);
> +#endif
>
> return id;
> }
>
> #ifdef DEBUG_MAP_CONSISTENCY
> static void context_check_map(void)
> {
> unsigned int id, nrf, nact;
> --
> 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/