1 /* 2 * Copyright (c) 1990 University of Utah. 3 * Copyright (c) 1991 The Regents of the University of California. 4 * All rights reserved. 5 * Copyright (c) 1993, 1994 John S. Dyson 6 * Copyright (c) 1995, David Greenman 7 * 8 * This code is derived from software contributed to Berkeley by 9 * the Systems Programming Group of the University of Utah Computer 10 * Science Department. 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions 14 * are met: 15 * 1. Redistributions of source code must retain the above copyright 16 * notice, this list of conditions and the following disclaimer. 17 * 2. Redistributions in binary form must reproduce the above copyright 18 * notice, this list of conditions and the following disclaimer in the 19 * documentation and/or other materials provided with the distribution. 20 * 3. All advertising materials mentioning features or use of this software 21 * must display the following acknowledgement: 22 * This product includes software developed by the University of 23 * California, Berkeley and its contributors. 24 * 4. Neither the name of the University nor the names of its contributors 25 * may be used to endorse or promote products derived from this software 26 * without specific prior written permission. 27 * 28 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 29 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 30 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 31 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 32 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 36 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 37 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 38 * SUCH DAMAGE. 39 * 40 * from: @(#)vnode_pager.c 7.5 (Berkeley) 4/20/91 41 * $FreeBSD: src/sys/vm/vnode_pager.c,v 1.116.2.7 2002/12/31 09:34:51 dillon Exp $ 42 * $DragonFly: src/sys/vm/vnode_pager.c,v 1.23 2006/03/27 01:54:18 dillon Exp $ 43 */ 44 45 /* 46 * Page to/from files (vnodes). 47 */ 48 49 /* 50 * TODO: 51 * Implement VOP_GETPAGES/PUTPAGES interface for filesystems. Will 52 * greatly re-simplify the vnode_pager. 53 */ 54 55 #include <sys/param.h> 56 #include <sys/systm.h> 57 #include <sys/kernel.h> 58 #include <sys/proc.h> 59 #include <sys/vnode.h> 60 #include <sys/mount.h> 61 #include <sys/buf.h> 62 #include <sys/vmmeter.h> 63 #include <sys/conf.h> 64 #include <sys/sfbuf.h> 65 #include <sys/thread2.h> 66 67 #include <vm/vm.h> 68 #include <vm/vm_object.h> 69 #include <vm/vm_page.h> 70 #include <vm/vm_pager.h> 71 #include <vm/vm_map.h> 72 #include <vm/vnode_pager.h> 73 #include <vm/vm_extern.h> 74 75 static off_t vnode_pager_addr (struct vnode *vp, off_t loffset, int *run); 76 static void vnode_pager_iodone (struct bio *bio); 77 static int vnode_pager_input_smlfs (vm_object_t object, vm_page_t m); 78 static int vnode_pager_input_old (vm_object_t object, vm_page_t m); 79 static void vnode_pager_dealloc (vm_object_t); 80 static int vnode_pager_getpages (vm_object_t, vm_page_t *, int, int); 81 static void vnode_pager_putpages (vm_object_t, vm_page_t *, int, boolean_t, int *); 82 static boolean_t vnode_pager_haspage (vm_object_t, vm_pindex_t, int *, int *); 83 84 struct pagerops vnodepagerops = { 85 NULL, 86 vnode_pager_alloc, 87 vnode_pager_dealloc, 88 vnode_pager_getpages, 89 vnode_pager_putpages, 90 vnode_pager_haspage, 91 NULL 92 }; 93 94 int vnode_pbuf_freecnt = -1; /* start out unlimited */ 95 96 /* 97 * Allocate (or lookup) pager for a vnode. 98 * Handle is a vnode pointer. 99 */ 100 vm_object_t 101 vnode_pager_alloc(void *handle, off_t size, vm_prot_t prot, off_t offset) 102 { 103 vm_object_t object; 104 struct vnode *vp; 105 106 /* 107 * Pageout to vnode, no can do yet. 108 */ 109 if (handle == NULL) 110 return (NULL); 111 112 /* 113 * XXX hack - This initialization should be put somewhere else. 114 */ 115 if (vnode_pbuf_freecnt < 0) { 116 vnode_pbuf_freecnt = nswbuf / 2 + 1; 117 } 118 119 vp = (struct vnode *) handle; 120 121 /* 122 * Prevent race condition when allocating the object. This 123 * can happen with NFS vnodes since the nfsnode isn't locked. 124 */ 125 while (vp->v_flag & VOLOCK) { 126 vp->v_flag |= VOWANT; 127 tsleep(vp, 0, "vnpobj", 0); 128 } 129 vp->v_flag |= VOLOCK; 130 131 /* 132 * If the object is being terminated, wait for it to 133 * go away. 134 */ 135 while (((object = vp->v_object) != NULL) && 136 (object->flags & OBJ_DEAD)) { 137 tsleep(object, 0, "vadead", 0); 138 } 139 140 if (vp->v_usecount == 0) 141 panic("vnode_pager_alloc: no vnode reference"); 142 143 if (object == NULL) { 144 /* 145 * And an object of the appropriate size 146 */ 147 object = vm_object_allocate(OBJT_VNODE, OFF_TO_IDX(round_page(size))); 148 object->flags = 0; 149 object->handle = handle; 150 vp->v_object = object; 151 vp->v_filesize = size; 152 } else { 153 object->ref_count++; 154 if (vp->v_filesize != size) 155 printf("vnode_pager_alloc: Warning, filesize mismatch %lld/%lld\n", vp->v_filesize, size); 156 } 157 vp->v_usecount++; 158 159 vp->v_flag &= ~VOLOCK; 160 if (vp->v_flag & VOWANT) { 161 vp->v_flag &= ~VOWANT; 162 wakeup(vp); 163 } 164 return (object); 165 } 166 167 static void 168 vnode_pager_dealloc(vm_object_t object) 169 { 170 struct vnode *vp = object->handle; 171 172 if (vp == NULL) 173 panic("vnode_pager_dealloc: pager already dealloced"); 174 175 vm_object_pip_wait(object, "vnpdea"); 176 177 object->handle = NULL; 178 object->type = OBJT_DEAD; 179 vp->v_object = NULL; 180 vp->v_filesize = NOOFFSET; 181 vp->v_flag &= ~(VTEXT | VOBJBUF); 182 } 183 184 /* 185 * Return whether the vnode pager has the requested page. Return the 186 * number of disk-contiguous pages before and after the requested page, 187 * not including the requested page. 188 */ 189 static boolean_t 190 vnode_pager_haspage(vm_object_t object, vm_pindex_t pindex, int *before, 191 int *after) 192 { 193 struct vnode *vp = object->handle; 194 off_t loffset; 195 off_t doffset; 196 int voff; 197 int bsize; 198 int error; 199 200 /* 201 * If no vp or vp is doomed or marked transparent to VM, we do not 202 * have the page. 203 */ 204 if ((vp == NULL) || (vp->v_flag & VRECLAIMED)) 205 return FALSE; 206 207 /* 208 * If filesystem no longer mounted or offset beyond end of file we do 209 * not have the page. 210 */ 211 loffset = IDX_TO_OFF(pindex); 212 213 if (vp->v_mount == NULL || loffset >= vp->v_filesize) 214 return FALSE; 215 216 bsize = vp->v_mount->mnt_stat.f_iosize; 217 voff = loffset % bsize; 218 219 error = VOP_BMAP(vp, loffset - voff, NULL, &doffset, after, before); 220 if (error) 221 return TRUE; 222 if (doffset == NOOFFSET) 223 return FALSE; 224 225 if (before) { 226 *before = (*before + voff) >> PAGE_SHIFT; 227 } 228 if (after) { 229 *after -= voff; 230 if (loffset + *after > vp->v_filesize) 231 *after = vp->v_filesize - loffset; 232 *after >>= PAGE_SHIFT; 233 if (*after < 0) 234 *after = 0; 235 } 236 return TRUE; 237 } 238 239 /* 240 * Lets the VM system know about a change in size for a file. 241 * We adjust our own internal size and flush any cached pages in 242 * the associated object that are affected by the size change. 243 * 244 * NOTE: This routine may be invoked as a result of a pager put 245 * operation (possibly at object termination time), so we must be careful. 246 * 247 * NOTE: vp->v_filesize is initialized to NOOFFSET (-1), be sure that 248 * we do not blow up on the case. nsize will always be >= 0, however. 249 */ 250 void 251 vnode_pager_setsize(struct vnode *vp, vm_ooffset_t nsize) 252 { 253 vm_pindex_t nobjsize; 254 vm_object_t object = vp->v_object; 255 256 if (object == NULL) 257 return; 258 259 /* 260 * Hasn't changed size 261 */ 262 if (nsize == vp->v_filesize) 263 return; 264 265 nobjsize = OFF_TO_IDX(nsize + PAGE_MASK); 266 267 /* 268 * File has shrunk. Toss any cached pages beyond the new EOF. 269 */ 270 if (nsize < vp->v_filesize) { 271 vm_freeze_copyopts(object, OFF_TO_IDX(nsize), object->size); 272 if (nobjsize < object->size) { 273 vm_object_page_remove(object, nobjsize, object->size, 274 FALSE); 275 } 276 /* 277 * This gets rid of garbage at the end of a page that is now 278 * only partially backed by the vnode. Since we are setting 279 * the entire page valid & clean after we are done we have 280 * to be sure that the portion of the page within the file 281 * bounds is already valid. If it isn't then making it 282 * valid would create a corrupt block. 283 */ 284 if (nsize & PAGE_MASK) { 285 vm_offset_t kva; 286 vm_page_t m; 287 288 m = vm_page_lookup(object, OFF_TO_IDX(nsize)); 289 if (m && m->valid) { 290 int base = (int)nsize & PAGE_MASK; 291 int size = PAGE_SIZE - base; 292 struct sf_buf *sf; 293 294 /* 295 * Clear out partial-page garbage in case 296 * the page has been mapped. 297 */ 298 sf = sf_buf_alloc(m, SFB_CPUPRIVATE); 299 kva = sf_buf_kva(sf); 300 bzero((caddr_t)kva + base, size); 301 sf_buf_free(sf); 302 303 /* 304 * XXX work around SMP data integrity race 305 * by unmapping the page from user processes. 306 * The garbage we just cleared may be mapped 307 * to a user process running on another cpu 308 * and this code is not running through normal 309 * I/O channels which handle SMP issues for 310 * us, so unmap page to synchronize all cpus. 311 * 312 * XXX should vm_pager_unmap_page() have 313 * dealt with this? 314 */ 315 vm_page_protect(m, VM_PROT_NONE); 316 317 /* 318 * Clear out partial-page dirty bits. This 319 * has the side effect of setting the valid 320 * bits, but that is ok. There are a bunch 321 * of places in the VM system where we expected 322 * m->dirty == VM_PAGE_BITS_ALL. The file EOF 323 * case is one of them. If the page is still 324 * partially dirty, make it fully dirty. 325 * 326 * note that we do not clear out the valid 327 * bits. This would prevent bogus_page 328 * replacement from working properly. 329 */ 330 vm_page_set_validclean(m, base, size); 331 if (m->dirty != 0) 332 m->dirty = VM_PAGE_BITS_ALL; 333 } 334 } 335 } 336 vp->v_filesize = nsize; 337 object->size = nobjsize; 338 } 339 340 void 341 vnode_pager_freepage(vm_page_t m) 342 { 343 vm_page_free(m); 344 } 345 346 /* 347 * calculate the disk byte address of specified logical byte offset. The 348 * logical offset will be block-aligned. Return the number of contiguous 349 * pages that may be read from the underlying block device in *run. If 350 * *run is non-NULL, it will be set to a value of at least 1. 351 */ 352 static off_t 353 vnode_pager_addr(struct vnode *vp, off_t loffset, int *run) 354 { 355 struct vnode *rtvp; 356 off_t doffset; 357 int bsize; 358 int error; 359 int voff; 360 361 if (loffset < 0) 362 return -1; 363 364 if (vp->v_mount == NULL) 365 return -1; 366 367 /* 368 * Align loffset to a block boundary for the BMAP, then adjust the 369 * returned disk address appropriately. 370 */ 371 bsize = vp->v_mount->mnt_stat.f_iosize; 372 voff = loffset % bsize; 373 374 /* 375 * Map the block, adjust the disk offset so it represents the 376 * passed loffset rather then the block containing loffset. 377 */ 378 error = VOP_BMAP(vp, loffset - voff, &rtvp, &doffset, run, NULL); 379 if (error || doffset == NOOFFSET) { 380 doffset = NOOFFSET; 381 } else { 382 doffset += voff; 383 384 /* 385 * When calculating *run, which is the number of pages 386 * worth of data which can be read linearly from disk, 387 * the minimum return value is 1 page. 388 */ 389 if (run) { 390 *run = (*run - voff) >> PAGE_SHIFT; 391 if (*run < 1) 392 *run = 1; 393 } 394 395 } 396 return (doffset); 397 } 398 399 /* 400 * interrupt routine for I/O completion 401 */ 402 static void 403 vnode_pager_iodone(struct bio *bio) 404 { 405 struct buf *bp = bio->bio_buf; 406 407 bp->b_flags |= B_DONE; 408 wakeup(bp); 409 } 410 411 /* 412 * small block file system vnode pager input 413 */ 414 static int 415 vnode_pager_input_smlfs(vm_object_t object, vm_page_t m) 416 { 417 int i; 418 struct vnode *dp, *vp; 419 struct buf *bp; 420 vm_offset_t kva; 421 struct sf_buf *sf; 422 off_t doffset; 423 vm_offset_t bsize; 424 int error = 0; 425 426 vp = object->handle; 427 if (vp->v_mount == NULL) 428 return VM_PAGER_BAD; 429 430 bsize = vp->v_mount->mnt_stat.f_iosize; 431 432 433 VOP_BMAP(vp, (off_t)0, &dp, NULL, NULL, NULL); 434 435 sf = sf_buf_alloc(m, 0); 436 kva = sf_buf_kva(sf); 437 438 for (i = 0; i < PAGE_SIZE / bsize; i++) { 439 off_t loffset; 440 441 if (vm_page_bits(i * bsize, bsize) & m->valid) 442 continue; 443 444 loffset = IDX_TO_OFF(m->pindex) + i * bsize; 445 if (loffset >= vp->v_filesize) { 446 doffset = NOOFFSET; 447 } else { 448 doffset = vnode_pager_addr(vp, loffset, NULL); 449 } 450 if (doffset != NOOFFSET) { 451 bp = getpbuf(&vnode_pbuf_freecnt); 452 453 /* build a minimal buffer header */ 454 bp->b_flags = B_READ; 455 bp->b_data = (caddr_t) kva + i * bsize; 456 bp->b_bio1.bio_done = vnode_pager_iodone; 457 bp->b_bio1.bio_offset = doffset; 458 pbgetvp(dp, bp); 459 bp->b_bcount = bsize; 460 bp->b_bufsize = bsize; 461 bp->b_runningbufspace = bp->b_bufsize; 462 runningbufspace += bp->b_runningbufspace; 463 464 /* do the input */ 465 vn_strategy(dp, &bp->b_bio1); 466 467 /* we definitely need to be at splvm here */ 468 469 crit_enter(); 470 while ((bp->b_flags & B_DONE) == 0) { 471 tsleep(bp, 0, "vnsrd", 0); 472 } 473 crit_exit(); 474 if ((bp->b_flags & B_ERROR) != 0) 475 error = EIO; 476 477 /* 478 * free the buffer header back to the swap buffer pool 479 */ 480 relpbuf(bp, &vnode_pbuf_freecnt); 481 if (error) 482 break; 483 484 vm_page_set_validclean(m, (i * bsize) & PAGE_MASK, bsize); 485 } else { 486 vm_page_set_validclean(m, (i * bsize) & PAGE_MASK, bsize); 487 bzero((caddr_t) kva + i * bsize, bsize); 488 } 489 } 490 sf_buf_free(sf); 491 pmap_clear_modify(m); 492 vm_page_flag_clear(m, PG_ZERO); 493 if (error) { 494 return VM_PAGER_ERROR; 495 } 496 return VM_PAGER_OK; 497 498 } 499 500 501 /* 502 * old style vnode pager output routine 503 */ 504 static int 505 vnode_pager_input_old(vm_object_t object, vm_page_t m) 506 { 507 struct uio auio; 508 struct iovec aiov; 509 int error; 510 int size; 511 vm_offset_t kva; 512 struct sf_buf *sf; 513 struct vnode *vp; 514 515 error = 0; 516 vp = object->handle; 517 518 /* 519 * Return failure if beyond current EOF 520 */ 521 if (IDX_TO_OFF(m->pindex) >= vp->v_filesize) { 522 return VM_PAGER_BAD; 523 } else { 524 size = PAGE_SIZE; 525 if (IDX_TO_OFF(m->pindex) + size > vp->v_filesize) 526 size = vp->v_filesize - IDX_TO_OFF(m->pindex); 527 528 /* 529 * Allocate a kernel virtual address and initialize so that 530 * we can use VOP_READ/WRITE routines. 531 */ 532 sf = sf_buf_alloc(m, 0); 533 kva = sf_buf_kva(sf); 534 535 aiov.iov_base = (caddr_t) kva; 536 aiov.iov_len = size; 537 auio.uio_iov = &aiov; 538 auio.uio_iovcnt = 1; 539 auio.uio_offset = IDX_TO_OFF(m->pindex); 540 auio.uio_segflg = UIO_SYSSPACE; 541 auio.uio_rw = UIO_READ; 542 auio.uio_resid = size; 543 auio.uio_td = curthread; 544 545 error = VOP_READ(((struct vnode *)object->handle), 546 &auio, 0, proc0.p_ucred); 547 if (!error) { 548 int count = size - auio.uio_resid; 549 550 if (count == 0) 551 error = EINVAL; 552 else if (count != PAGE_SIZE) 553 bzero((caddr_t) kva + count, PAGE_SIZE - count); 554 } 555 sf_buf_free(sf); 556 } 557 pmap_clear_modify(m); 558 vm_page_undirty(m); 559 vm_page_flag_clear(m, PG_ZERO); 560 if (!error) 561 m->valid = VM_PAGE_BITS_ALL; 562 return error ? VM_PAGER_ERROR : VM_PAGER_OK; 563 } 564 565 /* 566 * generic vnode pager input routine 567 */ 568 569 /* 570 * EOPNOTSUPP is no longer legal. For local media VFS's that do not 571 * implement their own VOP_GETPAGES, their VOP_GETPAGES should call to 572 * vnode_pager_generic_getpages() to implement the previous behaviour. 573 * 574 * All other FS's should use the bypass to get to the local media 575 * backing vp's VOP_GETPAGES. 576 */ 577 static int 578 vnode_pager_getpages(vm_object_t object, vm_page_t *m, int count, int reqpage) 579 { 580 int rtval; 581 struct vnode *vp; 582 int bytes = count * PAGE_SIZE; 583 584 vp = object->handle; 585 /* 586 * XXX temporary diagnostic message to help track stale FS code, 587 * Returning EOPNOTSUPP from here may make things unhappy. 588 */ 589 rtval = VOP_GETPAGES(vp, m, bytes, reqpage, 0); 590 if (rtval == EOPNOTSUPP) { 591 printf("vnode_pager: *** WARNING *** stale FS getpages\n"); 592 rtval = vnode_pager_generic_getpages( vp, m, bytes, reqpage); 593 } 594 return rtval; 595 } 596 597 598 /* 599 * This is now called from local media FS's to operate against their 600 * own vnodes if they fail to implement VOP_GETPAGES. 601 */ 602 int 603 vnode_pager_generic_getpages(struct vnode *vp, vm_page_t *m, int bytecount, 604 int reqpage) 605 { 606 vm_object_t object; 607 vm_offset_t kva; 608 off_t foff, tfoff, nextoff; 609 int i, size, bsize, first; 610 off_t firstaddr; 611 struct vnode *dp; 612 int runpg; 613 int runend; 614 struct buf *bp; 615 int count; 616 int error = 0; 617 618 object = vp->v_object; 619 count = bytecount / PAGE_SIZE; 620 621 if (vp->v_mount == NULL) 622 return VM_PAGER_BAD; 623 624 bsize = vp->v_mount->mnt_stat.f_iosize; 625 626 /* get the UNDERLYING device for the file with VOP_BMAP() */ 627 628 /* 629 * originally, we did not check for an error return value -- assuming 630 * an fs always has a bmap entry point -- that assumption is wrong!!! 631 */ 632 foff = IDX_TO_OFF(m[reqpage]->pindex); 633 634 /* 635 * if we can't bmap, use old VOP code 636 */ 637 if (VOP_BMAP(vp, (off_t)0, &dp, NULL, NULL, NULL)) { 638 for (i = 0; i < count; i++) { 639 if (i != reqpage) { 640 vnode_pager_freepage(m[i]); 641 } 642 } 643 mycpu->gd_cnt.v_vnodein++; 644 mycpu->gd_cnt.v_vnodepgsin++; 645 return vnode_pager_input_old(object, m[reqpage]); 646 647 /* 648 * if the blocksize is smaller than a page size, then use 649 * special small filesystem code. NFS sometimes has a small 650 * blocksize, but it can handle large reads itself. 651 */ 652 } else if ((PAGE_SIZE / bsize) > 1 && 653 (vp->v_mount->mnt_stat.f_type != nfs_mount_type)) { 654 for (i = 0; i < count; i++) { 655 if (i != reqpage) { 656 vnode_pager_freepage(m[i]); 657 } 658 } 659 mycpu->gd_cnt.v_vnodein++; 660 mycpu->gd_cnt.v_vnodepgsin++; 661 return vnode_pager_input_smlfs(object, m[reqpage]); 662 } 663 664 /* 665 * If we have a completely valid page available to us, we can 666 * clean up and return. Otherwise we have to re-read the 667 * media. 668 * 669 * Note that this does not work with NFS, so NFS has its own 670 * getpages routine. The problem is that NFS can have partially 671 * valid pages associated with the buffer cache due to the piecemeal 672 * write support. If we were to fall through and re-read the media 673 * as we do here, dirty data could be lost. 674 */ 675 676 if (m[reqpage]->valid == VM_PAGE_BITS_ALL) { 677 for (i = 0; i < count; i++) { 678 if (i != reqpage) 679 vnode_pager_freepage(m[i]); 680 } 681 return VM_PAGER_OK; 682 } 683 m[reqpage]->valid = 0; 684 685 /* 686 * here on direct device I/O 687 */ 688 689 firstaddr = -1; 690 /* 691 * calculate the run that includes the required page 692 */ 693 for(first = 0, i = 0; i < count; i = runend) { 694 firstaddr = vnode_pager_addr(vp, IDX_TO_OFF(m[i]->pindex), 695 &runpg); 696 if (firstaddr == -1) { 697 if (i == reqpage && foff < vp->v_filesize) { 698 /* XXX no %qd in kernel. */ 699 panic("vnode_pager_getpages: unexpected missing page: firstaddr: %012llx, foff: 0x%012llx, v_filesize: 0x%012llx", 700 firstaddr, foff, vp->v_filesize); 701 } 702 vnode_pager_freepage(m[i]); 703 runend = i + 1; 704 first = runend; 705 continue; 706 } 707 runend = i + runpg; 708 if (runend <= reqpage) { 709 int j; 710 for (j = i; j < runend; j++) { 711 vnode_pager_freepage(m[j]); 712 } 713 } else { 714 if (runpg < (count - first)) { 715 for (i = first + runpg; i < count; i++) 716 vnode_pager_freepage(m[i]); 717 count = first + runpg; 718 } 719 break; 720 } 721 first = runend; 722 } 723 724 /* 725 * the first and last page have been calculated now, move input pages 726 * to be zero based... 727 */ 728 if (first != 0) { 729 for (i = first; i < count; i++) { 730 m[i - first] = m[i]; 731 } 732 count -= first; 733 reqpage -= first; 734 } 735 736 /* 737 * calculate the file virtual address for the transfer 738 */ 739 foff = IDX_TO_OFF(m[0]->pindex); 740 741 /* 742 * calculate the size of the transfer 743 */ 744 size = count * PAGE_SIZE; 745 if ((foff + size) > vp->v_filesize) 746 size = vp->v_filesize - foff; 747 748 /* 749 * round up physical size for real devices. 750 */ 751 if (dp->v_type == VBLK || dp->v_type == VCHR) { 752 int secmask = dp->v_rdev->si_bsize_phys - 1; 753 KASSERT(secmask < PAGE_SIZE, ("vnode_pager_generic_getpages: sector size %d too large\n", secmask + 1)); 754 size = (size + secmask) & ~secmask; 755 } 756 757 bp = getpbuf(&vnode_pbuf_freecnt); 758 kva = (vm_offset_t) bp->b_data; 759 760 /* 761 * and map the pages to be read into the kva 762 */ 763 pmap_qenter(kva, m, count); 764 765 /* build a minimal buffer header */ 766 bp->b_flags = B_READ; 767 bp->b_bio1.bio_done = vnode_pager_iodone; 768 bp->b_bio1.bio_offset = firstaddr; 769 pbgetvp(dp, bp); 770 bp->b_bcount = size; 771 bp->b_bufsize = size; 772 bp->b_runningbufspace = bp->b_bufsize; 773 runningbufspace += bp->b_runningbufspace; 774 775 mycpu->gd_cnt.v_vnodein++; 776 mycpu->gd_cnt.v_vnodepgsin += count; 777 778 /* do the input */ 779 vn_strategy(dp, &bp->b_bio1); 780 781 crit_enter(); 782 /* we definitely need to be at splvm here */ 783 784 while ((bp->b_flags & B_DONE) == 0) { 785 tsleep(bp, 0, "vnread", 0); 786 } 787 crit_exit(); 788 if ((bp->b_flags & B_ERROR) != 0) 789 error = EIO; 790 791 if (!error) { 792 if (size != count * PAGE_SIZE) 793 bzero((caddr_t) kva + size, PAGE_SIZE * count - size); 794 } 795 pmap_qremove(kva, count); 796 797 /* 798 * free the buffer header back to the swap buffer pool 799 */ 800 relpbuf(bp, &vnode_pbuf_freecnt); 801 802 for (i = 0, tfoff = foff; i < count; i++, tfoff = nextoff) { 803 vm_page_t mt; 804 805 nextoff = tfoff + PAGE_SIZE; 806 mt = m[i]; 807 808 if (nextoff <= vp->v_filesize) { 809 /* 810 * Read filled up entire page. 811 */ 812 mt->valid = VM_PAGE_BITS_ALL; 813 vm_page_undirty(mt); /* should be an assert? XXX */ 814 pmap_clear_modify(mt); 815 } else { 816 /* 817 * Read did not fill up entire page. Since this 818 * is getpages, the page may be mapped, so we have 819 * to zero the invalid portions of the page even 820 * though we aren't setting them valid. 821 * 822 * Currently we do not set the entire page valid, 823 * we just try to clear the piece that we couldn't 824 * read. 825 */ 826 vm_page_set_validclean(mt, 0, vp->v_filesize - tfoff); 827 /* handled by vm_fault now */ 828 /* vm_page_zero_invalid(mt, FALSE); */ 829 } 830 831 vm_page_flag_clear(mt, PG_ZERO); 832 if (i != reqpage) { 833 834 /* 835 * whether or not to leave the page activated is up in 836 * the air, but we should put the page on a page queue 837 * somewhere. (it already is in the object). Result: 838 * It appears that empirical results show that 839 * deactivating pages is best. 840 */ 841 842 /* 843 * just in case someone was asking for this page we 844 * now tell them that it is ok to use 845 */ 846 if (!error) { 847 if (mt->flags & PG_WANTED) 848 vm_page_activate(mt); 849 else 850 vm_page_deactivate(mt); 851 vm_page_wakeup(mt); 852 } else { 853 vnode_pager_freepage(mt); 854 } 855 } 856 } 857 if (error) { 858 printf("vnode_pager_getpages: I/O read error\n"); 859 } 860 return (error ? VM_PAGER_ERROR : VM_PAGER_OK); 861 } 862 863 /* 864 * EOPNOTSUPP is no longer legal. For local media VFS's that do not 865 * implement their own VOP_PUTPAGES, their VOP_PUTPAGES should call to 866 * vnode_pager_generic_putpages() to implement the previous behaviour. 867 * 868 * All other FS's should use the bypass to get to the local media 869 * backing vp's VOP_PUTPAGES. 870 */ 871 static void 872 vnode_pager_putpages(vm_object_t object, vm_page_t *m, int count, 873 boolean_t sync, int *rtvals) 874 { 875 int rtval; 876 struct vnode *vp; 877 int bytes = count * PAGE_SIZE; 878 879 /* 880 * Force synchronous operation if we are extremely low on memory 881 * to prevent a low-memory deadlock. VOP operations often need to 882 * allocate more memory to initiate the I/O ( i.e. do a BMAP 883 * operation ). The swapper handles the case by limiting the amount 884 * of asynchronous I/O, but that sort of solution doesn't scale well 885 * for the vnode pager without a lot of work. 886 * 887 * Also, the backing vnode's iodone routine may not wake the pageout 888 * daemon up. This should be probably be addressed XXX. 889 */ 890 891 if ((vmstats.v_free_count + vmstats.v_cache_count) < vmstats.v_pageout_free_min) 892 sync |= OBJPC_SYNC; 893 894 /* 895 * Call device-specific putpages function 896 */ 897 898 vp = object->handle; 899 rtval = VOP_PUTPAGES(vp, m, bytes, sync, rtvals, 0); 900 if (rtval == EOPNOTSUPP) { 901 printf("vnode_pager: *** WARNING *** stale FS putpages\n"); 902 rtval = vnode_pager_generic_putpages( vp, m, bytes, sync, rtvals); 903 } 904 } 905 906 907 /* 908 * This is now called from local media FS's to operate against their 909 * own vnodes if they fail to implement VOP_PUTPAGES. 910 * 911 * This is typically called indirectly via the pageout daemon and 912 * clustering has already typically occured, so in general we ask the 913 * underlying filesystem to write the data out asynchronously rather 914 * then delayed. 915 */ 916 int 917 vnode_pager_generic_putpages(struct vnode *vp, vm_page_t *m, int bytecount, 918 int flags, int *rtvals) 919 { 920 int i; 921 vm_object_t object; 922 int count; 923 924 int maxsize, ncount; 925 vm_ooffset_t poffset; 926 struct uio auio; 927 struct iovec aiov; 928 int error; 929 int ioflags; 930 931 object = vp->v_object; 932 count = bytecount / PAGE_SIZE; 933 934 for (i = 0; i < count; i++) 935 rtvals[i] = VM_PAGER_AGAIN; 936 937 if ((int) m[0]->pindex < 0) { 938 printf("vnode_pager_putpages: attempt to write meta-data!!! -- 0x%lx(%x)\n", 939 (long)m[0]->pindex, m[0]->dirty); 940 rtvals[0] = VM_PAGER_BAD; 941 return VM_PAGER_BAD; 942 } 943 944 maxsize = count * PAGE_SIZE; 945 ncount = count; 946 947 poffset = IDX_TO_OFF(m[0]->pindex); 948 949 /* 950 * If the page-aligned write is larger then the actual file we 951 * have to invalidate pages occuring beyond the file EOF. However, 952 * there is an edge case where a file may not be page-aligned where 953 * the last page is partially invalid. In this case the filesystem 954 * may not properly clear the dirty bits for the entire page (which 955 * could be VM_PAGE_BITS_ALL due to the page having been mmap()d). 956 * With the page locked we are free to fix-up the dirty bits here. 957 * 958 * We do not under any circumstances truncate the valid bits, as 959 * this will screw up bogus page replacement. 960 */ 961 if (maxsize + poffset > vp->v_filesize) { 962 if (vp->v_filesize > poffset) { 963 int pgoff; 964 965 maxsize = vp->v_filesize - poffset; 966 ncount = btoc(maxsize); 967 if ((pgoff = (int)maxsize & PAGE_MASK) != 0) { 968 vm_page_clear_dirty(m[ncount - 1], pgoff, 969 PAGE_SIZE - pgoff); 970 } 971 } else { 972 maxsize = 0; 973 ncount = 0; 974 } 975 if (ncount < count) { 976 for (i = ncount; i < count; i++) { 977 rtvals[i] = VM_PAGER_BAD; 978 } 979 } 980 } 981 982 /* 983 * pageouts are already clustered, use IO_ASYNC to force a bawrite() 984 * rather then a bdwrite() to prevent paging I/O from saturating 985 * the buffer cache. Dummy-up the sequential heuristic to cause 986 * large ranges to cluster. If neither IO_SYNC or IO_ASYNC is set, 987 * the system decides how to cluster. 988 */ 989 ioflags = IO_VMIO; 990 if (flags & (VM_PAGER_PUT_SYNC | VM_PAGER_PUT_INVAL)) 991 ioflags |= IO_SYNC; 992 else if ((flags & VM_PAGER_CLUSTER_OK) == 0) 993 ioflags |= IO_ASYNC; 994 ioflags |= (flags & VM_PAGER_PUT_INVAL) ? IO_INVAL: 0; 995 ioflags |= IO_SEQMAX << IO_SEQSHIFT; 996 997 aiov.iov_base = (caddr_t) 0; 998 aiov.iov_len = maxsize; 999 auio.uio_iov = &aiov; 1000 auio.uio_iovcnt = 1; 1001 auio.uio_offset = poffset; 1002 auio.uio_segflg = UIO_NOCOPY; 1003 auio.uio_rw = UIO_WRITE; 1004 auio.uio_resid = maxsize; 1005 auio.uio_td = NULL; 1006 error = VOP_WRITE(vp, &auio, ioflags, proc0.p_ucred); 1007 mycpu->gd_cnt.v_vnodeout++; 1008 mycpu->gd_cnt.v_vnodepgsout += ncount; 1009 1010 if (error) { 1011 printf("vnode_pager_putpages: I/O error %d\n", error); 1012 } 1013 if (auio.uio_resid) { 1014 printf("vnode_pager_putpages: residual I/O %d at %lu\n", 1015 auio.uio_resid, (u_long)m[0]->pindex); 1016 } 1017 for (i = 0; i < ncount; i++) { 1018 rtvals[i] = VM_PAGER_OK; 1019 } 1020 return rtvals[0]; 1021 } 1022 1023 struct vnode * 1024 vnode_pager_lock(vm_object_t object) 1025 { 1026 struct thread *td = curthread; /* XXX */ 1027 int error; 1028 1029 for (; object != NULL; object = object->backing_object) { 1030 if (object->type != OBJT_VNODE) 1031 continue; 1032 if (object->flags & OBJ_DEAD) 1033 return NULL; 1034 1035 for (;;) { 1036 struct vnode *vp = object->handle; 1037 error = vget(vp, LK_NOPAUSE | LK_SHARED | 1038 LK_RETRY | LK_CANRECURSE, td); 1039 if (error == 0) { 1040 if (object->handle != vp) { 1041 vput(vp); 1042 continue; 1043 } 1044 return (vp); 1045 } 1046 if ((object->flags & OBJ_DEAD) || 1047 (object->type != OBJT_VNODE)) { 1048 return NULL; 1049 } 1050 printf("vnode_pager_lock: vp %p error %d lockstatus %d, retrying\n", vp, error, lockstatus(&vp->v_lock, td)); 1051 tsleep(object->handle, 0, "vnpgrl", hz); 1052 } 1053 } 1054 return NULL; 1055 } 1056