On Tue, Jun 14, 2011 at 10:07 PM, Timur Tabi <ti...@freescale.com> wrote:
> Timur Tabi wrote:
>> Hmmm.... I find that surprising.  Memory allocated via ioremap() is supposed 
>> to
>> be available in interrupt handlers, where TLB mappings can't be created
>> on-the-fly.  I'm not sure that your observation is correct.
>
> Ok, it turns out I'm wrong.  As long as the page is in the page tables (i.e.
> physically present in RAM), you can take a TLB miss in an interrupt handler, 
> and
> the TLB miss handler will create a TLB for you.
>
> This means that ...
>
>>                         unsigned long dummy = *(volatile unsigned long *)p;
>>                         (void)dummy;
>>                 }
>>
>> * After these changes (make sure all code is mapped + make sure to
>> read all pages so that the TLBs are updated), my scenario works fine.
>
> is not going to work reliably, because it assumes that the TLBs created by 
> your
> multiple ioremap() calls will still be there when your code is called.
>
> If you use just a single ioremap() call, but still touch every page, that 
> should
> work for you just as well.

I am using a single __ioremap call.
You have a point about the reliability of this: if an interrupt occurs
between the mapping or dummy reading, and the point where the actual
code is executing, some TLB entries may have been replaced, right?
I think I can make it more reliable by dummy reading the pages *after*
I disabled interrupts on that processor, immediately before jumping to
the boot code. Is that correct?
(note that I have to disable interrupts anyhow for the boot code to
work properly without interruptions to 'linux land'.

Thanks for your input,
Thomas
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to