Print this page
6583 remove whole-process swapping


  77 static lgrp_mem_policy_info_t *segspt_getpolicy(struct seg *seg, caddr_t addr);
  78 
  79 static void
  80 segspt_badop()
  81 {
  82         panic("segspt_badop called");
  83         /*NOTREACHED*/
  84 }
  85 
  86 #define SEGSPT_BADOP(t) (t(*)())segspt_badop
  87 
  88 struct seg_ops segspt_ops = {
  89         SEGSPT_BADOP(int),              /* dup */
  90         segspt_unmap,
  91         segspt_free,
  92         SEGSPT_BADOP(int),              /* fault */
  93         SEGSPT_BADOP(faultcode_t),      /* faulta */
  94         SEGSPT_BADOP(int),              /* setprot */
  95         SEGSPT_BADOP(int),              /* checkprot */
  96         SEGSPT_BADOP(int),              /* kluster */
  97         SEGSPT_BADOP(size_t),           /* swapout */
  98         SEGSPT_BADOP(int),              /* sync */
  99         SEGSPT_BADOP(size_t),           /* incore */
 100         SEGSPT_BADOP(int),              /* lockop */
 101         SEGSPT_BADOP(int),              /* getprot */
 102         SEGSPT_BADOP(u_offset_t),       /* getoffset */
 103         SEGSPT_BADOP(int),              /* gettype */
 104         SEGSPT_BADOP(int),              /* getvp */
 105         SEGSPT_BADOP(int),              /* advise */
 106         SEGSPT_BADOP(void),             /* dump */
 107         SEGSPT_BADOP(int),              /* pagelock */
 108         SEGSPT_BADOP(int),              /* setpgsz */
 109         SEGSPT_BADOP(int),              /* getmemid */
 110         segspt_getpolicy,               /* getpolicy */
 111         SEGSPT_BADOP(int),              /* capable */
 112         seg_inherit_notsup              /* inherit */
 113 };
 114 
 115 static int segspt_shmdup(struct seg *seg, struct seg *newseg);
 116 static int segspt_shmunmap(struct seg *seg, caddr_t raddr, size_t ssize);
 117 static void segspt_shmfree(struct seg *seg);
 118 static faultcode_t segspt_shmfault(struct hat *hat, struct seg *seg,
 119                 caddr_t addr, size_t len, enum fault_type type, enum seg_rw rw);
 120 static faultcode_t segspt_shmfaulta(struct seg *seg, caddr_t addr);
 121 static int segspt_shmsetprot(register struct seg *seg, register caddr_t addr,
 122                         register size_t len, register uint_t prot);
 123 static int segspt_shmcheckprot(struct seg *seg, caddr_t addr, size_t size,
 124                         uint_t prot);
 125 static int      segspt_shmkluster(struct seg *seg, caddr_t addr, ssize_t delta);
 126 static size_t   segspt_shmswapout(struct seg *seg);
 127 static size_t segspt_shmincore(struct seg *seg, caddr_t addr, size_t len,
 128                         register char *vec);
 129 static int segspt_shmsync(struct seg *seg, register caddr_t addr, size_t len,
 130                         int attr, uint_t flags);
 131 static int segspt_shmlockop(struct seg *seg, caddr_t addr, size_t len,
 132                         int attr, int op, ulong_t *lockmap, size_t pos);
 133 static int segspt_shmgetprot(struct seg *seg, caddr_t addr, size_t len,
 134                         uint_t *protv);
 135 static u_offset_t segspt_shmgetoffset(struct seg *seg, caddr_t addr);
 136 static int segspt_shmgettype(struct seg *seg, caddr_t addr);
 137 static int segspt_shmgetvp(struct seg *seg, caddr_t addr, struct vnode **vpp);
 138 static int segspt_shmadvise(struct seg *seg, caddr_t addr, size_t len,
 139                         uint_t behav);
 140 static void segspt_shmdump(struct seg *seg);
 141 static int segspt_shmpagelock(struct seg *, caddr_t, size_t,
 142                         struct page ***, enum lock_type, enum seg_rw);
 143 static int segspt_shmsetpgsz(struct seg *, caddr_t, size_t, uint_t);
 144 static int segspt_shmgetmemid(struct seg *, caddr_t, memid_t *);
 145 static lgrp_mem_policy_info_t *segspt_shmgetpolicy(struct seg *, caddr_t);
 146 static int segspt_shmcapable(struct seg *, segcapability_t);
 147 
 148 struct seg_ops segspt_shmops = {
 149         segspt_shmdup,
 150         segspt_shmunmap,
 151         segspt_shmfree,
 152         segspt_shmfault,
 153         segspt_shmfaulta,
 154         segspt_shmsetprot,
 155         segspt_shmcheckprot,
 156         segspt_shmkluster,
 157         segspt_shmswapout,
 158         segspt_shmsync,
 159         segspt_shmincore,
 160         segspt_shmlockop,
 161         segspt_shmgetprot,
 162         segspt_shmgetoffset,
 163         segspt_shmgettype,
 164         segspt_shmgetvp,
 165         segspt_shmadvise,       /* advise */
 166         segspt_shmdump,
 167         segspt_shmpagelock,
 168         segspt_shmsetpgsz,
 169         segspt_shmgetmemid,
 170         segspt_shmgetpolicy,
 171         segspt_shmcapable,
 172         seg_inherit_notsup
 173 };
 174 
 175 static void segspt_purge(struct seg *seg);
 176 static int segspt_reclaim(void *, caddr_t, size_t, struct page **,
 177                 enum seg_rw, int);


2222                 return (0);
2223 
2224         default:
2225 #ifdef DEBUG
2226                 cmn_err(CE_WARN, "segspt_shmfault default type?");
2227 #endif
2228                 return (FC_NOMAP);
2229         }
2230 }
2231 
2232 /*ARGSUSED*/
2233 static faultcode_t
2234 segspt_shmfaulta(struct seg *seg, caddr_t addr)
2235 {
2236         return (0);
2237 }
2238 
2239 /*ARGSUSED*/
2240 static int
2241 segspt_shmkluster(struct seg *seg, caddr_t addr, ssize_t delta)
2242 {
2243         return (0);
2244 }
2245 
2246 /*ARGSUSED*/
2247 static size_t
2248 segspt_shmswapout(struct seg *seg)
2249 {
2250         return (0);
2251 }
2252 
2253 /*
2254  * duplicate the shared page tables
2255  */
2256 int
2257 segspt_shmdup(struct seg *seg, struct seg *newseg)
2258 {
2259         struct shm_data         *shmd = (struct shm_data *)seg->s_data;
2260         struct anon_map         *amp = shmd->shm_amp;
2261         struct shm_data         *shmd_new;
2262         struct seg              *spt_seg = shmd->shm_sptseg;
2263         struct spt_data         *sptd = spt_seg->s_data;
2264         int                     error = 0;
2265 
2266         ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as));
2267 
2268         shmd_new = kmem_zalloc((sizeof (*shmd_new)), KM_SLEEP);




  77 static lgrp_mem_policy_info_t *segspt_getpolicy(struct seg *seg, caddr_t addr);
  78 
  79 static void
  80 segspt_badop()
  81 {
  82         panic("segspt_badop called");
  83         /*NOTREACHED*/
  84 }
  85 
  86 #define SEGSPT_BADOP(t) (t(*)())segspt_badop
  87 
  88 struct seg_ops segspt_ops = {
  89         SEGSPT_BADOP(int),              /* dup */
  90         segspt_unmap,
  91         segspt_free,
  92         SEGSPT_BADOP(int),              /* fault */
  93         SEGSPT_BADOP(faultcode_t),      /* faulta */
  94         SEGSPT_BADOP(int),              /* setprot */
  95         SEGSPT_BADOP(int),              /* checkprot */
  96         SEGSPT_BADOP(int),              /* kluster */

  97         SEGSPT_BADOP(int),              /* sync */
  98         SEGSPT_BADOP(size_t),           /* incore */
  99         SEGSPT_BADOP(int),              /* lockop */
 100         SEGSPT_BADOP(int),              /* getprot */
 101         SEGSPT_BADOP(u_offset_t),       /* getoffset */
 102         SEGSPT_BADOP(int),              /* gettype */
 103         SEGSPT_BADOP(int),              /* getvp */
 104         SEGSPT_BADOP(int),              /* advise */
 105         SEGSPT_BADOP(void),             /* dump */
 106         SEGSPT_BADOP(int),              /* pagelock */
 107         SEGSPT_BADOP(int),              /* setpgsz */
 108         SEGSPT_BADOP(int),              /* getmemid */
 109         segspt_getpolicy,               /* getpolicy */
 110         SEGSPT_BADOP(int),              /* capable */
 111         seg_inherit_notsup              /* inherit */
 112 };
 113 
 114 static int segspt_shmdup(struct seg *seg, struct seg *newseg);
 115 static int segspt_shmunmap(struct seg *seg, caddr_t raddr, size_t ssize);
 116 static void segspt_shmfree(struct seg *seg);
 117 static faultcode_t segspt_shmfault(struct hat *hat, struct seg *seg,
 118                 caddr_t addr, size_t len, enum fault_type type, enum seg_rw rw);
 119 static faultcode_t segspt_shmfaulta(struct seg *seg, caddr_t addr);
 120 static int segspt_shmsetprot(register struct seg *seg, register caddr_t addr,
 121                         register size_t len, register uint_t prot);
 122 static int segspt_shmcheckprot(struct seg *seg, caddr_t addr, size_t size,
 123                         uint_t prot);
 124 static int      segspt_shmkluster(struct seg *seg, caddr_t addr, ssize_t delta);

 125 static size_t segspt_shmincore(struct seg *seg, caddr_t addr, size_t len,
 126                         register char *vec);
 127 static int segspt_shmsync(struct seg *seg, register caddr_t addr, size_t len,
 128                         int attr, uint_t flags);
 129 static int segspt_shmlockop(struct seg *seg, caddr_t addr, size_t len,
 130                         int attr, int op, ulong_t *lockmap, size_t pos);
 131 static int segspt_shmgetprot(struct seg *seg, caddr_t addr, size_t len,
 132                         uint_t *protv);
 133 static u_offset_t segspt_shmgetoffset(struct seg *seg, caddr_t addr);
 134 static int segspt_shmgettype(struct seg *seg, caddr_t addr);
 135 static int segspt_shmgetvp(struct seg *seg, caddr_t addr, struct vnode **vpp);
 136 static int segspt_shmadvise(struct seg *seg, caddr_t addr, size_t len,
 137                         uint_t behav);
 138 static void segspt_shmdump(struct seg *seg);
 139 static int segspt_shmpagelock(struct seg *, caddr_t, size_t,
 140                         struct page ***, enum lock_type, enum seg_rw);
 141 static int segspt_shmsetpgsz(struct seg *, caddr_t, size_t, uint_t);
 142 static int segspt_shmgetmemid(struct seg *, caddr_t, memid_t *);
 143 static lgrp_mem_policy_info_t *segspt_shmgetpolicy(struct seg *, caddr_t);
 144 static int segspt_shmcapable(struct seg *, segcapability_t);
 145 
 146 struct seg_ops segspt_shmops = {
 147         segspt_shmdup,
 148         segspt_shmunmap,
 149         segspt_shmfree,
 150         segspt_shmfault,
 151         segspt_shmfaulta,
 152         segspt_shmsetprot,
 153         segspt_shmcheckprot,
 154         segspt_shmkluster,

 155         segspt_shmsync,
 156         segspt_shmincore,
 157         segspt_shmlockop,
 158         segspt_shmgetprot,
 159         segspt_shmgetoffset,
 160         segspt_shmgettype,
 161         segspt_shmgetvp,
 162         segspt_shmadvise,       /* advise */
 163         segspt_shmdump,
 164         segspt_shmpagelock,
 165         segspt_shmsetpgsz,
 166         segspt_shmgetmemid,
 167         segspt_shmgetpolicy,
 168         segspt_shmcapable,
 169         seg_inherit_notsup
 170 };
 171 
 172 static void segspt_purge(struct seg *seg);
 173 static int segspt_reclaim(void *, caddr_t, size_t, struct page **,
 174                 enum seg_rw, int);


2219                 return (0);
2220 
2221         default:
2222 #ifdef DEBUG
2223                 cmn_err(CE_WARN, "segspt_shmfault default type?");
2224 #endif
2225                 return (FC_NOMAP);
2226         }
2227 }
2228 
2229 /*ARGSUSED*/
2230 static faultcode_t
2231 segspt_shmfaulta(struct seg *seg, caddr_t addr)
2232 {
2233         return (0);
2234 }
2235 
2236 /*ARGSUSED*/
2237 static int
2238 segspt_shmkluster(struct seg *seg, caddr_t addr, ssize_t delta)







2239 {
2240         return (0);
2241 }
2242 
2243 /*
2244  * duplicate the shared page tables
2245  */
2246 int
2247 segspt_shmdup(struct seg *seg, struct seg *newseg)
2248 {
2249         struct shm_data         *shmd = (struct shm_data *)seg->s_data;
2250         struct anon_map         *amp = shmd->shm_amp;
2251         struct shm_data         *shmd_new;
2252         struct seg              *spt_seg = shmd->shm_sptseg;
2253         struct spt_data         *sptd = spt_seg->s_data;
2254         int                     error = 0;
2255 
2256         ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as));
2257 
2258         shmd_new = kmem_zalloc((sizeof (*shmd_new)), KM_SLEEP);