1*63d1fd59SEnji Cooper /* $NetBSD: t_uvm_physseg_load.c,v 1.2 2016/12/22 08:15:20 cherry Exp $ */ 2*63d1fd59SEnji Cooper 3*63d1fd59SEnji Cooper /*- 4*63d1fd59SEnji Cooper * Copyright (c) 2015, 2016 The NetBSD Foundation, Inc. 5*63d1fd59SEnji Cooper * All rights reserved. 6*63d1fd59SEnji Cooper * 7*63d1fd59SEnji Cooper * This code is derived from software contributed to The NetBSD Foundation 8*63d1fd59SEnji Cooper * by Santhosh N. Raju <santhosh.raju@gmail.com> and 9*63d1fd59SEnji Cooper * by Cherry G. Mathew 10*63d1fd59SEnji Cooper * 11*63d1fd59SEnji Cooper * Redistribution and use in source and binary forms, with or without 12*63d1fd59SEnji Cooper * modification, are permitted provided that the following conditions 13*63d1fd59SEnji Cooper * are met: 14*63d1fd59SEnji Cooper * 1. Redistributions of source code must retain the above copyright 15*63d1fd59SEnji Cooper * notice, this list of conditions and the following disclaimer. 16*63d1fd59SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 17*63d1fd59SEnji Cooper * notice, this list of conditions and the following disclaimer in the 18*63d1fd59SEnji Cooper * documentation and/or other materials provided with the distribution. 19*63d1fd59SEnji Cooper * 20*63d1fd59SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21*63d1fd59SEnji Cooper * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22*63d1fd59SEnji Cooper * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23*63d1fd59SEnji Cooper * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24*63d1fd59SEnji Cooper * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25*63d1fd59SEnji Cooper * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26*63d1fd59SEnji Cooper * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27*63d1fd59SEnji Cooper * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28*63d1fd59SEnji Cooper * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29*63d1fd59SEnji Cooper * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30*63d1fd59SEnji Cooper * POSSIBILITY OF SUCH DAMAGE. 31*63d1fd59SEnji Cooper */ 32*63d1fd59SEnji Cooper 33*63d1fd59SEnji Cooper #include <sys/cdefs.h> 34*63d1fd59SEnji Cooper __RCSID("$NetBSD: t_uvm_physseg_load.c,v 1.2 2016/12/22 08:15:20 cherry Exp $"); 35*63d1fd59SEnji Cooper 36*63d1fd59SEnji Cooper /* 37*63d1fd59SEnji Cooper * If this line is commented out tests related touvm_physseg_get_pmseg() 38*63d1fd59SEnji Cooper * wont run. 39*63d1fd59SEnji Cooper * 40*63d1fd59SEnji Cooper * Have a look at machine/uvm_physseg.h for more details. 41*63d1fd59SEnji Cooper */ 42*63d1fd59SEnji Cooper #define __HAVE_PMAP_PHYSSEG 43*63d1fd59SEnji Cooper 44*63d1fd59SEnji Cooper /* 45*63d1fd59SEnji Cooper * This is a dummy struct used for testing purposes 46*63d1fd59SEnji Cooper * 47*63d1fd59SEnji Cooper * In reality this struct would exist in the MD part of the code residing in 48*63d1fd59SEnji Cooper * machines/vmparam.h 49*63d1fd59SEnji Cooper */ 50*63d1fd59SEnji Cooper 51*63d1fd59SEnji Cooper #ifdef __HAVE_PMAP_PHYSSEG 52*63d1fd59SEnji Cooper struct pmap_physseg { 53*63d1fd59SEnji Cooper int dummy_variable; /* Dummy variable use for testing */ 54*63d1fd59SEnji Cooper }; 55*63d1fd59SEnji Cooper #endif 56*63d1fd59SEnji Cooper 57*63d1fd59SEnji Cooper /* Testing API - assumes userland */ 58*63d1fd59SEnji Cooper /* Provide Kernel API equivalents */ 59*63d1fd59SEnji Cooper #include <assert.h> 60*63d1fd59SEnji Cooper #include <stdbool.h> 61*63d1fd59SEnji Cooper #include <string.h> /* memset(3) et. al */ 62*63d1fd59SEnji Cooper #include <stdio.h> /* printf(3) */ 63*63d1fd59SEnji Cooper #include <stdlib.h> /* malloc(3) */ 64*63d1fd59SEnji Cooper #include <stdarg.h> 65*63d1fd59SEnji Cooper #include <stddef.h> 66*63d1fd59SEnji Cooper #include <time.h> 67*63d1fd59SEnji Cooper 68*63d1fd59SEnji Cooper #define PRIxPADDR "lx" 69*63d1fd59SEnji Cooper #define PRIxPSIZE "lx" 70*63d1fd59SEnji Cooper #define PRIuPSIZE "lu" 71*63d1fd59SEnji Cooper #define PRIxVADDR "lx" 72*63d1fd59SEnji Cooper #define PRIxVSIZE "lx" 73*63d1fd59SEnji Cooper #define PRIuVSIZE "lu" 74*63d1fd59SEnji Cooper 75*63d1fd59SEnji Cooper #define UVM_HOTPLUG /* Enable hotplug with rbtree. */ 76*63d1fd59SEnji Cooper #define PMAP_STEAL_MEMORY 77*63d1fd59SEnji Cooper #define DEBUG /* Enable debug functionality. */ 78*63d1fd59SEnji Cooper 79*63d1fd59SEnji Cooper typedef unsigned long vaddr_t; 80*63d1fd59SEnji Cooper typedef unsigned long paddr_t; 81*63d1fd59SEnji Cooper typedef unsigned long psize_t; 82*63d1fd59SEnji Cooper typedef unsigned long vsize_t; 83*63d1fd59SEnji Cooper 84*63d1fd59SEnji Cooper #include <uvm/uvm_physseg.h> 85*63d1fd59SEnji Cooper #include <uvm/uvm_page.h> 86*63d1fd59SEnji Cooper 87*63d1fd59SEnji Cooper #ifndef DIAGNOSTIC 88*63d1fd59SEnji Cooper #define KASSERTMSG(e, msg, ...) /* NOTHING */ 89*63d1fd59SEnji Cooper #define KASSERT(e) /* NOTHING */ 90*63d1fd59SEnji Cooper #else 91*63d1fd59SEnji Cooper #define KASSERT(a) assert(a) 92*63d1fd59SEnji Cooper #define KASSERTMSG(exp, ...) printf(__VA_ARGS__); assert((exp)) 93*63d1fd59SEnji Cooper #endif 94*63d1fd59SEnji Cooper 95*63d1fd59SEnji Cooper #define VM_PHYSSEG_STRAT VM_PSTRAT_BSEARCH 96*63d1fd59SEnji Cooper 97*63d1fd59SEnji Cooper #define VM_NFREELIST 4 98*63d1fd59SEnji Cooper #define VM_FREELIST_DEFAULT 0 99*63d1fd59SEnji Cooper #define VM_FREELIST_FIRST16 3 100*63d1fd59SEnji Cooper #define VM_FREELIST_FIRST1G 2 101*63d1fd59SEnji Cooper #define VM_FREELIST_FIRST4G 1 102*63d1fd59SEnji Cooper 103*63d1fd59SEnji Cooper /* 104*63d1fd59SEnji Cooper * Used in tests when Array implementation is tested 105*63d1fd59SEnji Cooper */ 106*63d1fd59SEnji Cooper #if !defined(VM_PHYSSEG_MAX) 107*63d1fd59SEnji Cooper #define VM_PHYSSEG_MAX 32 108*63d1fd59SEnji Cooper #endif 109*63d1fd59SEnji Cooper 110*63d1fd59SEnji Cooper #define PAGE_SIZE 4096 111*63d1fd59SEnji Cooper #define PAGE_SHIFT 12 112*63d1fd59SEnji Cooper #define atop(x) (((paddr_t)(x)) >> PAGE_SHIFT) 113*63d1fd59SEnji Cooper 114*63d1fd59SEnji Cooper #define mutex_enter(l) 115*63d1fd59SEnji Cooper #define mutex_exit(l) 116*63d1fd59SEnji Cooper 117*63d1fd59SEnji Cooper #define _SYS_KMEM_H_ /* Disallow the real kmem API (see below) */ 118*63d1fd59SEnji Cooper /* free(p) XXX: pgs management need more thought */ 119*63d1fd59SEnji Cooper #define kmem_alloc(size, flags) malloc(size) 120*63d1fd59SEnji Cooper #define kmem_zalloc(size, flags) malloc(size) 121*63d1fd59SEnji Cooper #define kmem_free(p, size) free(p) 122*63d1fd59SEnji Cooper 123*63d1fd59SEnji Cooper psize_t physmem; 124*63d1fd59SEnji Cooper 125*63d1fd59SEnji Cooper struct uvmexp uvmexp; /* decl */ 126*63d1fd59SEnji Cooper 127*63d1fd59SEnji Cooper /* 128*63d1fd59SEnji Cooper * uvm structure borrowed from uvm.h 129*63d1fd59SEnji Cooper * 130*63d1fd59SEnji Cooper * Remember this is a dummy structure used within the ATF Tests and 131*63d1fd59SEnji Cooper * uses only necessary fields from the original uvm struct. 132*63d1fd59SEnji Cooper * See uvm/uvm.h for the full struct. 133*63d1fd59SEnji Cooper */ 134*63d1fd59SEnji Cooper 135*63d1fd59SEnji Cooper struct uvm { 136*63d1fd59SEnji Cooper /* vm_page related parameters */ 137*63d1fd59SEnji Cooper 138*63d1fd59SEnji Cooper bool page_init_done; /* TRUE if uvm_page_init() finished */ 139*63d1fd59SEnji Cooper } uvm; 140*63d1fd59SEnji Cooper 141*63d1fd59SEnji Cooper static void 142*63d1fd59SEnji Cooper panic(const char *fmt, ...) 143*63d1fd59SEnji Cooper { 144*63d1fd59SEnji Cooper va_list ap; 145*63d1fd59SEnji Cooper 146*63d1fd59SEnji Cooper va_start(ap, fmt); 147*63d1fd59SEnji Cooper vprintf(fmt, ap); 148*63d1fd59SEnji Cooper printf("\n"); 149*63d1fd59SEnji Cooper va_end(ap); 150*63d1fd59SEnji Cooper KASSERT(false); 151*63d1fd59SEnji Cooper 152*63d1fd59SEnji Cooper /*NOTREACHED*/ 153*63d1fd59SEnji Cooper } 154*63d1fd59SEnji Cooper 155*63d1fd59SEnji Cooper static void 156*63d1fd59SEnji Cooper uvm_pagefree(struct vm_page *pg) 157*63d1fd59SEnji Cooper { 158*63d1fd59SEnji Cooper return; 159*63d1fd59SEnji Cooper } 160*63d1fd59SEnji Cooper 161*63d1fd59SEnji Cooper #if defined(UVM_HOTPLUG) 162*63d1fd59SEnji Cooper static void 163*63d1fd59SEnji Cooper uvmpdpol_reinit(void) 164*63d1fd59SEnji Cooper { 165*63d1fd59SEnji Cooper return; 166*63d1fd59SEnji Cooper } 167*63d1fd59SEnji Cooper #endif /* UVM_HOTPLUG */ 168*63d1fd59SEnji Cooper 169*63d1fd59SEnji Cooper /* end - Provide Kernel API equivalents */ 170*63d1fd59SEnji Cooper 171*63d1fd59SEnji Cooper #include "uvm/uvm_physseg.c" 172*63d1fd59SEnji Cooper 173*63d1fd59SEnji Cooper #include <atf-c.h> 174*63d1fd59SEnji Cooper 175*63d1fd59SEnji Cooper #define ONE_MEGABYTE 1024 * 1024 176*63d1fd59SEnji Cooper 177*63d1fd59SEnji Cooper /* Sample Page Frame Numbers */ 178*63d1fd59SEnji Cooper #define VALID_START_PFN_1 atop(0) 179*63d1fd59SEnji Cooper #define VALID_END_PFN_1 atop(ONE_MEGABYTE) 180*63d1fd59SEnji Cooper #define VALID_AVAIL_START_PFN_1 atop(0) 181*63d1fd59SEnji Cooper #define VALID_AVAIL_END_PFN_1 atop(ONE_MEGABYTE) 182*63d1fd59SEnji Cooper 183*63d1fd59SEnji Cooper #define VALID_START_PFN_2 atop(ONE_MEGABYTE + 1) 184*63d1fd59SEnji Cooper #define VALID_END_PFN_2 atop(ONE_MEGABYTE * 2) 185*63d1fd59SEnji Cooper #define VALID_AVAIL_START_PFN_2 atop(ONE_MEGABYTE + 1) 186*63d1fd59SEnji Cooper #define VALID_AVAIL_END_PFN_2 atop(ONE_MEGABYTE * 2) 187*63d1fd59SEnji Cooper 188*63d1fd59SEnji Cooper #define VALID_START_PFN_3 atop((ONE_MEGABYTE * 2) + 1) 189*63d1fd59SEnji Cooper #define VALID_END_PFN_3 atop(ONE_MEGABYTE * 3) 190*63d1fd59SEnji Cooper #define VALID_AVAIL_START_PFN_3 atop((ONE_MEGABYTE * 2) + 1) 191*63d1fd59SEnji Cooper #define VALID_AVAIL_END_PFN_3 atop(ONE_MEGABYTE * 3) 192*63d1fd59SEnji Cooper 193*63d1fd59SEnji Cooper #define VALID_START_PFN_4 atop(ONE_MEGABYTE + 1) 194*63d1fd59SEnji Cooper #define VALID_END_PFN_4 atop(ONE_MEGABYTE * 128) 195*63d1fd59SEnji Cooper #define VALID_AVAIL_START_PFN_4 atop(ONE_MEGABYTE + 1) 196*63d1fd59SEnji Cooper #define VALID_AVAIL_END_PFN_4 atop(ONE_MEGABYTE * 128) 197*63d1fd59SEnji Cooper 198*63d1fd59SEnji Cooper #define VALID_START_PFN_5 atop(ONE_MEGABYTE + 1) 199*63d1fd59SEnji Cooper #define VALID_END_PFN_5 atop(ONE_MEGABYTE * 256) 200*63d1fd59SEnji Cooper #define VALID_AVAIL_START_PFN_5 atop(ONE_MEGABYTE + 1) 201*63d1fd59SEnji Cooper #define VALID_AVAIL_END_PFN_5 atop(ONE_MEGABYTE * 256) 202*63d1fd59SEnji Cooper 203*63d1fd59SEnji Cooper /* 204*63d1fd59SEnji Cooper * Total number of pages (of 4K size each) should be 256 for 1MB of memory. 205*63d1fd59SEnji Cooper */ 206*63d1fd59SEnji Cooper #define PAGE_COUNT_1M 256 207*63d1fd59SEnji Cooper 208*63d1fd59SEnji Cooper /* 209*63d1fd59SEnji Cooper * The number of Page Frames to allot per segment 210*63d1fd59SEnji Cooper */ 211*63d1fd59SEnji Cooper #define PF_STEP 8 212*63d1fd59SEnji Cooper 213*63d1fd59SEnji Cooper /* 214*63d1fd59SEnji Cooper * A debug fucntion to print the content of upm. 215*63d1fd59SEnji Cooper */ 216*63d1fd59SEnji Cooper static inline void 217*63d1fd59SEnji Cooper uvm_physseg_dump_seg(uvm_physseg_t upm) 218*63d1fd59SEnji Cooper { 219*63d1fd59SEnji Cooper #if defined(DEBUG) 220*63d1fd59SEnji Cooper printf("%s: seg->start == %ld\n", __func__, 221*63d1fd59SEnji Cooper uvm_physseg_get_start(upm)); 222*63d1fd59SEnji Cooper printf("%s: seg->end == %ld\n", __func__, 223*63d1fd59SEnji Cooper uvm_physseg_get_end(upm)); 224*63d1fd59SEnji Cooper printf("%s: seg->avail_start == %ld\n", __func__, 225*63d1fd59SEnji Cooper uvm_physseg_get_avail_start(upm)); 226*63d1fd59SEnji Cooper printf("%s: seg->avail_end == %ld\n", __func__, 227*63d1fd59SEnji Cooper uvm_physseg_get_avail_end(upm)); 228*63d1fd59SEnji Cooper 229*63d1fd59SEnji Cooper printf("====\n\n"); 230*63d1fd59SEnji Cooper #else 231*63d1fd59SEnji Cooper return; 232*63d1fd59SEnji Cooper #endif /* DEBUG */ 233*63d1fd59SEnji Cooper } 234*63d1fd59SEnji Cooper 235*63d1fd59SEnji Cooper /* 236*63d1fd59SEnji Cooper * Private accessor that gets the value of vm_physmem.nentries 237*63d1fd59SEnji Cooper */ 238*63d1fd59SEnji Cooper static int 239*63d1fd59SEnji Cooper uvm_physseg_get_entries(void) 240*63d1fd59SEnji Cooper { 241*63d1fd59SEnji Cooper #if defined(UVM_HOTPLUG) 242*63d1fd59SEnji Cooper return uvm_physseg_graph.nentries; 243*63d1fd59SEnji Cooper #else 244*63d1fd59SEnji Cooper return vm_nphysmem; 245*63d1fd59SEnji Cooper #endif /* UVM_HOTPLUG */ 246*63d1fd59SEnji Cooper } 247*63d1fd59SEnji Cooper 248*63d1fd59SEnji Cooper /* 249*63d1fd59SEnji Cooper * Note: This function replicates verbatim what happens in 250*63d1fd59SEnji Cooper * uvm_page.c:uvm_page_init(). 251*63d1fd59SEnji Cooper * 252*63d1fd59SEnji Cooper * Please track any changes that happen there. 253*63d1fd59SEnji Cooper */ 254*63d1fd59SEnji Cooper static void 255*63d1fd59SEnji Cooper uvm_page_init_fake(struct vm_page *pagearray, psize_t pagecount) 256*63d1fd59SEnji Cooper { 257*63d1fd59SEnji Cooper uvm_physseg_t bank; 258*63d1fd59SEnji Cooper size_t n; 259*63d1fd59SEnji Cooper 260*63d1fd59SEnji Cooper for (bank = uvm_physseg_get_first(), 261*63d1fd59SEnji Cooper uvm_physseg_seg_chomp_slab(bank, pagearray, pagecount); 262*63d1fd59SEnji Cooper uvm_physseg_valid_p(bank); 263*63d1fd59SEnji Cooper bank = uvm_physseg_get_next(bank)) { 264*63d1fd59SEnji Cooper 265*63d1fd59SEnji Cooper n = uvm_physseg_get_end(bank) - uvm_physseg_get_start(bank); 266*63d1fd59SEnji Cooper uvm_physseg_seg_alloc_from_slab(bank, n); 267*63d1fd59SEnji Cooper uvm_physseg_init_seg(bank, pagearray); 268*63d1fd59SEnji Cooper 269*63d1fd59SEnji Cooper /* set up page array pointers */ 270*63d1fd59SEnji Cooper pagearray += n; 271*63d1fd59SEnji Cooper pagecount -= n; 272*63d1fd59SEnji Cooper } 273*63d1fd59SEnji Cooper 274*63d1fd59SEnji Cooper uvm.page_init_done = true; 275*63d1fd59SEnji Cooper } 276*63d1fd59SEnji Cooper 277*63d1fd59SEnji Cooper /* 278*63d1fd59SEnji Cooper * PHYS_TO_VM_PAGE: find vm_page for a PA. used by MI code to get vm_pages 279*63d1fd59SEnji Cooper * back from an I/O mapping (ugh!). used in some MD code as well. 280*63d1fd59SEnji Cooper */ 281*63d1fd59SEnji Cooper static struct vm_page * 282*63d1fd59SEnji Cooper uvm_phys_to_vm_page(paddr_t pa) 283*63d1fd59SEnji Cooper { 284*63d1fd59SEnji Cooper paddr_t pf = atop(pa); 285*63d1fd59SEnji Cooper paddr_t off; 286*63d1fd59SEnji Cooper uvm_physseg_t psi; 287*63d1fd59SEnji Cooper 288*63d1fd59SEnji Cooper psi = uvm_physseg_find(pf, &off); 289*63d1fd59SEnji Cooper if (psi != UVM_PHYSSEG_TYPE_INVALID) 290*63d1fd59SEnji Cooper return uvm_physseg_get_pg(psi, off); 291*63d1fd59SEnji Cooper return(NULL); 292*63d1fd59SEnji Cooper } 293*63d1fd59SEnji Cooper 294*63d1fd59SEnji Cooper //static paddr_t 295*63d1fd59SEnji Cooper //uvm_vm_page_to_phys(const struct vm_page *pg) 296*63d1fd59SEnji Cooper //{ 297*63d1fd59SEnji Cooper // 298*63d1fd59SEnji Cooper // return pg->phys_addr; 299*63d1fd59SEnji Cooper //} 300*63d1fd59SEnji Cooper 301*63d1fd59SEnji Cooper /* 302*63d1fd59SEnji Cooper * XXX: To do, write control test cases for uvm_vm_page_to_phys(). 303*63d1fd59SEnji Cooper */ 304*63d1fd59SEnji Cooper 305*63d1fd59SEnji Cooper /* #define VM_PAGE_TO_PHYS(entry) uvm_vm_page_to_phys(entry) */ 306*63d1fd59SEnji Cooper 307*63d1fd59SEnji Cooper #define PHYS_TO_VM_PAGE(pa) uvm_phys_to_vm_page(pa) 308*63d1fd59SEnji Cooper 309*63d1fd59SEnji Cooper /* 310*63d1fd59SEnji Cooper * Test Fixture SetUp(). 311*63d1fd59SEnji Cooper */ 312*63d1fd59SEnji Cooper static void 313*63d1fd59SEnji Cooper setup(void) 314*63d1fd59SEnji Cooper { 315*63d1fd59SEnji Cooper /* Prerequisites for running certain calls in uvm_physseg */ 316*63d1fd59SEnji Cooper uvmexp.pagesize = PAGE_SIZE; 317*63d1fd59SEnji Cooper uvmexp.npages = 0; 318*63d1fd59SEnji Cooper uvm.page_init_done = false; 319*63d1fd59SEnji Cooper uvm_physseg_init(); 320*63d1fd59SEnji Cooper } 321*63d1fd59SEnji Cooper 322*63d1fd59SEnji Cooper ATF_TC(uvm_physseg_100); 323*63d1fd59SEnji Cooper ATF_TC_HEAD(uvm_physseg_100, tc) 324*63d1fd59SEnji Cooper { 325*63d1fd59SEnji Cooper atf_tc_set_md_var(tc, "descr", "Load test uvm_phys_to_vm_page() with \ 326*63d1fd59SEnji Cooper 100 calls, VM_PHYSSEG_MAX is 32."); 327*63d1fd59SEnji Cooper } 328*63d1fd59SEnji Cooper ATF_TC_BODY(uvm_physseg_100, tc) 329*63d1fd59SEnji Cooper { 330*63d1fd59SEnji Cooper paddr_t pa; 331*63d1fd59SEnji Cooper 332*63d1fd59SEnji Cooper setup(); 333*63d1fd59SEnji Cooper 334*63d1fd59SEnji Cooper for(paddr_t i = VALID_START_PFN_1; 335*63d1fd59SEnji Cooper i < VALID_END_PFN_1; i += PF_STEP) { 336*63d1fd59SEnji Cooper uvm_page_physload(i, i + PF_STEP, i, i + PF_STEP, 337*63d1fd59SEnji Cooper VM_FREELIST_DEFAULT); 338*63d1fd59SEnji Cooper } 339*63d1fd59SEnji Cooper 340*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(VM_PHYSSEG_MAX, uvm_physseg_get_entries()); 341*63d1fd59SEnji Cooper 342*63d1fd59SEnji Cooper srandom((unsigned)time(NULL)); 343*63d1fd59SEnji Cooper for(int i = 0; i < 100; i++) { 344*63d1fd59SEnji Cooper pa = (paddr_t) random() % (paddr_t) ctob(VALID_END_PFN_1); 345*63d1fd59SEnji Cooper PHYS_TO_VM_PAGE(pa); 346*63d1fd59SEnji Cooper } 347*63d1fd59SEnji Cooper 348*63d1fd59SEnji Cooper ATF_CHECK_EQ(true, true); 349*63d1fd59SEnji Cooper } 350*63d1fd59SEnji Cooper 351*63d1fd59SEnji Cooper ATF_TC(uvm_physseg_1K); 352*63d1fd59SEnji Cooper ATF_TC_HEAD(uvm_physseg_1K, tc) 353*63d1fd59SEnji Cooper { 354*63d1fd59SEnji Cooper atf_tc_set_md_var(tc, "descr", "Load test uvm_phys_to_vm_page() with \ 355*63d1fd59SEnji Cooper 1000 calls, VM_PHYSSEG_MAX is 32."); 356*63d1fd59SEnji Cooper } 357*63d1fd59SEnji Cooper ATF_TC_BODY(uvm_physseg_1K, tc) 358*63d1fd59SEnji Cooper { 359*63d1fd59SEnji Cooper paddr_t pa; 360*63d1fd59SEnji Cooper 361*63d1fd59SEnji Cooper setup(); 362*63d1fd59SEnji Cooper 363*63d1fd59SEnji Cooper for(paddr_t i = VALID_START_PFN_1; 364*63d1fd59SEnji Cooper i < VALID_END_PFN_1; i += PF_STEP) { 365*63d1fd59SEnji Cooper uvm_page_physload(i, i + PF_STEP, i, i + PF_STEP, 366*63d1fd59SEnji Cooper VM_FREELIST_DEFAULT); 367*63d1fd59SEnji Cooper } 368*63d1fd59SEnji Cooper 369*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(VM_PHYSSEG_MAX, uvm_physseg_get_entries()); 370*63d1fd59SEnji Cooper 371*63d1fd59SEnji Cooper srandom((unsigned)time(NULL)); 372*63d1fd59SEnji Cooper for(int i = 0; i < 1000; i++) { 373*63d1fd59SEnji Cooper pa = (paddr_t) random() % (paddr_t) ctob(VALID_END_PFN_1); 374*63d1fd59SEnji Cooper PHYS_TO_VM_PAGE(pa); 375*63d1fd59SEnji Cooper } 376*63d1fd59SEnji Cooper 377*63d1fd59SEnji Cooper ATF_CHECK_EQ(true, true); 378*63d1fd59SEnji Cooper } 379*63d1fd59SEnji Cooper 380*63d1fd59SEnji Cooper ATF_TC(uvm_physseg_10K); 381*63d1fd59SEnji Cooper ATF_TC_HEAD(uvm_physseg_10K, tc) 382*63d1fd59SEnji Cooper { 383*63d1fd59SEnji Cooper atf_tc_set_md_var(tc, "descr", "Load test uvm_phys_to_vm_page() with \ 384*63d1fd59SEnji Cooper 10,000 calls, VM_PHYSSEG_MAX is 32."); 385*63d1fd59SEnji Cooper } 386*63d1fd59SEnji Cooper ATF_TC_BODY(uvm_physseg_10K, tc) 387*63d1fd59SEnji Cooper { 388*63d1fd59SEnji Cooper paddr_t pa; 389*63d1fd59SEnji Cooper 390*63d1fd59SEnji Cooper setup(); 391*63d1fd59SEnji Cooper 392*63d1fd59SEnji Cooper for(paddr_t i = VALID_START_PFN_1; 393*63d1fd59SEnji Cooper i < VALID_END_PFN_1; i += PF_STEP) { 394*63d1fd59SEnji Cooper uvm_page_physload(i, i + PF_STEP, i, i + PF_STEP, 395*63d1fd59SEnji Cooper VM_FREELIST_DEFAULT); 396*63d1fd59SEnji Cooper } 397*63d1fd59SEnji Cooper 398*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(VM_PHYSSEG_MAX, uvm_physseg_get_entries()); 399*63d1fd59SEnji Cooper 400*63d1fd59SEnji Cooper srandom((unsigned)time(NULL)); 401*63d1fd59SEnji Cooper for(int i = 0; i < 10000; i++) { 402*63d1fd59SEnji Cooper pa = (paddr_t) random() % (paddr_t) ctob(VALID_END_PFN_1); 403*63d1fd59SEnji Cooper PHYS_TO_VM_PAGE(pa); 404*63d1fd59SEnji Cooper } 405*63d1fd59SEnji Cooper 406*63d1fd59SEnji Cooper ATF_CHECK_EQ(true, true); 407*63d1fd59SEnji Cooper } 408*63d1fd59SEnji Cooper 409*63d1fd59SEnji Cooper ATF_TC(uvm_physseg_100K); 410*63d1fd59SEnji Cooper ATF_TC_HEAD(uvm_physseg_100K, tc) 411*63d1fd59SEnji Cooper { 412*63d1fd59SEnji Cooper atf_tc_set_md_var(tc, "descr", "Load test uvm_phys_to_vm_page() with \ 413*63d1fd59SEnji Cooper 100,000 calls, VM_PHYSSEG_MAX is 32."); 414*63d1fd59SEnji Cooper } 415*63d1fd59SEnji Cooper ATF_TC_BODY(uvm_physseg_100K, tc) 416*63d1fd59SEnji Cooper { 417*63d1fd59SEnji Cooper paddr_t pa; 418*63d1fd59SEnji Cooper 419*63d1fd59SEnji Cooper setup(); 420*63d1fd59SEnji Cooper 421*63d1fd59SEnji Cooper for(paddr_t i = VALID_START_PFN_1; 422*63d1fd59SEnji Cooper i < VALID_END_PFN_1; i += PF_STEP) { 423*63d1fd59SEnji Cooper uvm_page_physload(i, i + PF_STEP, i, i + PF_STEP, 424*63d1fd59SEnji Cooper VM_FREELIST_DEFAULT); 425*63d1fd59SEnji Cooper } 426*63d1fd59SEnji Cooper 427*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(VM_PHYSSEG_MAX, uvm_physseg_get_entries()); 428*63d1fd59SEnji Cooper 429*63d1fd59SEnji Cooper srandom((unsigned)time(NULL)); 430*63d1fd59SEnji Cooper for(int i = 0; i < 100000; i++) { 431*63d1fd59SEnji Cooper pa = (paddr_t) random() % (paddr_t) ctob(VALID_END_PFN_1); 432*63d1fd59SEnji Cooper PHYS_TO_VM_PAGE(pa); 433*63d1fd59SEnji Cooper } 434*63d1fd59SEnji Cooper 435*63d1fd59SEnji Cooper ATF_CHECK_EQ(true, true); 436*63d1fd59SEnji Cooper } 437*63d1fd59SEnji Cooper 438*63d1fd59SEnji Cooper ATF_TC(uvm_physseg_1M); 439*63d1fd59SEnji Cooper ATF_TC_HEAD(uvm_physseg_1M, tc) 440*63d1fd59SEnji Cooper { 441*63d1fd59SEnji Cooper atf_tc_set_md_var(tc, "descr", "Load test uvm_phys_to_vm_page() with \ 442*63d1fd59SEnji Cooper 1,000,000 calls, VM_PHYSSEG_MAX is 32."); 443*63d1fd59SEnji Cooper } 444*63d1fd59SEnji Cooper ATF_TC_BODY(uvm_physseg_1M, tc) 445*63d1fd59SEnji Cooper { 446*63d1fd59SEnji Cooper paddr_t pa; 447*63d1fd59SEnji Cooper 448*63d1fd59SEnji Cooper setup(); 449*63d1fd59SEnji Cooper 450*63d1fd59SEnji Cooper for(paddr_t i = VALID_START_PFN_1; 451*63d1fd59SEnji Cooper i < VALID_END_PFN_1; i += PF_STEP) { 452*63d1fd59SEnji Cooper uvm_page_physload(i, i + PF_STEP, i, i + PF_STEP, 453*63d1fd59SEnji Cooper VM_FREELIST_DEFAULT); 454*63d1fd59SEnji Cooper } 455*63d1fd59SEnji Cooper 456*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(VM_PHYSSEG_MAX, uvm_physseg_get_entries()); 457*63d1fd59SEnji Cooper 458*63d1fd59SEnji Cooper srandom((unsigned)time(NULL)); 459*63d1fd59SEnji Cooper for(int i = 0; i < 1000000; i++) { 460*63d1fd59SEnji Cooper pa = (paddr_t) random() % (paddr_t) ctob(VALID_END_PFN_1); 461*63d1fd59SEnji Cooper PHYS_TO_VM_PAGE(pa); 462*63d1fd59SEnji Cooper } 463*63d1fd59SEnji Cooper 464*63d1fd59SEnji Cooper ATF_CHECK_EQ(true, true); 465*63d1fd59SEnji Cooper } 466*63d1fd59SEnji Cooper 467*63d1fd59SEnji Cooper ATF_TC(uvm_physseg_10M); 468*63d1fd59SEnji Cooper ATF_TC_HEAD(uvm_physseg_10M, tc) 469*63d1fd59SEnji Cooper { 470*63d1fd59SEnji Cooper atf_tc_set_md_var(tc, "descr", "Load test uvm_phys_to_vm_page() with \ 471*63d1fd59SEnji Cooper 10,000,000 calls, VM_PHYSSEG_MAX is 32."); 472*63d1fd59SEnji Cooper } 473*63d1fd59SEnji Cooper ATF_TC_BODY(uvm_physseg_10M, tc) 474*63d1fd59SEnji Cooper { 475*63d1fd59SEnji Cooper paddr_t pa; 476*63d1fd59SEnji Cooper 477*63d1fd59SEnji Cooper setup(); 478*63d1fd59SEnji Cooper 479*63d1fd59SEnji Cooper for(paddr_t i = VALID_START_PFN_1; 480*63d1fd59SEnji Cooper i < VALID_END_PFN_1; i += PF_STEP) { 481*63d1fd59SEnji Cooper uvm_page_physload(i, i + PF_STEP, i, i + PF_STEP, 482*63d1fd59SEnji Cooper VM_FREELIST_DEFAULT); 483*63d1fd59SEnji Cooper } 484*63d1fd59SEnji Cooper 485*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(VM_PHYSSEG_MAX, uvm_physseg_get_entries()); 486*63d1fd59SEnji Cooper 487*63d1fd59SEnji Cooper srandom((unsigned)time(NULL)); 488*63d1fd59SEnji Cooper for(int i = 0; i < 10000000; i++) { 489*63d1fd59SEnji Cooper pa = (paddr_t) random() % (paddr_t) ctob(VALID_END_PFN_1); 490*63d1fd59SEnji Cooper PHYS_TO_VM_PAGE(pa); 491*63d1fd59SEnji Cooper } 492*63d1fd59SEnji Cooper 493*63d1fd59SEnji Cooper ATF_CHECK_EQ(true, true); 494*63d1fd59SEnji Cooper } 495*63d1fd59SEnji Cooper 496*63d1fd59SEnji Cooper ATF_TC(uvm_physseg_100M); 497*63d1fd59SEnji Cooper ATF_TC_HEAD(uvm_physseg_100M, tc) 498*63d1fd59SEnji Cooper { 499*63d1fd59SEnji Cooper atf_tc_set_md_var(tc, "descr", "Load test uvm_phys_to_vm_page() with \ 500*63d1fd59SEnji Cooper 100,000,000 calls, VM_PHYSSEG_MAX is 32."); 501*63d1fd59SEnji Cooper } 502*63d1fd59SEnji Cooper ATF_TC_BODY(uvm_physseg_100M, tc) 503*63d1fd59SEnji Cooper { 504*63d1fd59SEnji Cooper paddr_t pa; 505*63d1fd59SEnji Cooper 506*63d1fd59SEnji Cooper setup(); 507*63d1fd59SEnji Cooper 508*63d1fd59SEnji Cooper for(paddr_t i = VALID_START_PFN_1; 509*63d1fd59SEnji Cooper i < VALID_END_PFN_1; i += PF_STEP) { 510*63d1fd59SEnji Cooper uvm_page_physload(i, i + PF_STEP, i, i + PF_STEP, 511*63d1fd59SEnji Cooper VM_FREELIST_DEFAULT); 512*63d1fd59SEnji Cooper } 513*63d1fd59SEnji Cooper 514*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(VM_PHYSSEG_MAX, uvm_physseg_get_entries()); 515*63d1fd59SEnji Cooper 516*63d1fd59SEnji Cooper srandom((unsigned)time(NULL)); 517*63d1fd59SEnji Cooper for(int i = 0; i < 100000000; i++) { 518*63d1fd59SEnji Cooper pa = (paddr_t) random() % (paddr_t) ctob(VALID_END_PFN_1); 519*63d1fd59SEnji Cooper PHYS_TO_VM_PAGE(pa); 520*63d1fd59SEnji Cooper } 521*63d1fd59SEnji Cooper 522*63d1fd59SEnji Cooper ATF_CHECK_EQ(true, true); 523*63d1fd59SEnji Cooper } 524*63d1fd59SEnji Cooper 525*63d1fd59SEnji Cooper ATF_TC(uvm_physseg_1MB); 526*63d1fd59SEnji Cooper ATF_TC_HEAD(uvm_physseg_1MB, tc) 527*63d1fd59SEnji Cooper { 528*63d1fd59SEnji Cooper atf_tc_set_md_var(tc, "descr", "Load test uvm_phys_to_vm_page() with \ 529*63d1fd59SEnji Cooper 10,000,000 calls, VM_PHYSSEG_MAX is 32 on 1 MB Segment."); 530*63d1fd59SEnji Cooper } 531*63d1fd59SEnji Cooper ATF_TC_BODY(uvm_physseg_1MB, t) 532*63d1fd59SEnji Cooper { 533*63d1fd59SEnji Cooper paddr_t pa = 0; 534*63d1fd59SEnji Cooper 535*63d1fd59SEnji Cooper paddr_t pf = 0; 536*63d1fd59SEnji Cooper 537*63d1fd59SEnji Cooper psize_t pf_chunk_size = 0; 538*63d1fd59SEnji Cooper 539*63d1fd59SEnji Cooper psize_t npages1 = (VALID_END_PFN_1 - VALID_START_PFN_1); 540*63d1fd59SEnji Cooper 541*63d1fd59SEnji Cooper psize_t npages2 = (VALID_END_PFN_2 - VALID_START_PFN_2); 542*63d1fd59SEnji Cooper 543*63d1fd59SEnji Cooper struct vm_page *slab = malloc(sizeof(struct vm_page) * 544*63d1fd59SEnji Cooper (npages1 + npages2)); 545*63d1fd59SEnji Cooper 546*63d1fd59SEnji Cooper setup(); 547*63d1fd59SEnji Cooper 548*63d1fd59SEnji Cooper /* We start with zero segments */ 549*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(true, uvm_physseg_plug(VALID_START_PFN_1, npages1, NULL)); 550*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(1, uvm_physseg_get_entries()); 551*63d1fd59SEnji Cooper 552*63d1fd59SEnji Cooper /* Post boot: Fake all segments and pages accounted for. */ 553*63d1fd59SEnji Cooper uvm_page_init_fake(slab, npages1 + npages2); 554*63d1fd59SEnji Cooper 555*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(true, uvm_physseg_plug(VALID_START_PFN_2, npages2, NULL)); 556*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(2, uvm_physseg_get_entries()); 557*63d1fd59SEnji Cooper 558*63d1fd59SEnji Cooper srandom((unsigned)time(NULL)); 559*63d1fd59SEnji Cooper for(pf = VALID_START_PFN_2; pf < VALID_END_PFN_2; pf += PF_STEP) { 560*63d1fd59SEnji Cooper pf_chunk_size = (psize_t) random() % (psize_t) (PF_STEP - 1) + 1; 561*63d1fd59SEnji Cooper uvm_physseg_unplug(pf, pf_chunk_size); 562*63d1fd59SEnji Cooper } 563*63d1fd59SEnji Cooper 564*63d1fd59SEnji Cooper for(int i = 0; i < 10000000; i++) { 565*63d1fd59SEnji Cooper pa = (paddr_t) random() % (paddr_t) ctob(VALID_END_PFN_2); 566*63d1fd59SEnji Cooper if(pa < ctob(VALID_START_PFN_2)) 567*63d1fd59SEnji Cooper pa += ctob(VALID_START_PFN_2); 568*63d1fd59SEnji Cooper PHYS_TO_VM_PAGE(pa); 569*63d1fd59SEnji Cooper } 570*63d1fd59SEnji Cooper 571*63d1fd59SEnji Cooper ATF_CHECK_EQ(true, true); 572*63d1fd59SEnji Cooper } 573*63d1fd59SEnji Cooper 574*63d1fd59SEnji Cooper ATF_TC(uvm_physseg_64MB); 575*63d1fd59SEnji Cooper ATF_TC_HEAD(uvm_physseg_64MB, tc) 576*63d1fd59SEnji Cooper { 577*63d1fd59SEnji Cooper atf_tc_set_md_var(tc, "descr", "Load test uvm_phys_to_vm_page() with \ 578*63d1fd59SEnji Cooper 10,000,000 calls, VM_PHYSSEG_MAX is 32 on 64 MB Segment."); 579*63d1fd59SEnji Cooper } 580*63d1fd59SEnji Cooper ATF_TC_BODY(uvm_physseg_64MB, t) 581*63d1fd59SEnji Cooper { 582*63d1fd59SEnji Cooper paddr_t pa = 0; 583*63d1fd59SEnji Cooper 584*63d1fd59SEnji Cooper paddr_t pf = 0; 585*63d1fd59SEnji Cooper 586*63d1fd59SEnji Cooper psize_t pf_chunk_size = 0; 587*63d1fd59SEnji Cooper 588*63d1fd59SEnji Cooper psize_t npages1 = (VALID_END_PFN_1 - VALID_START_PFN_1); 589*63d1fd59SEnji Cooper 590*63d1fd59SEnji Cooper psize_t npages2 = (VALID_END_PFN_3 - VALID_START_PFN_3); 591*63d1fd59SEnji Cooper 592*63d1fd59SEnji Cooper struct vm_page *slab = malloc(sizeof(struct vm_page) * 593*63d1fd59SEnji Cooper (npages1 + npages2)); 594*63d1fd59SEnji Cooper 595*63d1fd59SEnji Cooper setup(); 596*63d1fd59SEnji Cooper 597*63d1fd59SEnji Cooper /* We start with zero segments */ 598*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(true, uvm_physseg_plug(VALID_START_PFN_1, npages1, NULL)); 599*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(1, uvm_physseg_get_entries()); 600*63d1fd59SEnji Cooper 601*63d1fd59SEnji Cooper /* Post boot: Fake all segments and pages accounted for. */ 602*63d1fd59SEnji Cooper uvm_page_init_fake(slab, npages1 + npages2); 603*63d1fd59SEnji Cooper 604*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(true, uvm_physseg_plug(VALID_START_PFN_3, npages2, NULL)); 605*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(2, uvm_physseg_get_entries()); 606*63d1fd59SEnji Cooper 607*63d1fd59SEnji Cooper srandom((unsigned)time(NULL)); 608*63d1fd59SEnji Cooper for(pf = VALID_START_PFN_3; pf < VALID_END_PFN_3; pf += PF_STEP) { 609*63d1fd59SEnji Cooper pf_chunk_size = (psize_t) random() % (psize_t) (PF_STEP - 1) + 1; 610*63d1fd59SEnji Cooper uvm_physseg_unplug(pf, pf_chunk_size); 611*63d1fd59SEnji Cooper } 612*63d1fd59SEnji Cooper 613*63d1fd59SEnji Cooper for(int i = 0; i < 10000000; i++) { 614*63d1fd59SEnji Cooper pa = (paddr_t) random() % (paddr_t) ctob(VALID_END_PFN_3); 615*63d1fd59SEnji Cooper if(pa < ctob(VALID_START_PFN_3)) 616*63d1fd59SEnji Cooper pa += ctob(VALID_START_PFN_3); 617*63d1fd59SEnji Cooper PHYS_TO_VM_PAGE(pa); 618*63d1fd59SEnji Cooper } 619*63d1fd59SEnji Cooper 620*63d1fd59SEnji Cooper ATF_CHECK_EQ(true, true); 621*63d1fd59SEnji Cooper } 622*63d1fd59SEnji Cooper 623*63d1fd59SEnji Cooper ATF_TC(uvm_physseg_128MB); 624*63d1fd59SEnji Cooper ATF_TC_HEAD(uvm_physseg_128MB, tc) 625*63d1fd59SEnji Cooper { 626*63d1fd59SEnji Cooper atf_tc_set_md_var(tc, "descr", "Load test uvm_phys_to_vm_page() with \ 627*63d1fd59SEnji Cooper 10,000,000 calls, VM_PHYSSEG_MAX is 32 on 128 MB Segment."); 628*63d1fd59SEnji Cooper } 629*63d1fd59SEnji Cooper ATF_TC_BODY(uvm_physseg_128MB, t) 630*63d1fd59SEnji Cooper { 631*63d1fd59SEnji Cooper paddr_t pa = 0; 632*63d1fd59SEnji Cooper 633*63d1fd59SEnji Cooper paddr_t pf = 0; 634*63d1fd59SEnji Cooper 635*63d1fd59SEnji Cooper psize_t pf_chunk_size = 0; 636*63d1fd59SEnji Cooper 637*63d1fd59SEnji Cooper psize_t npages1 = (VALID_END_PFN_1 - VALID_START_PFN_1); 638*63d1fd59SEnji Cooper 639*63d1fd59SEnji Cooper psize_t npages2 = (VALID_END_PFN_4 - VALID_START_PFN_4); 640*63d1fd59SEnji Cooper 641*63d1fd59SEnji Cooper struct vm_page *slab = malloc(sizeof(struct vm_page) 642*63d1fd59SEnji Cooper * (npages1 + npages2)); 643*63d1fd59SEnji Cooper 644*63d1fd59SEnji Cooper setup(); 645*63d1fd59SEnji Cooper 646*63d1fd59SEnji Cooper /* We start with zero segments */ 647*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(true, uvm_physseg_plug(VALID_START_PFN_1, npages1, NULL)); 648*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(1, uvm_physseg_get_entries()); 649*63d1fd59SEnji Cooper 650*63d1fd59SEnji Cooper /* Post boot: Fake all segments and pages accounted for. */ 651*63d1fd59SEnji Cooper uvm_page_init_fake(slab, npages1 + npages2); 652*63d1fd59SEnji Cooper 653*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(true, uvm_physseg_plug(VALID_START_PFN_2, npages2, NULL)); 654*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(2, uvm_physseg_get_entries()); 655*63d1fd59SEnji Cooper 656*63d1fd59SEnji Cooper srandom((unsigned)time(NULL)); 657*63d1fd59SEnji Cooper for(pf = VALID_START_PFN_4; pf < VALID_END_PFN_4; pf += PF_STEP) { 658*63d1fd59SEnji Cooper pf_chunk_size = (psize_t) random() % (psize_t) (PF_STEP - 1) + 1; 659*63d1fd59SEnji Cooper uvm_physseg_unplug(pf, pf_chunk_size); 660*63d1fd59SEnji Cooper } 661*63d1fd59SEnji Cooper 662*63d1fd59SEnji Cooper for(int i = 0; i < 10000000; i++) { 663*63d1fd59SEnji Cooper pa = (paddr_t) random() % (paddr_t) ctob(VALID_END_PFN_4); 664*63d1fd59SEnji Cooper if(pa < ctob(VALID_START_PFN_4)) 665*63d1fd59SEnji Cooper pa += ctob(VALID_START_PFN_4); 666*63d1fd59SEnji Cooper PHYS_TO_VM_PAGE(pa); 667*63d1fd59SEnji Cooper } 668*63d1fd59SEnji Cooper 669*63d1fd59SEnji Cooper ATF_CHECK_EQ(true, true); 670*63d1fd59SEnji Cooper } 671*63d1fd59SEnji Cooper 672*63d1fd59SEnji Cooper ATF_TC(uvm_physseg_256MB); 673*63d1fd59SEnji Cooper ATF_TC_HEAD(uvm_physseg_256MB, tc) 674*63d1fd59SEnji Cooper { 675*63d1fd59SEnji Cooper atf_tc_set_md_var(tc, "descr", "Load test uvm_phys_to_vm_page() with \ 676*63d1fd59SEnji Cooper 10,000,000 calls, VM_PHYSSEG_MAX is 32 on 256 MB Segment."); 677*63d1fd59SEnji Cooper } 678*63d1fd59SEnji Cooper ATF_TC_BODY(uvm_physseg_256MB, t) 679*63d1fd59SEnji Cooper { 680*63d1fd59SEnji Cooper paddr_t pa = 0; 681*63d1fd59SEnji Cooper 682*63d1fd59SEnji Cooper paddr_t pf = 0; 683*63d1fd59SEnji Cooper 684*63d1fd59SEnji Cooper psize_t pf_chunk_size = 0; 685*63d1fd59SEnji Cooper 686*63d1fd59SEnji Cooper psize_t npages1 = (VALID_END_PFN_1 - VALID_START_PFN_1); 687*63d1fd59SEnji Cooper 688*63d1fd59SEnji Cooper psize_t npages2 = (VALID_END_PFN_5 - VALID_START_PFN_5); 689*63d1fd59SEnji Cooper 690*63d1fd59SEnji Cooper struct vm_page *slab = malloc(sizeof(struct vm_page) * (npages1 + npages2)); 691*63d1fd59SEnji Cooper 692*63d1fd59SEnji Cooper setup(); 693*63d1fd59SEnji Cooper 694*63d1fd59SEnji Cooper /* We start with zero segments */ 695*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(true, uvm_physseg_plug(VALID_START_PFN_1, npages1, NULL)); 696*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(1, uvm_physseg_get_entries()); 697*63d1fd59SEnji Cooper 698*63d1fd59SEnji Cooper /* Post boot: Fake all segments and pages accounted for. */ 699*63d1fd59SEnji Cooper uvm_page_init_fake(slab, npages1 + npages2); 700*63d1fd59SEnji Cooper 701*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(true, uvm_physseg_plug(VALID_START_PFN_2, npages2, NULL)); 702*63d1fd59SEnji Cooper ATF_REQUIRE_EQ(2, uvm_physseg_get_entries()); 703*63d1fd59SEnji Cooper 704*63d1fd59SEnji Cooper srandom((unsigned)time(NULL)); 705*63d1fd59SEnji Cooper for(pf = VALID_START_PFN_5; pf < VALID_END_PFN_5; pf += PF_STEP) { 706*63d1fd59SEnji Cooper pf_chunk_size = (psize_t) random() % (psize_t) (PF_STEP - 1) + 1; 707*63d1fd59SEnji Cooper uvm_physseg_unplug(pf, pf_chunk_size); 708*63d1fd59SEnji Cooper } 709*63d1fd59SEnji Cooper 710*63d1fd59SEnji Cooper for(int i = 0; i < 10000000; i++) { 711*63d1fd59SEnji Cooper pa = (paddr_t) random() % (paddr_t) ctob(VALID_END_PFN_5); 712*63d1fd59SEnji Cooper if(pa < ctob(VALID_END_PFN_5)) 713*63d1fd59SEnji Cooper pa += ctob(VALID_START_PFN_5); 714*63d1fd59SEnji Cooper PHYS_TO_VM_PAGE(pa); 715*63d1fd59SEnji Cooper } 716*63d1fd59SEnji Cooper 717*63d1fd59SEnji Cooper ATF_CHECK_EQ(true, true); 718*63d1fd59SEnji Cooper } 719*63d1fd59SEnji Cooper 720*63d1fd59SEnji Cooper ATF_TP_ADD_TCS(tp) 721*63d1fd59SEnji Cooper { 722*63d1fd59SEnji Cooper /* Fixed memory size tests. */ 723*63d1fd59SEnji Cooper ATF_TP_ADD_TC(tp, uvm_physseg_100); 724*63d1fd59SEnji Cooper ATF_TP_ADD_TC(tp, uvm_physseg_1K); 725*63d1fd59SEnji Cooper ATF_TP_ADD_TC(tp, uvm_physseg_10K); 726*63d1fd59SEnji Cooper ATF_TP_ADD_TC(tp, uvm_physseg_100K); 727*63d1fd59SEnji Cooper ATF_TP_ADD_TC(tp, uvm_physseg_1M); 728*63d1fd59SEnji Cooper ATF_TP_ADD_TC(tp, uvm_physseg_10M); 729*63d1fd59SEnji Cooper ATF_TP_ADD_TC(tp, uvm_physseg_100M); 730*63d1fd59SEnji Cooper 731*63d1fd59SEnji Cooper #if defined(UVM_HOTPLUG) 732*63d1fd59SEnji Cooper /* Variable memory size tests. */ 733*63d1fd59SEnji Cooper ATF_TP_ADD_TC(tp, uvm_physseg_1MB); 734*63d1fd59SEnji Cooper ATF_TP_ADD_TC(tp, uvm_physseg_64MB); 735*63d1fd59SEnji Cooper ATF_TP_ADD_TC(tp, uvm_physseg_128MB); 736*63d1fd59SEnji Cooper ATF_TP_ADD_TC(tp, uvm_physseg_256MB); 737*63d1fd59SEnji Cooper #endif /* UVM_HOTPLUG */ 738*63d1fd59SEnji Cooper 739*63d1fd59SEnji Cooper return atf_no_error(); 740*63d1fd59SEnji Cooper } 741