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
panic(const char * fmt,...)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
uvm_pagefree(struct vm_page * pg)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
uvmpdpol_reinit(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
uvm_physseg_dump_seg(uvm_physseg_t upm)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
uvm_physseg_get_entries(void)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
uvm_page_init_fake(struct vm_page * pagearray,psize_t pagecount)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 *
uvm_phys_to_vm_page(paddr_t pa)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
setup(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);
ATF_TC_HEAD(uvm_physseg_100,tc)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 }
ATF_TC_BODY(uvm_physseg_100,tc)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);
ATF_TC_HEAD(uvm_physseg_1K,tc)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 }
ATF_TC_BODY(uvm_physseg_1K,tc)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);
ATF_TC_HEAD(uvm_physseg_10K,tc)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 }
ATF_TC_BODY(uvm_physseg_10K,tc)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);
ATF_TC_HEAD(uvm_physseg_100K,tc)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 }
ATF_TC_BODY(uvm_physseg_100K,tc)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);
ATF_TC_HEAD(uvm_physseg_1M,tc)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 }
ATF_TC_BODY(uvm_physseg_1M,tc)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);
ATF_TC_HEAD(uvm_physseg_10M,tc)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 }
ATF_TC_BODY(uvm_physseg_10M,tc)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);
ATF_TC_HEAD(uvm_physseg_100M,tc)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 }
ATF_TC_BODY(uvm_physseg_100M,tc)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);
ATF_TC_HEAD(uvm_physseg_1MB,tc)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 }
ATF_TC_BODY(uvm_physseg_1MB,t)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);
ATF_TC_HEAD(uvm_physseg_64MB,tc)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 }
ATF_TC_BODY(uvm_physseg_64MB,t)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);
ATF_TC_HEAD(uvm_physseg_128MB,tc)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 }
ATF_TC_BODY(uvm_physseg_128MB,t)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);
ATF_TC_HEAD(uvm_physseg_256MB,tc)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 }
ATF_TC_BODY(uvm_physseg_256MB,t)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
ATF_TP_ADD_TCS(tp)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