1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 
  26 /*      Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
  27 /*        All Rights Reserved   */
  28 
  29 /*
  30  * University Copyright- Copyright (c) 1982, 1986, 1988
  31  * The Regents of the University of California
  32  * All Rights Reserved
  33  *
  34  * University Acknowledgment- Portions of this document are derived from
  35  * software developed by the University of California, Berkeley, and its
  36  * contributors.
  37  */
  38 
  39 #ifndef _SYS_VMSYSTM_H
  40 #define _SYS_VMSYSTM_H
  41 
  42 #include <sys/proc.h>
  43 
  44 #ifdef  __cplusplus
  45 extern "C" {
  46 #endif
  47 
  48 /*
  49  * Miscellaneous virtual memory subsystem variables and structures.
  50  */
  51 #ifdef _KERNEL
  52 extern pgcnt_t  freemem;        /* remaining blocks of free memory */
  53 extern pgcnt_t  avefree;        /* 5 sec moving average of free memory */
  54 extern pgcnt_t  avefree30;      /* 30 sec moving average of free memory */
  55 extern pgcnt_t  deficit;        /* estimate of needs of new swapped in procs */
  56 extern pgcnt_t  nscan;          /* number of scans in last second */
  57 extern pgcnt_t  desscan;        /* desired pages scanned per second */
  58 extern pgcnt_t  slowscan;
  59 extern pgcnt_t  fastscan;
  60 extern pgcnt_t  pushes;         /* number of pages pushed to swap device */
  61 
  62 /* writable copies of tunables */
  63 extern pgcnt_t  maxpgio;        /* max paging i/o per sec before start swaps */
  64 extern pgcnt_t  lotsfree;       /* max free before clock freezes */
  65 extern pgcnt_t  desfree;        /* minimum free pages before swapping begins */
  66 extern pgcnt_t  minfree;        /* no of pages to try to keep free via daemon */
  67 extern pgcnt_t  needfree;       /* no of pages currently being waited for */
  68 extern pgcnt_t  throttlefree;   /* point at which we block PG_WAIT calls */
  69 extern pgcnt_t  pageout_reserve; /* point at which we deny non-PG_WAIT calls */
  70 extern pgcnt_t  pages_before_pager; /* XXX */
  71 
  72 /*
  73  * TRUE if the pageout daemon, fsflush daemon or the scheduler.  These
  74  * processes can't sleep while trying to free up memory since a deadlock
  75  * will occur if they do sleep.
  76  */
  77 #define NOMEMWAIT() (ttoproc(curthread) == proc_pageout || \
  78                         ttoproc(curthread) == proc_fsflush || \
  79                         ttoproc(curthread) == proc_sched)
  80 
  81 /* insure non-zero */
  82 #define nz(x)   ((x) != 0 ? (x) : 1)
  83 
  84 /*
  85  * Flags passed by the swapper to swapout routines of each
  86  * scheduling class.
  87  */
  88 #define HARDSWAP        1
  89 #define SOFTSWAP        2
  90 
  91 /*
  92  * Values returned by valid_usr_range()
  93  */
  94 #define RANGE_OKAY      (0)
  95 #define RANGE_BADADDR   (1)
  96 #define RANGE_BADPROT   (2)
  97 
  98 /*
  99  * map_pgsz: temporary - subject to change.
 100  */
 101 #define MAPPGSZ_VA      0x01
 102 #define MAPPGSZ_STK     0x02
 103 #define MAPPGSZ_HEAP    0x04
 104 #define MAPPGSZ_ISM     0x08
 105 
 106 /*
 107  * Flags for map_pgszcvec
 108  */
 109 #define MAPPGSZC_SHM    0x01
 110 #define MAPPGSZC_PRIVM  0x02
 111 #define MAPPGSZC_STACK  0x04
 112 #define MAPPGSZC_HEAP   0x08
 113 
 114 /*
 115  * vacalign values for choose_addr
 116  */
 117 #define ADDR_NOVACALIGN 0
 118 #define ADDR_VACALIGN   1
 119 
 120 struct as;
 121 struct page;
 122 struct anon;
 123 
 124 extern int maxslp;
 125 extern ulong_t pginrate;
 126 extern ulong_t pgoutrate;
 127 extern void swapout_lwp(klwp_t *);
 128 
 129 extern  int valid_va_range(caddr_t *basep, size_t *lenp, size_t minlen,
 130                 int dir);
 131 extern  int valid_va_range_aligned(caddr_t *basep, size_t *lenp,
 132     size_t minlen, int dir, size_t align, size_t redzone, size_t off);
 133 
 134 extern  int valid_usr_range(caddr_t, size_t, uint_t, struct as *, caddr_t);
 135 extern  int useracc(void *, size_t, int);
 136 extern  size_t map_pgsz(int maptype, struct proc *p, caddr_t addr, size_t len,
 137     int memcntl);
 138 extern  uint_t map_pgszcvec(caddr_t addr, size_t size, uintptr_t off, int flags,
 139     int type, int memcntl);
 140 extern int choose_addr(struct as *as, caddr_t *addrp, size_t len, offset_t off,
 141     int vacalign, uint_t flags);
 142 extern  void map_addr(caddr_t *addrp, size_t len, offset_t off, int vacalign,
 143     uint_t flags);
 144 extern  int map_addr_vacalign_check(caddr_t, u_offset_t);
 145 extern  void map_addr_proc(caddr_t *addrp, size_t len, offset_t off,
 146     int vacalign, caddr_t userlimit, struct proc *p, uint_t flags);
 147 extern  void vmmeter(void);
 148 extern  int cow_mapin(struct as *, caddr_t, caddr_t, struct page **,
 149         struct anon **, size_t *, int);
 150 
 151 extern  caddr_t ppmapin(struct page *, uint_t, caddr_t);
 152 extern  void    ppmapout(caddr_t);
 153 
 154 extern  int pf_is_memory(pfn_t);
 155 
 156 extern  void    dcache_flushall(void);
 157 
 158 extern  void    *boot_virt_alloc(void *addr, size_t size);
 159 
 160 extern  size_t  exec_get_spslew(void);
 161 
 162 #endif  /* _KERNEL */
 163 
 164 #ifdef  __cplusplus
 165 }
 166 #endif
 167 
 168 #endif  /* _SYS_VMSYSTM_H */