[SPARC64] mm: don't re-evaluate *ptep
authorHugh Dickins <hugh@veritas.com>
Mon, 7 Nov 2005 22:08:46 +0000 (14:08 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 7 Nov 2005 22:08:46 +0000 (14:08 -0800)
sparc64 prom_callback and new_setup_frame32 each operates on a user page
table without holding lock, and no doubt they've good reason.  But I'd
feel more confident if they were to do a "pte = *ptep" and then operate
on pte, rather than re-evaluating *ptep.

Signed-off-by: Hugh Dickins <hugh@veritas.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc64/kernel/setup.c
arch/sparc64/kernel/signal32.c

index c1f34237cdf2f2cc1777c7e4842d3b3da6a3610e..bf1849dd9c49f5192301c9167a13a47490b0f07e 100644 (file)
@@ -154,6 +154,7 @@ int prom_callback(long *args)
                        pud_t *pudp;
                        pmd_t *pmdp;
                        pte_t *ptep;
+                       pte_t pte;
 
                        for_each_process(p) {
                                mm = p->mm;
@@ -178,8 +179,9 @@ int prom_callback(long *args)
                         * being called from inside OBP.
                         */
                        ptep = pte_offset_map(pmdp, va);
-                       if (pte_present(*ptep)) {
-                               tte = pte_val(*ptep);
+                       pte = *ptep;
+                       if (pte_present(pte)) {
+                               tte = pte_val(pte);
                                res = PROM_TRUE;
                        }
                        pte_unmap(ptep);
@@ -218,6 +220,7 @@ int prom_callback(long *args)
                        pud_t *pudp;
                        pmd_t *pmdp;
                        pte_t *ptep;
+                       pte_t pte;
                        int error;
 
                        if ((va >= LOW_OBP_ADDRESS) && (va < HI_OBP_ADDRESS)) {
@@ -240,8 +243,9 @@ int prom_callback(long *args)
                         * being called from inside OBP.
                         */
                        ptep = pte_offset_kernel(pmdp, va);
-                       if (pte_present(*ptep)) {
-                               tte = pte_val(*ptep);
+                       pte = *ptep;
+                       if (pte_present(pte)) {
+                               tte = pte_val(pte);
                                res = PROM_TRUE;
                        }
                        goto done;
index aecccd0df1d129a6981ae85d86ef87d11bf47638..009a86e5ded48702cecd4ed4e18b8d67ea8cab70 100644 (file)
@@ -863,6 +863,7 @@ static void new_setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,
                pud_t *pudp = pud_offset(pgdp, address);
                pmd_t *pmdp = pmd_offset(pudp, address);
                pte_t *ptep;
+               pte_t pte;
 
                regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2);
        
@@ -873,9 +874,10 @@ static void new_setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,
 
                preempt_disable();
                ptep = pte_offset_map(pmdp, address);
-               if (pte_present(*ptep)) {
+               pte = *ptep;
+               if (pte_present(pte)) {
                        unsigned long page = (unsigned long)
-                               page_address(pte_page(*ptep));
+                               page_address(pte_page(pte));
 
                        wmb();
                        __asm__ __volatile__("flush     %0 + %1"