Print this page
patch SEGOP_SWAPOUT-delete


  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 };
 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_shmswapout(struct seg *seg);
 126 static size_t segspt_shmincore(struct seg *seg, caddr_t addr, size_t len,
 127                         register char *vec);
 128 static int segspt_shmsync(struct seg *seg, register caddr_t addr, size_t len,
 129                         int attr, uint_t flags);
 130 static int segspt_shmlockop(struct seg *seg, caddr_t addr, size_t len,
 131                         int attr, int op, ulong_t *lockmap, size_t pos);
 132 static int segspt_shmgetprot(struct seg *seg, caddr_t addr, size_t len,
 133                         uint_t *protv);
 134 static u_offset_t segspt_shmgetoffset(struct seg *seg, caddr_t addr);
 135 static int segspt_shmgettype(struct seg *seg, caddr_t addr);
 136 static int segspt_shmgetvp(struct seg *seg, caddr_t addr, struct vnode **vpp);
 137 static int segspt_shmadvise(struct seg *seg, caddr_t addr, size_t len,
 138                         uint_t behav);
 139 static void segspt_shmdump(struct seg *seg);
 140 static int segspt_shmpagelock(struct seg *, caddr_t, size_t,
 141                         struct page ***, enum lock_type, enum seg_rw);
 142 static int segspt_shmsetpgsz(struct seg *, caddr_t, size_t, uint_t);
 143 static int segspt_shmgetmemid(struct seg *, caddr_t, memid_t *);
 144 static lgrp_mem_policy_info_t *segspt_shmgetpolicy(struct seg *, caddr_t);
 145 static int segspt_shmcapable(struct seg *, segcapability_t);
 146 
 147 struct seg_ops segspt_shmops = {
 148         segspt_shmdup,
 149         segspt_shmunmap,
 150         segspt_shmfree,
 151         segspt_shmfault,
 152         segspt_shmfaulta,
 153         segspt_shmsetprot,
 154         segspt_shmcheckprot,
 155         segspt_shmkluster,
 156         segspt_shmswapout,
 157         segspt_shmsync,
 158         segspt_shmincore,
 159         segspt_shmlockop,
 160         segspt_shmgetprot,
 161         segspt_shmgetoffset,
 162         segspt_shmgettype,
 163         segspt_shmgetvp,
 164         segspt_shmadvise,       /* advise */
 165         segspt_shmdump,
 166         segspt_shmpagelock,
 167         segspt_shmsetpgsz,
 168         segspt_shmgetmemid,
 169         segspt_shmgetpolicy,
 170         segspt_shmcapable,
 171 };
 172 
 173 static void segspt_purge(struct seg *seg);
 174 static int segspt_reclaim(void *, caddr_t, size_t, struct page **,
 175                 enum seg_rw, int);
 176 static int spt_anon_getpages(struct seg *seg, caddr_t addr, size_t len,


2245                 cmn_err(CE_WARN, "segspt_shmfault default type?");
2246 #endif
2247                 return (FC_NOMAP);
2248         }
2249 }
2250 
2251 /*ARGSUSED*/
2252 static faultcode_t
2253 segspt_shmfaulta(struct seg *seg, caddr_t addr)
2254 {
2255         return (0);
2256 }
2257 
2258 /*ARGSUSED*/
2259 static int
2260 segspt_shmkluster(struct seg *seg, caddr_t addr, ssize_t delta)
2261 {
2262         return (0);
2263 }
2264 
2265 /*ARGSUSED*/
2266 static size_t
2267 segspt_shmswapout(struct seg *seg)
2268 {
2269         return (0);
2270 }
2271 
2272 /*
2273  * duplicate the shared page tables
2274  */
2275 int
2276 segspt_shmdup(struct seg *seg, struct seg *newseg)
2277 {
2278         struct shm_data         *shmd = (struct shm_data *)seg->s_data;
2279         struct anon_map         *amp = shmd->shm_amp;
2280         struct shm_data         *shmd_new;
2281         struct seg              *spt_seg = shmd->shm_sptseg;
2282         struct spt_data         *sptd = spt_seg->s_data;
2283         int                     error = 0;
2284 
2285         ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as, &seg->s_as->a_lock));
2286 
2287         shmd_new = kmem_zalloc((sizeof (*shmd_new)), KM_SLEEP);
2288         newseg->s_data = (void *)shmd_new;
2289         shmd_new->shm_sptas = shmd->shm_sptas;
2290         shmd_new->shm_amp = amp;
2291         shmd_new->shm_sptseg = shmd->shm_sptseg;




  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 };
 112 
 113 static int segspt_shmdup(struct seg *seg, struct seg *newseg);
 114 static int segspt_shmunmap(struct seg *seg, caddr_t raddr, size_t ssize);
 115 static void segspt_shmfree(struct seg *seg);
 116 static faultcode_t segspt_shmfault(struct hat *hat, struct seg *seg,
 117                 caddr_t addr, size_t len, enum fault_type type, enum seg_rw rw);
 118 static faultcode_t segspt_shmfaulta(struct seg *seg, caddr_t addr);
 119 static int segspt_shmsetprot(register struct seg *seg, register caddr_t addr,
 120                         register size_t len, register uint_t prot);
 121 static int segspt_shmcheckprot(struct seg *seg, caddr_t addr, size_t size,
 122                         uint_t prot);
 123 static int      segspt_shmkluster(struct seg *seg, caddr_t addr, ssize_t delta);

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

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


2242                 cmn_err(CE_WARN, "segspt_shmfault default type?");
2243 #endif
2244                 return (FC_NOMAP);
2245         }
2246 }
2247 
2248 /*ARGSUSED*/
2249 static faultcode_t
2250 segspt_shmfaulta(struct seg *seg, caddr_t addr)
2251 {
2252         return (0);
2253 }
2254 
2255 /*ARGSUSED*/
2256 static int
2257 segspt_shmkluster(struct seg *seg, caddr_t addr, ssize_t delta)
2258 {
2259         return (0);
2260 }
2261 







2262 /*
2263  * duplicate the shared page tables
2264  */
2265 int
2266 segspt_shmdup(struct seg *seg, struct seg *newseg)
2267 {
2268         struct shm_data         *shmd = (struct shm_data *)seg->s_data;
2269         struct anon_map         *amp = shmd->shm_amp;
2270         struct shm_data         *shmd_new;
2271         struct seg              *spt_seg = shmd->shm_sptseg;
2272         struct spt_data         *sptd = spt_seg->s_data;
2273         int                     error = 0;
2274 
2275         ASSERT(seg->s_as && AS_WRITE_HELD(seg->s_as, &seg->s_as->a_lock));
2276 
2277         shmd_new = kmem_zalloc((sizeof (*shmd_new)), KM_SLEEP);
2278         newseg->s_data = (void *)shmd_new;
2279         shmd_new->shm_sptas = shmd->shm_sptas;
2280         shmd_new->shm_amp = amp;
2281         shmd_new->shm_sptseg = shmd->shm_sptseg;