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