Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/arm/arm32 Update PMAP_STEAL_MEMORY code to uvm_hotplug



details:   https://anonhg.NetBSD.org/src/rev/e62f645f3500
branches:  trunk
changeset: 848081:e62f645f3500
user:      skrll <skrll%NetBSD.org@localhost>
date:      Fri Jan 17 12:39:00 2020 +0000

description:
Update PMAP_STEAL_MEMORY code to uvm_hotplug

diffstat:

 sys/arch/arm/arm32/pmap.c |  35 ++++++++++++++++-------------------
 1 files changed, 16 insertions(+), 19 deletions(-)

diffs (78 lines):

diff -r 66e88f41d2f2 -r e62f645f3500 sys/arch/arm/arm32/pmap.c
--- a/sys/arch/arm/arm32/pmap.c Fri Jan 17 12:34:55 2020 +0000
+++ b/sys/arch/arm/arm32/pmap.c Fri Jan 17 12:39:00 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: pmap.c,v 1.375 2019/12/31 18:09:21 skrll Exp $ */
+/*     $NetBSD: pmap.c,v 1.376 2020/01/17 12:39:00 skrll Exp $ */
 
 /*
  * Copyright 2003 Wasabi Systems, Inc.
@@ -221,7 +221,7 @@
 #include <arm/db_machdep.h>
 #endif
 
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.375 2019/12/31 18:09:21 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.376 2020/01/17 12:39:00 skrll Exp $");
 
 //#define PMAP_DEBUG
 #ifdef PMAP_DEBUG
@@ -7789,8 +7789,6 @@
        pv_addr_t *rpv)
 {
        pv_addr_t *pv, **pvp;
-       struct vm_physseg *ps;
-       size_t i;
 
        KASSERT(amount & PGOFSET);
        KASSERT((mask & PGOFSET) == 0);
@@ -7848,7 +7846,7 @@
                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 +7856,27 @@
                        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;
                }



Home | Main Index | Thread Index | Old Index