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;
|