Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b8ae4865 authored by Hugh Dickins's avatar Hugh Dickins Committed by David S. Miller
Browse files

[SPARC64] mm: don't re-evaluate *ptep



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: default avatarHugh Dickins <hugh@veritas.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5a820fa7
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -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;
+4 −2
Original line number Diff line number Diff line
@@ -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"