SW TLB MMU rework and SMP issues (pte read/write)
Kumar Gala
galak at kernel.crashing.org
Thu Jul 17 06:57:43 EST 2008
>> * 64-bit PTEs and reader vs writer hazards. How do we ensure that
>> the
>> TLB miss handler samples a consistent view of the pte. pte_updates
>> seem ok since we only update the flag word. However set_pte_at seems
>> like it could be problematic.
>
> eieio on the writer and a data dependency on the reader. segher
> suggested a nice way to do it on the reader side, by doing a subf of
> the
> value from the pointer and then a lwxz using that value as an offset.
>
> ie. something like that, with r3 containing the PTE pointer:
>
> lwz r10,4(r3)
> subf r4,r10,r3 <-- you can use r3,r10,r3 if clobber is safe
> lwzx r11,r10,r4 <-- in which case you use r3 here too
>
> That ensures that the top half is loaded after the bottom half, which
> is what you want if you do the set_pte_at() that way:
>
> stw r11,0(r3) <-- write top half first
> eieio <-- maitain order to coherency domain
> stw r10,4(r3) <-- write bottom half last
>
> In fact, in the reader case, while at it, you can interleave that with
> the testing of the present bit. Assuming _PAGE_PRESENT is in the low
> bits and you can clobber r3, you get something like:
>
> lwz r10,4(r3)
> <-- can't do much here unless you can do unrelated things -->
> andi. r0,r10,_PAGE_PRESENT
> subf r3,r10,r3
> beq page_fault
> lwzx r11,r10,r3
This makes sense. I think we need to order the stores in set_pte_at
regardless of CONFIG_SMP. Also, I think we should change pte_clear to
use pte_update() so we only clear the low-order flag bits. Patch will
be sent shortly for review.
- k
More information about the Linuxppc-dev
mailing list