vm_object.h revision 108413
117721Speter/*
2175271Sobrien * Copyright (c) 1991, 1993
3175271Sobrien *	The Regents of the University of California.  All rights reserved.
4175271Sobrien *
5175271Sobrien * This code is derived from software contributed to Berkeley by
6175271Sobrien * The Mach Operating System project at Carnegie-Mellon University.
7175271Sobrien *
8175271Sobrien * Redistribution and use in source and binary forms, with or without
917721Speter * modification, are permitted provided that the following conditions
1017721Speter * are met:
1132785Speter * 1. Redistributions of source code must retain the above copyright
1217721Speter *    notice, this list of conditions and the following disclaimer.
1317721Speter * 2. Redistributions in binary form must reproduce the above copyright
1417721Speter *    notice, this list of conditions and the following disclaimer in the
1517721Speter *    documentation and/or other materials provided with the distribution.
1617721Speter * 3. All advertising materials mentioning features or use of this software
1717721Speter *    must display the following acknowledgement:
1817721Speter *	This product includes software developed by the University of
1983496Sdillon *	California, Berkeley and its contributors.
2083496Sdillon * 4. Neither the name of the University nor the names of its contributors
2183496Sdillon *    may be used to endorse or promote products derived from this software
2217721Speter *    without specific prior written permission.
2317721Speter *
2417721Speter * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2517721Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2617721Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2725839Speter * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2817721Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2917721Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3025839Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3125839Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3217721Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3317721Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3417721Speter * SUCH DAMAGE.
35128269Speter *
36128269Speter *	from: @(#)vm_object.h	8.3 (Berkeley) 1/12/94
3717721Speter *
3817721Speter *
3917721Speter * Copyright (c) 1987, 1990 Carnegie-Mellon University.
4025839Speter * All rights reserved.
4125839Speter *
4225839Speter * Authors: Avadis Tevanian, Jr., Michael Wayne Young
4325839Speter *
4425839Speter * Permission to use, copy, modify and distribute this software and
4525839Speter * its documentation is hereby granted, provided that both the copyright
4625839Speter * notice and this permission notice appear in all copies of the
4725839Speter * software, derivative works or modified versions, and any portions
4817721Speter * thereof, and that both notices appear in supporting documentation.
4917721Speter *
5017721Speter * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
5117721Speter * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
5217721Speter * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
5317721Speter *
5417721Speter * Carnegie Mellon requests users of this software to return to
5517721Speter *
5617721Speter *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
5717721Speter *  School of Computer Science
5817721Speter *  Carnegie Mellon University
5917721Speter *  Pittsburgh PA 15213-3890
6025839Speter *
6117721Speter * any improvements or extensions that they make and grant Carnegie the
6217721Speter * rights to redistribute these changes.
6317721Speter *
6417721Speter * $FreeBSD: head/sys/vm/vm_object.h 108413 2002-12-29 21:01:14Z alc $
6517721Speter */
6617721Speter
6717721Speter/*
6817721Speter *	Virtual memory object module definitions.
6917721Speter */
7017721Speter
7117721Speter#ifndef	_VM_OBJECT_
7217721Speter#define	_VM_OBJECT_
7317721Speter
7417721Speter#include <sys/queue.h>
7525839Speter#include <sys/_lock.h>
7625839Speter#include <sys/_mutex.h>
7725839Speter
7817721Speterenum obj_type { OBJT_DEFAULT, OBJT_SWAP, OBJT_VNODE, OBJT_DEVICE, OBJT_PHYS,
7917721Speter		OBJT_DEAD };
8017721Spetertypedef u_char objtype_t;
8117721Speter
8217721Speter/*
8317721Speter *	Types defined:
8417721Speter *
8517721Speter *	vm_object_t		Virtual memory object.
8617721Speter *
8717721Speter * List of locks
8817721Speter *	(c)	const until freed
8917721Speter *
9017721Speter */
9117721Speter
9217721Speterstruct vm_object {
9317721Speter	struct mtx mtx;
9417721Speter	TAILQ_ENTRY(vm_object) object_list; /* list of all objects */
9517721Speter	TAILQ_HEAD(, vm_object) shadow_head; /* objects that this is a shadow for */
9617721Speter	TAILQ_ENTRY(vm_object) shadow_list; /* chain of shadow objects */
9717721Speter	TAILQ_HEAD(, vm_page) memq;	/* list of resident pages */
9817721Speter	vm_page_t root;			/* root of the resident page splay tree */
9917721Speter	int generation;			/* generation ID */
10017721Speter	vm_pindex_t size;		/* Object size */
10117721Speter	int ref_count;			/* How many refs?? */
10217721Speter	int shadow_count;		/* how many objects that this is a shadow for */
103128269Speter	objtype_t type;			/* type of pager */
10425839Speter	u_short flags;			/* see below */
10525839Speter	u_short pg_color;		/* (c) color of first page in obj */
10625839Speter	u_short paging_in_progress;	/* Paging (in or out) so don't collapse or destroy */
10725839Speter	int resident_page_count;	/* number of resident pages */
10825839Speter	struct vm_object *backing_object; /* object that I'm a shadow of */
10917721Speter	vm_ooffset_t backing_object_offset;/* Offset in backing object */
11017721Speter	TAILQ_ENTRY(vm_object) pager_object_list; /* list of all objects of this pager type */
11117721Speter	void *handle;
11217721Speter	union {
11317721Speter		/*
11417721Speter		 * VNode pager
11517721Speter		 *
11617721Speter		 *	vnp_size - current size of file
11717721Speter		 */
11817721Speter		struct {
11917721Speter			off_t vnp_size;
12017721Speter		} vnp;
12117721Speter
12225839Speter		/*
12325839Speter		 * Device pager
12425839Speter		 *
12525839Speter		 *	devp_pglist - list of allocated pages
12617721Speter		 */
12717721Speter		struct {
12832785Speter			TAILQ_HEAD(, vm_page) devp_pglist;
12932785Speter		} devp;
13032785Speter
13132785Speter		/*
13232785Speter		 * Swap pager
13332785Speter		 *
13432785Speter		 *	swp_bcount - number of swap 'swblock' metablocks, each
13532785Speter		 *		     contains up to 16 swapblk assignments.
13632785Speter		 *		     see vm/swap_pager.h
13732785Speter		 */
13832785Speter		struct {
13932785Speter			int swp_bcount;
14032785Speter		} swp;
14132785Speter	} un_pager;
14232785Speter};
14332785Speter
14432785Speter/*
14532785Speter * Flags
14632785Speter */
14732785Speter#define OBJ_ACTIVE	0x0004		/* active objects */
14825839Speter#define OBJ_DEAD	0x0008		/* dead objects (during rundown) */
14925839Speter#define	OBJ_NOSPLIT	0x0010		/* dont split this object */
15025839Speter#define OBJ_PIPWNT	0x0040		/* paging in progress wanted */
15125839Speter#define	OBJ_WRITEABLE	0x0080		/* object has been made writable */
15225839Speter#define OBJ_MIGHTBEDIRTY 0x0100		/* object might be dirty */
15325839Speter#define OBJ_CLEANING	0x0200
15425839Speter#define OBJ_OPT		0x1000		/* I/O optimization */
15525839Speter#define	OBJ_ONEMAPPING	0x2000		/* One USE (a single, non-forked) mapping flag */
156128269Speter
15725839Speter#define IDX_TO_OFF(idx) (((vm_ooffset_t)(idx)) << PAGE_SHIFT)
15825839Speter#define OFF_TO_IDX(off) ((vm_pindex_t)(((vm_ooffset_t)(off)) >> PAGE_SHIFT))
15925839Speter
16025839Speter#ifdef	_KERNEL
16117721Speter
16217721Speter#define OBJPC_SYNC	0x1			/* sync I/O */
16317721Speter#define OBJPC_INVAL	0x2			/* invalidate */
16417721Speter#define OBJPC_NOSYNC	0x4			/* skip if PG_NOSYNC */
16517721Speter
16617721SpeterTAILQ_HEAD(object_q, vm_object);
16717721Speter
16854427Speterextern struct object_q vm_object_list;	/* list of allocated objects */
16954427Speterextern struct mtx vm_object_list_mtx;	/* lock for object list and count */
17054427Speter
17117721Speterextern vm_object_t kernel_object;	/* the single kernel object */
17217721Speterextern vm_object_t kmem_object;
173128269Speter
174128269Speter#endif				/* _KERNEL */
17517721Speter
17617721Speter#ifdef _KERNEL
17717721Speter#define	vm_object_lock(object) \
17817721Speter	mtx_lock((object) == kmem_object ? &kmem_object->mtx : &Giant)
17917721Speter#define	vm_object_unlock(object) \
18017721Speter	mtx_unlock((object) == kmem_object ? &kmem_object->mtx : &Giant)
181128269Speter
18217721Spetervoid vm_freeze_copyopts(vm_object_t, vm_pindex_t, vm_pindex_t);
18317721Speter
18417721Spetervoid vm_object_set_flag(vm_object_t object, u_short bits);
18517721Spetervoid vm_object_clear_flag(vm_object_t object, u_short bits);
18654427Spetervoid vm_object_pip_add(vm_object_t object, short i);
18754427Spetervoid vm_object_pip_subtract(vm_object_t object, short i);
18817721Spetervoid vm_object_pip_wakeup(vm_object_t object);
18917721Spetervoid vm_object_pip_wakeupn(vm_object_t object, short i);
19017721Spetervoid vm_object_pip_sleep(vm_object_t object, char *waitid);
19117721Spetervoid vm_object_pip_wait(vm_object_t object, char *waitid);
19225839Speter
19325839Spetervm_object_t vm_object_allocate (objtype_t, vm_pindex_t);
19425839Spetervm_object_t vm_object_allocate_wait (objtype_t, vm_pindex_t, int);
19525839Spetervoid _vm_object_allocate (objtype_t, vm_pindex_t, vm_object_t);
19625839Speterboolean_t vm_object_coalesce (vm_object_t, vm_pindex_t, vm_size_t, vm_size_t);
19725839Spetervoid vm_object_collapse (vm_object_t);
19825839Spetervoid vm_object_deallocate (vm_object_t);
19925839Spetervoid vm_object_terminate (vm_object_t);
20025839Spetervoid vm_object_vndeallocate (vm_object_t);
20125839Spetervoid vm_object_set_writeable_dirty (vm_object_t);
20225839Spetervoid vm_object_init (void);
20325839Spetervoid vm_object_page_clean (vm_object_t, vm_pindex_t, vm_pindex_t, boolean_t);
20425839Spetervoid vm_object_page_remove (vm_object_t, vm_pindex_t, vm_pindex_t, boolean_t);
20525839Spetervoid vm_object_pmap_copy_1 (vm_object_t, vm_pindex_t, vm_pindex_t);
20617721Spetervoid vm_object_reference (vm_object_t);
20725839Spetervoid vm_object_shadow (vm_object_t *, vm_ooffset_t *, vm_size_t);
20817721Spetervoid vm_object_split(vm_map_entry_t);
20917721Spetervoid vm_object_madvise (vm_object_t, vm_pindex_t, int, int);
21017721Speter#endif				/* _KERNEL */
21117721Speter
21217721Speter#endif				/* _VM_OBJECT_ */
21317721Speter