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