vm_phys.h revision 263620
1251875Speter/*-
2251875Speter * Copyright (c) 2002-2006 Rice University
3251875Speter * Copyright (c) 2007 Alan L. Cox <alc@cs.rice.edu>
4251875Speter * All rights reserved.
5251875Speter *
6251875Speter * This software was developed for the FreeBSD Project by Alan L. Cox,
7251875Speter * Olivier Crameri, Peter Druschel, Sitaram Iyer, and Juan Navarro.
8251875Speter *
9251875Speter * Redistribution and use in source and binary forms, with or without
10251875Speter * modification, are permitted provided that the following conditions
11251875Speter * are met:
12251875Speter * 1. Redistributions of source code must retain the above copyright
13251875Speter *    notice, this list of conditions and the following disclaimer.
14251875Speter * 2. Redistributions in binary form must reproduce the above copyright
15251875Speter *    notice, this list of conditions and the following disclaimer in the
16251875Speter *    documentation and/or other materials provided with the distribution.
17251875Speter *
18251875Speter * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19251875Speter * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20251875Speter * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21251875Speter * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT
22251875Speter * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23251875Speter * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24251875Speter * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
25251875Speter * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26251875Speter * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27251875Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
28251875Speter * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29251875Speter * POSSIBILITY OF SUCH DAMAGE.
30251875Speter *
31251875Speter * $FreeBSD: head/sys/vm/vm_phys.h 263620 2014-03-22 10:26:09Z bdrewery $
32251875Speter */
33251875Speter
34251875Speter/*
35251875Speter *	Physical memory system definitions
36251875Speter */
37251875Speter
38251875Speter#ifndef	_VM_PHYS_H_
39251875Speter#define	_VM_PHYS_H_
40251875Speter
41251875Speter#ifdef _KERNEL
42251875Speter
43251875Speter/* Domains must be dense (non-sparse) and zero-based. */
44251875Speterstruct mem_affinity {
45251875Speter	vm_paddr_t start;
46251875Speter	vm_paddr_t end;
47251875Speter	int domain;
48251875Speter};
49251875Speter
50251875Speterstruct vm_freelist {
51251875Speter	struct pglist pl;
52251875Speter	int lcnt;
53251875Speter};
54251875Speter
55251875Speterstruct vm_phys_seg {
56251875Speter	vm_paddr_t	start;
57251875Speter	vm_paddr_t	end;
58251875Speter	vm_page_t	first_page;
59251875Speter	int		domain;
60251875Speter	struct vm_freelist (*free_queues)[VM_NFREEPOOL][VM_NFREEORDER];
61251875Speter};
62251875Speter
63251875Speterextern struct mem_affinity *mem_affinity;
64251875Speterextern int vm_ndomains;
65251875Speterextern struct vm_phys_seg vm_phys_segs[];
66251875Speterextern int vm_phys_nsegs;
67251875Speter
68251875Speter/*
69251875Speter * The following functions are only to be used by the virtual memory system.
70251875Speter */
71251875Spetervoid vm_phys_add_page(vm_paddr_t pa);
72251875Spetervm_page_t vm_phys_alloc_contig(u_long npages, vm_paddr_t low, vm_paddr_t high,
73251875Speter    u_long alignment, vm_paddr_t boundary);
74251875Spetervm_page_t vm_phys_alloc_freelist_pages(int flind, int pool, int order);
75251875Spetervm_page_t vm_phys_alloc_pages(int pool, int order);
76251875Speterboolean_t vm_phys_domain_intersects(long mask, vm_paddr_t low, vm_paddr_t high);
77251875Speterint vm_phys_fictitious_reg_range(vm_paddr_t start, vm_paddr_t end,
78251875Speter    vm_memattr_t memattr);
79251875Spetervoid vm_phys_fictitious_unreg_range(vm_paddr_t start, vm_paddr_t end);
80251875Spetervm_page_t vm_phys_fictitious_to_vm_page(vm_paddr_t pa);
81251875Spetervoid vm_phys_free_contig(vm_page_t m, u_long npages);
82251875Spetervoid vm_phys_free_pages(vm_page_t m, int order);
83251875Spetervoid vm_phys_init(void);
84251875Spetervm_page_t vm_phys_paddr_to_vm_page(vm_paddr_t pa);
85251875Spetervoid vm_phys_set_pool(int pool, vm_page_t m, int order);
86251875Speterboolean_t vm_phys_unfree_page(vm_page_t m);
87251875Speterboolean_t vm_phys_zero_pages_idle(void);
88251875Speter
89251875Speter/*
90251875Speter *	vm_phys_domain:
91251875Speter *
92251875Speter * 	Return the memory domain the page belongs to.
93251875Speter */
94251875Speterstatic inline struct vm_domain *
95251875Spetervm_phys_domain(vm_page_t m)
96251875Speter{
97251875Speter#if MAXMEMDOM > 1
98251875Speter	int domn, segind;
99251875Speter
100251875Speter	/* XXXKIB try to assert that the page is managed */
101251875Speter	segind = m->segind;
102251875Speter	KASSERT(segind < vm_phys_nsegs, ("segind %d m %p", segind, m));
103251875Speter	domn = vm_phys_segs[segind].domain;
104251875Speter	KASSERT(domn < vm_ndomains, ("domain %d m %p", domn, m));
105251875Speter	return (&vm_dom[domn]);
106251875Speter#else
107251875Speter	return (&vm_dom[0]);
108251875Speter#endif
109251875Speter}
110251875Speter
111251875Speterstatic inline void
112251875Spetervm_phys_freecnt_adj(vm_page_t m, int adj)
113251875Speter{
114251875Speter
115251875Speter	mtx_assert(&vm_page_queue_free_mtx, MA_OWNED);
116251875Speter	vm_cnt.v_free_count += adj;
117251875Speter	vm_phys_domain(m)->vmd_free_count += adj;
118251875Speter}
119251875Speter
120251875Speter#endif	/* _KERNEL */
121251875Speter#endif	/* !_VM_PHYS_H_ */
122251875Speter