Module Name:    src
Committed By:   martin
Date:           Mon Feb 10 19:20:01 UTC 2020

Modified Files:
        src/sys/arch/arm/arm32 [netbsd-9]: pmap.c

Log Message:
Pull up following revision(s) (requested by skrll in ticket #691):

        sys/arch/arm/arm32/pmap.c: revision 1.383
        sys/arch/arm/arm32/pmap.c: revision 1.385
        sys/arch/arm/arm32/pmap.c: revision 1.386
        sys/arch/arm/arm32/pmap.c: revision 1.387
        sys/arch/arm/arm32/pmap.c: revision 1.374
        sys/arch/arm/arm32/pmap.c: revision 1.375
        sys/arch/arm/arm32/pmap.c: revision 1.376
        sys/arch/arm/arm32/pmap.c: revision 1.377
        sys/arch/arm/arm32/pmap.c: revision 1.378
        sys/arch/arm/arm32/pmap.c: revision 1.379

Convert a __CTASSERT into a KASSERT as L1_S_CACHE_MASK may not be a
compile time constant if ARM_NMMUS > 1

Improve a comment

Update PMAP_STEAL_MEMORY code to uvm_hotplug

Typo in comment

Fix a bug introduced in 1.271 where pmap_grow_map would no longer map
the allocated page for the uvm.page_init_done == false case when
PMAP_STEAL_MEMORY is not defined.

Trailing whitespace

Fix comment

Always pmap_kenter_pa the page in pmap_grow_map regardless of how we got
it.

Always call pmap_grow_map with a page aligned new VA.  KASSERT that this
happenes.

More KNF


To generate a diff of this commit:
cvs rdiff -u -r1.373 -r1.373.2.1 src/sys/arch/arm/arm32/pmap.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/arm32/pmap.c
diff -u src/sys/arch/arm/arm32/pmap.c:1.373 src/sys/arch/arm/arm32/pmap.c:1.373.2.1
--- src/sys/arch/arm/arm32/pmap.c:1.373	Tue Apr 23 11:21:21 2019
+++ src/sys/arch/arm/arm32/pmap.c	Mon Feb 10 19:20:01 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.c,v 1.373 2019/04/23 11:21:21 bouyer Exp $	*/
+/*	$NetBSD: pmap.c,v 1.373.2.1 2020/02/10 19:20:01 martin Exp $	*/
 
 /*
  * Copyright 2003 Wasabi Systems, Inc.
@@ -221,7 +221,7 @@
 #include <arm/db_machdep.h>
 #endif
 
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.373 2019/04/23 11:21:21 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.373.2.1 2020/02/10 19:20:01 martin Exp $");
 
 //#define PMAP_DEBUG
 #ifdef PMAP_DEBUG
@@ -547,7 +547,7 @@ pmap_acquire_pmap_lock(pmap_t pm)
 	if (__predict_false(db_onproc != NULL))
 		return;
 #endif
-	
+
 	mutex_enter(pm->pm_lock);
 }
 
@@ -614,7 +614,7 @@ struct l1_ttable {
 /*
  * L1 Page Tables are tracked using a Least Recently Used list.
  *  - New L1s are allocated from the HEAD.
- *  - Freed L1s are added to the TAIl.
+ *  - Freed L1s are added to the TAIL.
  *  - Recently accessed L1s (where an 'access' is some change to one of
  *    the userland pmaps which owns this L1) are moved to the TAIL.
  */
@@ -1096,7 +1096,7 @@ pmap_find_pv(struct vm_page_md *md, pmap
 			break;
 	}
 
-	return (pv);
+	return pv;
 }
 
 /*
@@ -1213,7 +1213,7 @@ pmap_modify_pv(struct vm_page_md *md, pa
 	KASSERT(!PV_IS_KENTRY_P(set_mask));
 
 	if ((npv = pmap_find_pv(md, pm, va)) == NULL)
-		return (0);
+		return 0;
 
 	NPDEBUG(PDB_PVDUMP,
 	    printf("pmap_modify_pv: pm %p, md %p, clr 0x%x, set 0x%x, flags 0x%x\n", pm, md, clr_mask, set_mask, npv->pv_flags));
@@ -1287,7 +1287,7 @@ pmap_modify_pv(struct vm_page_md *md, pa
 
 	PMAPCOUNT(remappings);
 
-	return (oflags);
+	return oflags;
 }
 
 /*
@@ -1495,9 +1495,9 @@ pmap_get_l2_bucket(pmap_t pm, vaddr_t va
 
 	if ((l2 = pm->pm_l2[L2_IDX(l1slot)]) == NULL ||
 	    (l2b = &l2->l2_bucket[L2_BUCKET(l1slot)])->l2b_kva == NULL)
-		return (NULL);
+		return NULL;
 
-	return (l2b);
+	return l2b;
 }
 
 /*
@@ -1525,7 +1525,7 @@ pmap_alloc_l2_bucket(pmap_t pm, vaddr_t 
 		 * Need to allocate a new l2_dtable.
 		 */
 		if ((l2 = pmap_alloc_l2_dtable()) == NULL)
-			return (NULL);
+			return NULL;
 
 		/*
 		 * Link it into the parent pmap
@@ -1555,7 +1555,7 @@ pmap_alloc_l2_bucket(pmap_t pm, vaddr_t 
 				pm->pm_l2[L2_IDX(l1slot)] = NULL;
 				pmap_free_l2_dtable(l2);
 			}
-			return (NULL);
+			return NULL;
 		}
 
 		l2->l2_occupancy++;
@@ -1576,7 +1576,7 @@ pmap_alloc_l2_bucket(pmap_t pm, vaddr_t 
 #endif
 	}
 
-	return (l2b);
+	return l2b;
 }
 
 /*
@@ -1712,7 +1712,7 @@ pmap_l2ptp_ctor(void *arg, void *v, int 
 
 	memset(v, 0, L2_TABLE_SIZE_REAL);
 	PTE_SYNC_RANGE(v, L2_TABLE_SIZE_REAL / sizeof(pt_entry_t));
-	return (0);
+	return 0;
 }
 
 static int
@@ -1720,7 +1720,7 @@ pmap_l2dtable_ctor(void *arg, void *v, i
 {
 
 	memset(v, 0, sizeof(struct l2_dtable));
-	return (0);
+	return 0;
 }
 
 static int
@@ -1728,7 +1728,7 @@ pmap_pmap_ctor(void *arg, void *v, int f
 {
 
 	memset(v, 0, sizeof(struct pmap));
-	return (0);
+	return 0;
 }
 
 static void
@@ -1807,7 +1807,7 @@ pmap_get_vac_flags(const struct vm_page_
 	if (md->urw_mappings)
 		uidx |= 2;
 
-	return (pmap_vac_flags[uidx][kidx]);
+	return pmap_vac_flags[uidx][kidx];
 }
 
 static inline void
@@ -3021,7 +3021,7 @@ pmap_create(void)
 
 	pmap_pinit(pm);
 
-	return (pm);
+	return pm;
 }
 
 u_int
@@ -3251,7 +3251,7 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
 					pmap_free_l2_bucket(pm, l2b, 0);
 					UVMHIST_LOG(maphist, "  <-- done (ENOMEM)",
 					    0, 0, 0, 0);
-					return (ENOMEM);
+					return ENOMEM;
 				}
 			}
 
@@ -3406,7 +3406,7 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_
 free_pv:
 	if (new_pv)
 		pool_put(&pmap_pv_pool, new_pv);
-	return (error);
+	return error;
 }
 
 /*
@@ -3633,8 +3633,8 @@ pmap_kremove_pg(struct vm_page *pg, vadd
 	KASSERT(PV_IS_KENTRY_P(pv->pv_flags));
 
 	/*
-	 * If we are removing a writeable mapping to a cached exec page,
-	 * if it's the last mapping then clear it execness other sync
+	 * We are removing a writeable mapping to a cached exec page, if
+	 * it's the last mapping then clear its execness otherwise sync
 	 * the page to the icache.
 	 */
 	if ((md->pvh_attrs & (PVF_NC|PVF_EXEC)) == PVF_EXEC
@@ -4756,7 +4756,7 @@ pmap_fault_fixup(pmap_t pm, vaddr_t va, 
 out:
 	pmap_release_pmap_lock(pm);
 
-	return (rv);
+	return rv;
 }
 
 /*
@@ -5772,6 +5772,8 @@ pmap_grow_map(vaddr_t va, paddr_t *pap)
 {
 	paddr_t pa;
 
+	KASSERT((va & PGOFSET) == 0);
+
 	if (uvm.page_init_done == false) {
 #ifdef PMAP_STEAL_MEMORY
 		pv_addr_t pv;
@@ -5786,13 +5788,13 @@ pmap_grow_map(vaddr_t va, paddr_t *pap)
 		pa = pv.pv_pa;
 #else
 		if (uvm_page_physget(&pa) == false)
-			return (1);
+			return 1;
 #endif	/* PMAP_STEAL_MEMORY */
 	} else {
 		struct vm_page *pg;
 		pg = uvm_pagealloc(NULL, 0, NULL, UVM_PGA_USERESERVE);
 		if (pg == NULL)
-			return (1);
+			return 1;
 		pa = VM_PAGE_TO_PHYS(pg);
 		/*
 		 * This new page must not have any mappings.  Enter it via
@@ -5800,10 +5802,11 @@ pmap_grow_map(vaddr_t va, paddr_t *pap)
 		 */
 		struct vm_page_md *md __diagused = VM_PAGE_TO_MD(pg);
 		KASSERT(SLIST_EMPTY(&md->pvh_list));
-		pmap_kenter_pa(va, pa,
-		    VM_PROT_READ|VM_PROT_WRITE, PMAP_KMPAGE|PMAP_PTE);
 	}
 
+	pmap_kenter_pa(va, pa,
+	    VM_PROT_READ|VM_PROT_WRITE, PMAP_KMPAGE|PMAP_PTE);
+
 	if (pap)
 		*pap = pa;
 
@@ -5817,7 +5820,7 @@ pmap_grow_map(vaddr_t va, paddr_t *pap)
 	KDASSERT((opte & L2_S_CACHE_MASK) == pte_l2_s_cache_mode_pt);
 #endif
 	memset((void *)va, 0, PAGE_SIZE);
-	return (0);
+	return 0;
 }
 
 /*
@@ -5846,7 +5849,7 @@ pmap_grow_l2_bucket(pmap_t pm, vaddr_t v
 			 * Need to allocate a backing page
 			 */
 			if (pmap_grow_map(nva, NULL))
-				return (NULL);
+				return NULL;
 		}
 
 		l2 = (struct l2_dtable *)nva;
@@ -5857,8 +5860,8 @@ pmap_grow_l2_bucket(pmap_t pm, vaddr_t v
 			 * The new l2_dtable straddles a page boundary.
 			 * Map in another page to cover it.
 			 */
-			if (pmap_grow_map(nva, NULL))
-				return (NULL);
+			if (pmap_grow_map(nva & ~PGOFSET, NULL))
+				return NULL;
 		}
 
 		pmap_kernel_l2dtable_kva = nva;
@@ -5888,7 +5891,7 @@ pmap_grow_l2_bucket(pmap_t pm, vaddr_t v
 			 * Need to allocate a backing page
 			 */
 			if (pmap_grow_map(nva, &pmap_kernel_l2ptp_phys))
-				return (NULL);
+				return NULL;
 			PTE_SYNC_RANGE(ptep, PAGE_SIZE / sizeof(pt_entry_t));
 		}
 
@@ -5901,7 +5904,7 @@ pmap_grow_l2_bucket(pmap_t pm, vaddr_t v
 		pmap_kernel_l2ptp_phys += L2_TABLE_SIZE_REAL;
 	}
 
-	return (l2b);
+	return l2b;
 }
 
 vaddr_t
@@ -5975,7 +5978,7 @@ pmap_growkernel(vaddr_t maxkvaddr)
 	splx(s);
 
 out:
-	return (pmap_curmaxkvaddr);
+	return pmap_curmaxkvaddr;
 }
 
 /************************ Utility routines ****************************/
@@ -6406,7 +6409,7 @@ pmap_set_pt_cache_mode(pd_entry_t *kl1, 
 		pd_entry_t pde = *pdep;
 
 		if (l1pte_section_p(pde)) {
-			__CTASSERT((L1_S_CACHE_MASK & L1_S_V6_SUPER) == 0);
+			KASSERT((L1_S_CACHE_MASK & L1_S_V6_SUPER) == 0);
 			if ((pde & L1_S_CACHE_MASK) != pte_l1_s_cache_mode_pt) {
 				*pdep = (pde & ~L1_S_CACHE_MASK) |
 				    pte_l1_s_cache_mode_pt;
@@ -6435,7 +6438,7 @@ pmap_set_pt_cache_mode(pd_entry_t *kl1, 
 		va += PAGE_SIZE;
 	}
 
-	return (rv);
+	return rv;
 #endif
 }
 
@@ -6498,12 +6501,12 @@ pmap_bootstrap_pv_page_alloc(struct pool
 	void *rv;
 
 	if (pmap_initialized)
-		return (pool_page_alloc(pp, flags));
+		return pool_page_alloc(pp, flags);
 
 	if (free_bootstrap_pages) {
 		rv = free_bootstrap_pages;
 		free_bootstrap_pages = *((void **)rv);
-		return (rv);
+		return rv;
 	}
 
 	KASSERT(kernel_map != NULL);
@@ -6512,7 +6515,7 @@ pmap_bootstrap_pv_page_alloc(struct pool
 
 	KASSERT(new_page > last_bootstrap_page);
 	last_bootstrap_page = new_page;
-	return ((void *)new_page);
+	return (void *)new_page;
 }
 
 static void
@@ -6626,9 +6629,9 @@ kernel_pt_lookup(paddr_t pa)
 
 	SLIST_FOREACH(pv, &kernel_pt_list, pv_list) {
 		if (pv->pv_pa == (pa & ~PGOFSET))
-			return (pv->pv_va | (pa & PGOFSET));
+			return pv->pv_va | (pa & PGOFSET);
 	}
-	return (0);
+	return 0;
 }
 
 /*
@@ -6874,7 +6877,7 @@ pmap_map_chunk(vaddr_t l1pt, vaddr_t va,
 		resid -= PAGE_SIZE;
 	}
 	VPRINTF("\n");
-	return (size);
+	return size;
 }
 
 /*
@@ -6948,7 +6951,7 @@ pmap_devmap_find_pa(paddr_t pa, psize_t 
 	int i;
 
 	if (pmap_devmap_table == NULL)
-		return (NULL);
+		return NULL;
 
 	endpa = (uint64_t)pa + (uint64_t)(size - 1);
 
@@ -6956,10 +6959,10 @@ pmap_devmap_find_pa(paddr_t pa, psize_t 
 		if (pa >= pmap_devmap_table[i].pd_pa &&
 		    endpa <= (uint64_t)pmap_devmap_table[i].pd_pa +
 			     (uint64_t)(pmap_devmap_table[i].pd_size - 1))
-			return (&pmap_devmap_table[i]);
+			return &pmap_devmap_table[i];
 	}
 
-	return (NULL);
+	return NULL;
 }
 
 const struct pmap_devmap *
@@ -6968,16 +6971,16 @@ pmap_devmap_find_va(vaddr_t va, vsize_t 
 	int i;
 
 	if (pmap_devmap_table == NULL)
-		return (NULL);
+		return NULL;
 
 	for (i = 0; pmap_devmap_table[i].pd_size != 0; i++) {
 		if (va >= pmap_devmap_table[i].pd_va &&
 		    va + size - 1 <= pmap_devmap_table[i].pd_va +
 				     pmap_devmap_table[i].pd_size - 1)
-			return (&pmap_devmap_table[i]);
+			return &pmap_devmap_table[i];
 	}
 
-	return (NULL);
+	return NULL;
 }
 
 /********************** PTE initialization routines **************************/
@@ -7789,8 +7792,6 @@ pmap_boot_pagealloc(psize_t amount, psiz
 	pv_addr_t *rpv)
 {
 	pv_addr_t *pv, **pvp;
-	struct vm_physseg *ps;
-	size_t i;
 
 	KASSERT(amount & PGOFSET);
 	KASSERT((mask & PGOFSET) == 0);
@@ -7803,7 +7804,7 @@ pmap_boot_pagealloc(psize_t amount, psiz
 		pv_addr_t *newpv;
 		psize_t off;
 		/*
-		 * If this entry is too small to satify the request...
+		 * If this entry is too small to satisfy the request...
 		 */
 		KASSERT(pv->pv_size > 0);
 		if (pv->pv_size < amount)
@@ -7848,7 +7849,7 @@ pmap_boot_pagealloc(psize_t amount, psiz
 		return;
 	}
 
-	if (vm_nphysseg == 0)
+	if (!uvm_physseg_valid_p(uvm_physseg_get_first()))
 		panic("pmap_boot_pagealloc: couldn't allocate memory");
 
 	for (pvp = &SLIST_FIRST(&pmap_boot_freeq);
@@ -7858,28 +7859,27 @@ pmap_boot_pagealloc(psize_t amount, psiz
 			break;
 	}
 	KASSERT(mask == 0);
-	for (i = 0; i < vm_nphysseg; i++) {
-		ps = VM_PHYSMEM_PTR(i);
-		if (ps->avail_start == atop(pv->pv_pa + pv->pv_size)
-		    && pv->pv_va + pv->pv_size <= ptoa(ps->avail_end)) {
+
+	for (uvm_physseg_t ups = uvm_physseg_get_first();
+	    uvm_physseg_valid_p(ups);
+	    ups = uvm_physseg_get_next(ups)) {
+
+		paddr_t spn = uvm_physseg_get_start(ups);
+		paddr_t epn = uvm_physseg_get_end(ups);
+		if (spn == atop(pv->pv_pa + pv->pv_size)
+		    && pv->pv_va + pv->pv_size <= ptoa(epn)) {
 			rpv->pv_va = pv->pv_va;
 			rpv->pv_pa = pv->pv_pa;
 			rpv->pv_size = amount;
 			*pvp = NULL;
 			pmap_map_chunk(kernel_l1pt.pv_va,
-			     ptoa(ps->avail_start) + (pv->pv_va - pv->pv_pa),
-			     ptoa(ps->avail_start),
+			     ptoa(spn) + (pv->pv_va - pv->pv_pa),
+			     ptoa(spn),
 			     amount - pv->pv_size,
 			     VM_PROT_READ|VM_PROT_WRITE,
 			     PTE_CACHE);
-			ps->avail_start += atop(amount - pv->pv_size);
-			/*
-			 * If we consumed the entire physseg, remove it.
-			 */
-			if (ps->avail_start == ps->avail_end) {
-				for (--vm_nphysseg; i < vm_nphysseg; i++)
-					VM_PHYSMEM_PTR_SWAP(i, i + 1);
-			}
+
+			uvm_physseg_unplug(spn, atop(amount - pv->pv_size));
 			memset((void *)rpv->pv_va, 0, rpv->pv_size);
 			return;
 		}

Reply via email to