2021-10-11 18:20:23 -03:00

61 lines
1.7 KiB
C

/* @(#)anon.h 1.1 92/07/30 SMI */
/*
* Copyright (c) 1987 by Sun Microsystems, Inc.
*/
#ifndef _vm_anon_h
#define _vm_anon_h
/*
* VM - Anonymous pages.
*/
/*
* Each page which is anonymous, either in memory or in swap,
* has an anon structure. The structure's primary purpose is
* to hold a reference count so that we can detect when the last
* copy of a multiply-referenced copy-on-write page goes away.
* When on the free list, un.next gives the next anon structure
* in the list. Otherwise, un.page is a ``hint'' which probably
* points to the current page. This must be explicitly checked
* since the page can be moved underneath us. This is simply
* an optimization to avoid having to look up each page when
* doing things like fork.
*/
struct anon {
int an_refcnt;
union {
struct page *an_page; /* ``hint'' to the real page */
struct anon *an_next; /* free list pointer */
} un;
};
struct anoninfo {
u_int ani_max; /* maximum anon pages available */
u_int ani_free; /* number of anon pages currently free */
u_int ani_resv; /* number of anon pages reserved */
};
#ifdef KERNEL
/*
* Flags for anon_private.
*/
#define STEAL_PAGE 0x01 /* page can be stolen */
#define LOCK_PAGE 0x02 /* page must be ``logically'' locked */
extern struct anoninfo anoninfo;
struct anon *anon_alloc();
void anon_dup(/* old, new, size */);
void anon_free(/* app, size */);
int anon_getpage(/* app, protp, pl, sz, seg, addr, rw, cred */);
struct page *anon_private(/* app, seg, addr, opp, oppflags */);
struct page *anon_zero(/* seg, addr, app */);
void anon_unloadmap(/* ap, ref, mod */);
int anon_resv(/* size */);
void anon_unresv(/* size */);
#endif KERNEL
#endif /*!_vm_anon_h*/