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