vm_object.h revision 12820
168651Skris/*
268651Skris * Copyright (c) 1991, 1993
368651Skris *	The Regents of the University of California.  All rights reserved.
468651Skris *
568651Skris * This code is derived from software contributed to Berkeley by
668651Skris * The Mach Operating System project at Carnegie-Mellon University.
768651Skris *
868651Skris * Redistribution and use in source and binary forms, with or without
968651Skris * modification, are permitted provided that the following conditions
1068651Skris * are met:
1168651Skris * 1. Redistributions of source code must retain the above copyright
1268651Skris *    notice, this list of conditions and the following disclaimer.
1368651Skris * 2. Redistributions in binary form must reproduce the above copyright
1468651Skris *    notice, this list of conditions and the following disclaimer in the
1568651Skris *    documentation and/or other materials provided with the distribution.
1668651Skris * 3. All advertising materials mentioning features or use of this software
1768651Skris *    must display the following acknowledgement:
1868651Skris *	This product includes software developed by the University of
1968651Skris *	California, Berkeley and its contributors.
2068651Skris * 4. Neither the name of the University nor the names of its contributors
2168651Skris *    may be used to endorse or promote products derived from this software
2268651Skris *    without specific prior written permission.
2368651Skris *
2468651Skris * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2568651Skris * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2668651Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2768651Skris * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2868651Skris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2968651Skris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3068651Skris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3168651Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3268651Skris * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33109998Smarkm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34109998Smarkm * SUCH DAMAGE.
3568651Skris *
3668651Skris *	from: @(#)vm_object.h	8.3 (Berkeley) 1/12/94
3768651Skris *
3868651Skris *
3968651Skris * Copyright (c) 1987, 1990 Carnegie-Mellon University.
4068651Skris * All rights reserved.
4168651Skris *
4268651Skris * Authors: Avadis Tevanian, Jr., Michael Wayne Young
4368651Skris *
4468651Skris * Permission to use, copy, modify and distribute this software and
4568651Skris * its documentation is hereby granted, provided that both the copyright
4668651Skris * notice and this permission notice appear in all copies of the
4768651Skris * software, derivative works or modified versions, and any portions
4868651Skris * thereof, and that both notices appear in supporting documentation.
4968651Skris *
5068651Skris * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
5168651Skris * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
5268651Skris * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
5368651Skris *
5468651Skris * Carnegie Mellon requests users of this software to return to
5568651Skris *
5668651Skris *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
5768651Skris *  School of Computer Science
5868651Skris *  Carnegie Mellon University
5968651Skris *  Pittsburgh PA 15213-3890
6068651Skris *
6168651Skris * any improvements or extensions that they make and grant Carnegie the
6268651Skris * rights to redistribute these changes.
6368651Skris *
6468651Skris * $Id: vm_object.h,v 1.25 1995/12/11 04:58:23 dyson Exp $
6568651Skris */
6668651Skris
6768651Skris/*
6868651Skris *	Virtual memory object module definitions.
6968651Skris */
7068651Skris
7168651Skris#ifndef	_VM_OBJECT_
7268651Skris#define	_VM_OBJECT_
7368651Skris
7468651Skris#ifdef KERNEL
7568651Skris#include <sys/proc.h>		/* XXX for wakeup() */
7668651Skris#endif
7768651Skris
7868651Skrisenum obj_type { OBJT_DEFAULT, OBJT_SWAP, OBJT_VNODE, OBJT_DEVICE };
7968651Skristypedef enum obj_type objtype_t;
8068651Skris
8168651Skris/*
8268651Skris *	Types defined:
8368651Skris *
8468651Skris *	vm_object_t		Virtual memory object.
8568651Skris */
8668651Skris
8768651Skrisstruct vm_object {
8868651Skris	TAILQ_ENTRY(vm_object) object_list; /* list of all objects */
8968651Skris	TAILQ_ENTRY(vm_object) cached_list; /* list of cached (persistent) objects */
9068651Skris	TAILQ_HEAD(, vm_object) shadow_head; /* objects that this is a shadow for */
9168651Skris	TAILQ_ENTRY(vm_object) shadow_list; /* chain of shadow objects */
9268651Skris	TAILQ_HEAD(, vm_page) memq;	/* list of resident pages */
9368651Skris	objtype_t type;			/* type of pager */
9468651Skris	vm_size_t size;			/* Object size */
9568651Skris	int ref_count;			/* How many refs?? */
9668651Skris	u_short flags;			/* see below */
9768651Skris	u_short paging_in_progress;	/* Paging (in or out) so don't collapse or destroy */
9868651Skris	int resident_page_count;	/* number of resident pages */
9968651Skris	vm_ooffset_t paging_offset;	/* Offset into paging space */
10068651Skris	struct vm_object *backing_object; /* object that I'm a shadow of */
10168651Skris	vm_ooffset_t backing_object_offset;/* Offset in backing object */
10268651Skris	vm_offset_t last_read;		/* last read in object -- detect seq behavior */
10368651Skris	TAILQ_ENTRY(vm_object) pager_object_list; /* list of all objects of this pager type */
10468651Skris	void *handle;
10568651Skris	union {
10668651Skris		struct {
10768651Skris			off_t vnp_size; /* Current size of file */
10868651Skris		} vnp;
10968651Skris		struct {
11068651Skris			TAILQ_HEAD(, vm_page) devp_pglist; /* list of pages allocated */
11168651Skris		} devp;
11268651Skris		struct {
11368651Skris			int swp_nblocks;
11468651Skris			int swp_allocsize;
11568651Skris			struct swblock *swp_blocks;
11668651Skris			short swp_poip;
11768651Skris		} swp;
11868651Skris	} un_pager;
11968651Skris};
12068651Skris
12168651Skris/*
12268651Skris * Flags
12368651Skris */
12468651Skris#define OBJ_CANPERSIST	0x0001		/* allow to persist */
12568651Skris#define OBJ_ACTIVE	0x0004		/* active objects */
12668651Skris#define OBJ_DEAD	0x0008		/* dead objects (during rundown) */
12768651Skris#define	OBJ_PIPWNT	0x0040		/* paging in progress wanted */
12868651Skris#define	OBJ_WRITEABLE	0x0080		/* object has been made writable */
12968651Skris#define	OBJ_MIGHTBEDIRTY	0x0100	/* object might be dirty */
13068651Skris#define OBJ_CLEANING	0x0200
13168651Skris
13268651Skris#define IDX_TO_OFF(idx) (((vm_ooffset_t)(idx)) << PAGE_SHIFT)
13368651Skris#define OFF_TO_IDX(off) ((vm_pindex_t)(((vm_ooffset_t)(off)) >> PAGE_SHIFT))
13468651Skris
13568651Skris#ifdef	KERNEL
13668651Skrisextern int vm_object_cache_max;
13768651Skris
13868651SkrisTAILQ_HEAD(object_q, vm_object);
13968651Skris
14068651Skrisextern struct object_q vm_object_cached_list; /* list of objects persisting */
14168651Skrisextern int vm_object_cached;		/* size of cached list */
14268651Skris
14368651Skrisextern struct object_q vm_object_list;	/* list of allocated objects */
14468651Skrisextern long vm_object_count;		/* count of all objects */
14568651Skris
14668651Skris /* lock for object list and count */
14768651Skris
14868651Skrisextern vm_object_t kernel_object;	/* the single kernel object */
14968651Skrisextern vm_object_t kmem_object;
15068651Skris
15168651Skris#endif				/* KERNEL */
15268651Skris
15368651Skris#ifdef KERNEL
15468651Skrisstatic __inline void
15568651Skrisvm_object_pip_wakeup(vm_object_t object)
15668651Skris{
15768651Skris	object->paging_in_progress--;
15868651Skris	if ((object->flags & OBJ_PIPWNT) && object->paging_in_progress == 0) {
15968651Skris		object->flags &= ~OBJ_PIPWNT;
16068651Skris		wakeup(object);
16168651Skris	}
16268651Skris}
16368651Skris
16468651Skrisvm_object_t vm_object_allocate __P((objtype_t, vm_size_t));
16568651Skrisvoid vm_object_cache_clear __P((void));
16668651Skrisboolean_t vm_object_coalesce __P((vm_object_t, vm_pindex_t, vm_size_t, vm_size_t));
16768651Skrisvoid vm_object_collapse __P((vm_object_t));
16868651Skrisvoid vm_object_copy __P((vm_object_t, vm_pindex_t, vm_object_t *, vm_pindex_t *, boolean_t *));
16968651Skrisvoid vm_object_deallocate __P((vm_object_t));
17068651Skrisvoid vm_object_init __P((void));
17168651Skrisvoid vm_object_page_clean __P((vm_object_t, vm_pindex_t, vm_pindex_t, boolean_t, boolean_t));
17268651Skrisvoid vm_object_page_remove __P((vm_object_t, vm_pindex_t, vm_pindex_t, boolean_t));
17368651Skrisvoid vm_object_pmap_copy __P((vm_object_t, vm_pindex_t, vm_pindex_t));
17468651Skrisvoid vm_object_pmap_remove __P((vm_object_t, vm_pindex_t, vm_pindex_t));
17568651Skrisvoid vm_object_reference __P((vm_object_t));
17668651Skrisvoid vm_object_shadow __P((vm_object_t *, vm_ooffset_t *, vm_size_t));
17768651Skris#endif				/* KERNEL */
17868651Skris
17968651Skris#endif				/* _VM_OBJECT_ */
18068651Skris