123 if (pagesavail < (spgcnt_t)btopr(vp_len)) {
124 /*
125 * Don't have enough free memory for the
126 * max request, try sizing down vp request.
127 */
128 deltab = (ssize_t)(off - vp_off);
129 vp_len -= deltab;
130 vp_off += deltab;
131 if (pagesavail < btopr(vp_len)) {
132 /*
133 * Still not enough memory, just settle for
134 * pagesavail which is at least 1.
135 */
136 vp_len = ptob(pagesavail);
137 }
138 }
139
140 vp_end = vp_off + vp_len;
141 ASSERT(off >= vp_off && off < vp_end);
142
143 if (isra && SEGOP_KLUSTER(seg, addr, 0))
144 return ((page_t *)NULL); /* segment driver says no */
145
146 if ((plist = page_create_va(vp, off,
147 PAGESIZE, PG_EXCL | PG_WAIT, seg, addr)) == NULL)
148 return ((page_t *)NULL);
149
150 if (vp_len <= PAGESIZE || pvn_nofodklust) {
151 *offp = off;
152 *lenp = MIN(vp_len, PAGESIZE);
153 } else {
154 /*
155 * Scan back from front by incrementing "deltab" and
156 * comparing "off" with "vp_off + deltab" to avoid
157 * "signed" versus "unsigned" conversion problems.
158 */
159 for (deltab = PAGESIZE; off >= vp_off + deltab;
160 deltab += PAGESIZE) {
161 /*
162 * Call back to the segment driver to verify that
163 * the klustering/read ahead operation makes sense.
164 */
165 if (SEGOP_KLUSTER(seg, addr, -deltab))
166 break; /* page not eligible */
167 if ((pp = page_create_va(vp, off - deltab,
168 PAGESIZE, PG_EXCL, seg, addr - deltab))
169 == NULL)
170 break; /* already have the page */
171 /*
172 * Add page to front of page list.
173 */
174 page_add(&plist, pp);
175 }
176 deltab -= PAGESIZE;
177
178 /* scan forward from front */
179 for (deltaf = PAGESIZE; off + deltaf < vp_end;
180 deltaf += PAGESIZE) {
181 /*
182 * Call back to the segment driver to verify that
183 * the klustering/read ahead operation makes sense.
184 */
185 if (SEGOP_KLUSTER(seg, addr, deltaf))
186 break; /* page not file extension */
187 if ((pp = page_create_va(vp, off + deltaf,
188 PAGESIZE, PG_EXCL, seg, addr + deltaf))
189 == NULL)
190 break; /* already have page */
191
192 /*
193 * Add page to end of page list.
194 */
195 page_add(&plist, pp);
196 plist = plist->p_next;
197 }
198 *offp = off = off - deltab;
199 *lenp = deltab + deltaf;
200 ASSERT(off >= vp_off);
201
202 /*
203 * If we ended up getting more than was actually
204 * requested, retract the returned length to only
205 * reflect what was requested. This might happen
|
123 if (pagesavail < (spgcnt_t)btopr(vp_len)) {
124 /*
125 * Don't have enough free memory for the
126 * max request, try sizing down vp request.
127 */
128 deltab = (ssize_t)(off - vp_off);
129 vp_len -= deltab;
130 vp_off += deltab;
131 if (pagesavail < btopr(vp_len)) {
132 /*
133 * Still not enough memory, just settle for
134 * pagesavail which is at least 1.
135 */
136 vp_len = ptob(pagesavail);
137 }
138 }
139
140 vp_end = vp_off + vp_len;
141 ASSERT(off >= vp_off && off < vp_end);
142
143 if (isra && segop_kluster(seg, addr, 0))
144 return ((page_t *)NULL); /* segment driver says no */
145
146 if ((plist = page_create_va(vp, off,
147 PAGESIZE, PG_EXCL | PG_WAIT, seg, addr)) == NULL)
148 return ((page_t *)NULL);
149
150 if (vp_len <= PAGESIZE || pvn_nofodklust) {
151 *offp = off;
152 *lenp = MIN(vp_len, PAGESIZE);
153 } else {
154 /*
155 * Scan back from front by incrementing "deltab" and
156 * comparing "off" with "vp_off + deltab" to avoid
157 * "signed" versus "unsigned" conversion problems.
158 */
159 for (deltab = PAGESIZE; off >= vp_off + deltab;
160 deltab += PAGESIZE) {
161 /*
162 * Call back to the segment driver to verify that
163 * the klustering/read ahead operation makes sense.
164 */
165 if (segop_kluster(seg, addr, -deltab))
166 break; /* page not eligible */
167 if ((pp = page_create_va(vp, off - deltab,
168 PAGESIZE, PG_EXCL, seg, addr - deltab))
169 == NULL)
170 break; /* already have the page */
171 /*
172 * Add page to front of page list.
173 */
174 page_add(&plist, pp);
175 }
176 deltab -= PAGESIZE;
177
178 /* scan forward from front */
179 for (deltaf = PAGESIZE; off + deltaf < vp_end;
180 deltaf += PAGESIZE) {
181 /*
182 * Call back to the segment driver to verify that
183 * the klustering/read ahead operation makes sense.
184 */
185 if (segop_kluster(seg, addr, deltaf))
186 break; /* page not file extension */
187 if ((pp = page_create_va(vp, off + deltaf,
188 PAGESIZE, PG_EXCL, seg, addr + deltaf))
189 == NULL)
190 break; /* already have page */
191
192 /*
193 * Add page to end of page list.
194 */
195 page_add(&plist, pp);
196 plist = plist->p_next;
197 }
198 *offp = off = off - deltab;
199 *lenp = deltab + deltaf;
200 ASSERT(off >= vp_off);
201
202 /*
203 * If we ended up getting more than was actually
204 * requested, retract the returned length to only
205 * reflect what was requested. This might happen
|