xref: /freebsd-src/contrib/netbsd-tests/sys/uvm/t_uvm_physseg_load.c (revision 1a36faad54665288ed4eb839d2a4699ae2ead45e)
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