On Aug 27, 2008, at 6:43 PM, Scott Wood wrote:

Becky Bruce wrote:
#if _PAGE_HASHPTE != 0
+#ifndef CONFIG_PTE_64BIT
        pte_update(ptep, ~_PAGE_HASHPTE, pte_val(pte) & ~_PAGE_HASHPTE);
#else
+       /*
+        * We have to do the write of the 64b pte as 2 stores.  This
+        * code assumes that the entry we're storing to is currently
+        * not valid and that all callers have the page table lock.
+        * Having the entry be not valid protects readers who might read
+        * between the first and second stores.
+        */
+       unsigned int tmp;
+
+       __asm__ __volatile__("\
+1:     lwarx   %0,0,%4\n\
+       rlwimi  %L2,%0,0,30,30\n\
+       stw     %2,0(%3)\n\
+       eieio\n\
+       stwcx.  %L2,0,%4\n\
+       bne-    1b"
+       : "=&r" (tmp), "=m" (*ptep)
+ : "r" (pte), "r" (ptep), "r" ((unsigned long)(ptep) + 4), "m" (*ptep)
+       : "cc");
+#endif /* CONFIG_PTE_64BIT */

Could the stw to the same reservation granule as the stwcx cancel the reservation on some implementations? P

Not on the same processor.

lus, if you're assuming that the entry is currently invalid and all callers have the page table lock, do we need the lwarx/stwcx at all? At the least, it should check PTE_ATOMIC_UPDATES.

I'm pretty sure I went through this in great detail at one point and concluded that I did in fact need the lwarx/stwcx. IIRC, it has to do with other non-set_pte_at writers not necessarily holding the page table lock. FYI, the existing 32-bit PTE code is doing atomic updates as well.

About PTE_ATOMIC_UPDATES, I didn't add that in because hashed page table implementations require atomic updates. Adding it in would create another clause in that code, because I would still need to order the operations with a 64-bit PTE and I can't call pte_update as it only changes the low word of the pte. I wasn't feeling too keen on adding untested pagetable code into the kernel :) I can add it if the peanut gallery wants it, but I'll be marking it with a big fat "BUYER BEWARE".




%2 should be "+&r", not "r".

diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/ platforms/Kconfig.cputype
index 7f65127..ca5b58b 100644
--- a/arch/powerpc/platforms/Kconfig.cputype
+++ b/arch/powerpc/platforms/Kconfig.cputype
@@ -128,18 +128,22 @@ config FSL_EMB_PERFMON
 config PTE_64BIT
        bool
-       depends on 44x || E500
+       depends on 44x || E500 || 6xx
        default y if 44x
-       default y if E500 && PHYS_64BIT
+       default y if PHYS_64BIT

How is this different from PHYS_64BIT?

One is the width of the PTE and one is the width of a physical address. It's entirely plausible to have a 64-bit PTE because you have a bunch of status bits, and only have 32-bit physical addressing. That's why there are 2 options.



config PHYS_64BIT
-       bool 'Large physical address support' if E500
-       depends on 44x || E500
+       bool 'Large physical address support' if E500 || 6xx

Maybe "if !44x", or have 44x "select" this, rather than listing all arches where it's optional.

Not sure exactly what you're suggesting here........



+       depends on 44x || E500 || 6xx
        select RESOURCES_64BIT
        default y if 44x
        ---help---
          This option enables kernel support for larger than 32-bit physical
-         addresses.  This features is not be available on all e500 cores.
+         addresses.  This features is not be available on all cores.

"This features is not be"?

Heh, I didn't type that :)  But I can fix it.

Thanks,
B

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to