1 /*- 2 * Copyright (c) 1993 3 * The Regents of the University of California. All rights reserved. 4 * Modifications/enhancements: 5 * Copyright (c) 1995 John S. Dyson. All rights reserved. 6 * Copyright (c) 2012-2013 Matthew Dillon. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. Neither the name of the University nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 */ 32 33 #include "opt_debug_cluster.h" 34 35 #include <sys/param.h> 36 #include <sys/systm.h> 37 #include <sys/kernel.h> 38 #include <sys/proc.h> 39 #include <sys/buf.h> 40 #include <sys/vnode.h> 41 #include <sys/malloc.h> 42 #include <sys/mount.h> 43 #include <sys/resourcevar.h> 44 #include <sys/vmmeter.h> 45 #include <vm/vm.h> 46 #include <vm/vm_object.h> 47 #include <vm/vm_page.h> 48 #include <sys/sysctl.h> 49 50 #include <sys/buf2.h> 51 #include <vm/vm_page2.h> 52 53 #include <machine/limits.h> 54 55 /* 56 * Cluster tracking cache - replaces the original vnode v_* fields which had 57 * limited utility and were not MP safe. 58 * 59 * The cluster tracking cache is a simple 4-way set-associative non-chained 60 * cache. It is capable of tracking up to four zones separated by 1MB or 61 * more per vnode. 62 * 63 * NOTE: We want this structure to be cache-line friendly so the iterator 64 * is embedded rather than in a separate array. 65 * 66 * NOTE: A cluster cache entry can become stale when a vnode is recycled. 67 * For now we treat the values as heuristical but also self-consistent. 68 * i.e. the values cannot be completely random and cannot be SMP unsafe 69 * or the cluster code might end-up clustering non-contiguous buffers 70 * at the wrong offsets. 71 */ 72 struct cluster_cache { 73 struct vnode *vp; 74 u_int locked; 75 off_t v_lastw; /* last write (write cluster) */ 76 off_t v_cstart; /* start block of cluster */ 77 off_t v_lasta; /* last allocation */ 78 u_int v_clen; /* length of current cluster */ 79 u_int iterator; 80 } __cachealign; 81 82 typedef struct cluster_cache cluster_cache_t; 83 84 #define CLUSTER_CACHE_SIZE 512 85 #define CLUSTER_CACHE_MASK (CLUSTER_CACHE_SIZE - 1) 86 87 #define CLUSTER_ZONE ((off_t)(1024 * 1024)) 88 89 cluster_cache_t cluster_array[CLUSTER_CACHE_SIZE]; 90 91 #if defined(CLUSTERDEBUG) 92 #include <sys/sysctl.h> 93 static int rcluster= 0; 94 SYSCTL_INT(_debug, OID_AUTO, rcluster, CTLFLAG_RW, &rcluster, 0, ""); 95 #endif 96 97 static MALLOC_DEFINE(M_SEGMENT, "cluster_save", "cluster_save buffer"); 98 99 static struct cluster_save * 100 cluster_collectbufs (cluster_cache_t *cc, struct vnode *vp, 101 struct buf *last_bp, int blksize); 102 static struct buf * 103 cluster_rbuild (struct vnode *vp, off_t filesize, off_t loffset, 104 off_t doffset, int blksize, int run, 105 struct buf *fbp); 106 static void cluster_callback (struct bio *); 107 static void cluster_setram (struct buf *); 108 static int cluster_wbuild(struct vnode *vp, struct buf **bpp, int blksize, 109 off_t start_loffset, int bytes); 110 111 static int write_behind = 1; 112 SYSCTL_INT(_vfs, OID_AUTO, write_behind, CTLFLAG_RW, &write_behind, 0, 113 "Cluster write-behind setting"); 114 static quad_t write_behind_minfilesize = 10 * 1024 * 1024; 115 SYSCTL_QUAD(_vfs, OID_AUTO, write_behind_minfilesize, CTLFLAG_RW, 116 &write_behind_minfilesize, 0, "Cluster write-behind setting"); 117 static int max_readahead = 2 * 1024 * 1024; 118 SYSCTL_INT(_vfs, OID_AUTO, max_readahead, CTLFLAG_RW, &max_readahead, 0, 119 "Limit in bytes for desired cluster read-ahead"); 120 121 extern vm_page_t bogus_page; 122 123 extern int cluster_pbuf_freecnt; 124 125 /* 126 * Acquire/release cluster cache (can return dummy entry) 127 */ 128 static 129 cluster_cache_t * 130 cluster_getcache(cluster_cache_t *dummy, struct vnode *vp, off_t loffset) 131 { 132 cluster_cache_t *cc; 133 size_t hv; 134 int i; 135 int xact; 136 137 hv = (size_t)(intptr_t)vp ^ (size_t)(intptr_t)vp / sizeof(*vp); 138 hv &= CLUSTER_CACHE_MASK & ~3; 139 cc = &cluster_array[hv]; 140 141 xact = -1; 142 for (i = 0; i < 4; ++i) { 143 if (cc[i].vp != vp) 144 continue; 145 if (((cc[i].v_cstart ^ loffset) & ~(CLUSTER_ZONE - 1)) == 0) { 146 xact = i; 147 break; 148 } 149 } 150 if (xact >= 0 && atomic_swap_int(&cc[xact].locked, 1) == 0) { 151 if (cc[xact].vp == vp && 152 ((cc[i].v_cstart ^ loffset) & ~(CLUSTER_ZONE - 1)) == 0) { 153 return(&cc[xact]); 154 } 155 atomic_swap_int(&cc[xact].locked, 0); 156 } 157 158 /* 159 * New entry. If we can't acquire the cache line then use the 160 * passed-in dummy element and reset all fields. 161 * 162 * When we are able to acquire the cache line we only clear the 163 * fields if the vp does not match. This allows us to multi-zone 164 * a vp and for excessive zones / partial clusters to be retired. 165 */ 166 i = cc->iterator++ & 3; 167 cc += i; 168 if (atomic_swap_int(&cc->locked, 1) != 0) { 169 cc = dummy; 170 cc->locked = 1; 171 cc->vp = NULL; 172 } 173 if (cc->vp != vp) { 174 cc->vp = vp; 175 cc->v_lasta = 0; 176 cc->v_clen = 0; 177 cc->v_cstart = 0; 178 cc->v_lastw = 0; 179 } 180 return(cc); 181 } 182 183 static 184 void 185 cluster_putcache(cluster_cache_t *cc) 186 { 187 atomic_swap_int(&cc->locked, 0); 188 } 189 190 /* 191 * This replaces bread(), providing a synchronous read of the requested 192 * buffer plus asynchronous read-ahead within the specified bounds. 193 * 194 * The caller may pre-populate *bpp if it already has the requested buffer 195 * in-hand, else must set *bpp to NULL. Note that the cluster_read() inline 196 * sets *bpp to NULL and then calls cluster_readx() for compatibility. 197 * 198 * filesize - read-ahead @ blksize will not cross this boundary 199 * loffset - loffset for returned *bpp 200 * blksize - blocksize for returned *bpp and read-ahead bps 201 * minreq - minimum (not a hard minimum) in bytes, typically reflects 202 * a higher level uio resid. 203 * maxreq - maximum (sequential heuristic) in bytes (highet typ ~2MB) 204 * bpp - return buffer (*bpp) for (loffset,blksize) 205 */ 206 int 207 cluster_readx(struct vnode *vp, off_t filesize, off_t loffset, 208 int blksize, size_t minreq, size_t maxreq, struct buf **bpp) 209 { 210 struct buf *bp, *rbp, *reqbp; 211 off_t origoffset; 212 off_t doffset; 213 int error; 214 int i; 215 int maxra; 216 int maxrbuild; 217 218 error = 0; 219 220 /* 221 * Calculate the desired read-ahead in blksize'd blocks (maxra). 222 * To do this we calculate maxreq. 223 * 224 * maxreq typically starts out as a sequential heuristic. If the 225 * high level uio/resid is bigger (minreq), we pop maxreq up to 226 * minreq. This represents the case where random I/O is being 227 * performed by the userland is issuing big read()'s. 228 * 229 * Then we limit maxreq to max_readahead to ensure it is a reasonable 230 * value. 231 * 232 * Finally we must ensure that (loffset + maxreq) does not cross the 233 * boundary (filesize) for the current blocksize. If we allowed it 234 * to cross we could end up with buffers past the boundary with the 235 * wrong block size (HAMMER large-data areas use mixed block sizes). 236 * minreq is also absolutely limited to filesize. 237 */ 238 if (maxreq < minreq) 239 maxreq = minreq; 240 /* minreq not used beyond this point */ 241 242 if (maxreq > max_readahead) { 243 maxreq = max_readahead; 244 if (maxreq > 16 * 1024 * 1024) 245 maxreq = 16 * 1024 * 1024; 246 } 247 if (maxreq < blksize) 248 maxreq = blksize; 249 if (loffset + maxreq > filesize) { 250 if (loffset > filesize) 251 maxreq = 0; 252 else 253 maxreq = filesize - loffset; 254 } 255 256 maxra = (int)(maxreq / blksize); 257 258 /* 259 * Get the requested block. 260 */ 261 if (*bpp) 262 reqbp = bp = *bpp; 263 else 264 *bpp = reqbp = bp = getblk(vp, loffset, blksize, 0, 0); 265 origoffset = loffset; 266 267 /* 268 * Calculate the maximum cluster size for a single I/O, used 269 * by cluster_rbuild(). 270 */ 271 maxrbuild = vmaxiosize(vp) / blksize; 272 273 /* 274 * if it is in the cache, then check to see if the reads have been 275 * sequential. If they have, then try some read-ahead, otherwise 276 * back-off on prospective read-aheads. 277 */ 278 if (bp->b_flags & B_CACHE) { 279 /* 280 * Not sequential, do not do any read-ahead 281 */ 282 if (maxra <= 1) 283 return 0; 284 285 /* 286 * No read-ahead mark, do not do any read-ahead 287 * yet. 288 */ 289 if ((bp->b_flags & B_RAM) == 0) 290 return 0; 291 292 /* 293 * We hit a read-ahead-mark, figure out how much read-ahead 294 * to do (maxra) and where to start (loffset). 295 * 296 * Shortcut the scan. Typically the way this works is that 297 * we've built up all the blocks inbetween except for the 298 * last in previous iterations, so if the second-to-last 299 * block is present we just skip ahead to it. 300 * 301 * This algorithm has O(1) cpu in the steady state no 302 * matter how large maxra is. 303 */ 304 bp->b_flags &= ~B_RAM; 305 306 if (findblk(vp, loffset + (maxra - 2) * blksize, FINDBLK_TEST)) 307 i = maxra - 1; 308 else 309 i = 1; 310 while (i < maxra) { 311 if (findblk(vp, loffset + i * blksize, 312 FINDBLK_TEST) == NULL) { 313 break; 314 } 315 ++i; 316 } 317 318 /* 319 * We got everything or everything is in the cache, no 320 * point continuing. 321 */ 322 if (i >= maxra) 323 return 0; 324 325 /* 326 * Calculate where to start the read-ahead and how much 327 * to do. Generally speaking we want to read-ahead by 328 * (maxra) when we've found a read-ahead mark. We do 329 * not want to reduce maxra here as it will cause 330 * successive read-ahead I/O's to be smaller and smaller. 331 * 332 * However, we have to make sure we don't break the 333 * filesize limitation for the clustered operation. 334 */ 335 loffset += i * blksize; 336 reqbp = bp = NULL; 337 338 if (loffset >= filesize) 339 return 0; 340 if (loffset + maxra * blksize > filesize) { 341 maxreq = filesize - loffset; 342 maxra = (int)(maxreq / blksize); 343 } 344 } else { 345 __debugvar off_t firstread = bp->b_loffset; 346 int nblks; 347 348 /* 349 * Set-up synchronous read for bp. 350 */ 351 bp->b_cmd = BUF_CMD_READ; 352 bp->b_bio1.bio_done = biodone_sync; 353 bp->b_bio1.bio_flags |= BIO_SYNC; 354 355 KASSERT(firstread != NOOFFSET, 356 ("cluster_read: no buffer offset")); 357 358 /* 359 * nblks is our cluster_rbuild request size, limited 360 * primarily by the device. 361 */ 362 if ((nblks = maxra) > maxrbuild) 363 nblks = maxrbuild; 364 365 if (nblks > 1) { 366 int burstbytes; 367 368 error = VOP_BMAP(vp, loffset, &doffset, 369 &burstbytes, NULL, BUF_CMD_READ); 370 if (error) 371 goto single_block_read; 372 if (nblks > burstbytes / blksize) 373 nblks = burstbytes / blksize; 374 if (doffset == NOOFFSET) 375 goto single_block_read; 376 if (nblks <= 1) 377 goto single_block_read; 378 379 bp = cluster_rbuild(vp, filesize, loffset, 380 doffset, blksize, nblks, bp); 381 loffset += bp->b_bufsize; 382 maxra -= bp->b_bufsize / blksize; 383 } else { 384 single_block_read: 385 /* 386 * If it isn't in the cache, then get a chunk from 387 * disk if sequential, otherwise just get the block. 388 */ 389 cluster_setram(bp); 390 loffset += blksize; 391 --maxra; 392 } 393 } 394 395 /* 396 * If B_CACHE was not set issue bp. bp will either be an 397 * asynchronous cluster buf or a synchronous single-buf. 398 * If it is a single buf it will be the same as reqbp. 399 * 400 * NOTE: Once an async cluster buf is issued bp becomes invalid. 401 */ 402 if (bp) { 403 #if defined(CLUSTERDEBUG) 404 if (rcluster) 405 kprintf("S(%012jx,%d,%d)\n", 406 (intmax_t)bp->b_loffset, bp->b_bcount, maxra); 407 #endif 408 if ((bp->b_flags & B_CLUSTER) == 0) 409 vfs_busy_pages(vp, bp); 410 bp->b_flags &= ~(B_ERROR|B_INVAL); 411 vn_strategy(vp, &bp->b_bio1); 412 error = 0; 413 /* bp invalid now */ 414 bp = NULL; 415 } 416 417 /* 418 * If we have been doing sequential I/O, then do some read-ahead. 419 * The code above us should have positioned us at the next likely 420 * offset. 421 * 422 * Only mess with buffers which we can immediately lock. HAMMER 423 * will do device-readahead irrespective of what the blocks 424 * represent. 425 */ 426 while (error == 0 && maxra > 0) { 427 int burstbytes; 428 int tmp_error; 429 int nblks; 430 431 rbp = getblk(vp, loffset, blksize, 432 GETBLK_SZMATCH|GETBLK_NOWAIT, 0); 433 if (rbp == NULL) 434 goto no_read_ahead; 435 if ((rbp->b_flags & B_CACHE)) { 436 bqrelse(rbp); 437 goto no_read_ahead; 438 } 439 440 /* 441 * An error from the read-ahead bmap has nothing to do 442 * with the caller's original request. 443 */ 444 tmp_error = VOP_BMAP(vp, loffset, &doffset, 445 &burstbytes, NULL, BUF_CMD_READ); 446 if (tmp_error || doffset == NOOFFSET) { 447 rbp->b_flags |= B_INVAL; 448 brelse(rbp); 449 rbp = NULL; 450 goto no_read_ahead; 451 } 452 if ((nblks = maxra) > maxrbuild) 453 nblks = maxrbuild; 454 if (nblks > burstbytes / blksize) 455 nblks = burstbytes / blksize; 456 457 /* 458 * rbp: async read 459 */ 460 rbp->b_cmd = BUF_CMD_READ; 461 /*rbp->b_flags |= B_AGE*/; 462 cluster_setram(rbp); 463 464 if (nblks > 1) { 465 rbp = cluster_rbuild(vp, filesize, loffset, 466 doffset, blksize, 467 nblks, rbp); 468 } else { 469 rbp->b_bio2.bio_offset = doffset; 470 } 471 472 rbp->b_flags &= ~(B_ERROR|B_INVAL); 473 474 if ((rbp->b_flags & B_CLUSTER) == 0) 475 vfs_busy_pages(vp, rbp); 476 BUF_KERNPROC(rbp); 477 loffset += rbp->b_bufsize; 478 maxra -= rbp->b_bufsize / blksize; 479 vn_strategy(vp, &rbp->b_bio1); 480 /* rbp invalid now */ 481 } 482 483 /* 484 * Wait for our original buffer to complete its I/O. reqbp will 485 * be NULL if the original buffer was B_CACHE. We are returning 486 * (*bpp) which is the same as reqbp when reqbp != NULL. 487 */ 488 no_read_ahead: 489 if (reqbp) { 490 KKASSERT(reqbp->b_bio1.bio_flags & BIO_SYNC); 491 error = biowait(&reqbp->b_bio1, "clurd"); 492 } 493 return (error); 494 } 495 496 /* 497 * This replaces breadcb(), providing an asynchronous read of the requested 498 * buffer with a callback, plus an asynchronous read-ahead within the 499 * specified bounds. 500 * 501 * The callback must check whether BIO_DONE is set in the bio and issue 502 * the bpdone(bp, 0) if it isn't. The callback is responsible for clearing 503 * BIO_DONE and disposing of the I/O (bqrelse()ing it). 504 * 505 * filesize - read-ahead @ blksize will not cross this boundary 506 * loffset - loffset for returned *bpp 507 * blksize - blocksize for returned *bpp and read-ahead bps 508 * minreq - minimum (not a hard minimum) in bytes, typically reflects 509 * a higher level uio resid. 510 * maxreq - maximum (sequential heuristic) in bytes (highet typ ~2MB) 511 * bpp - return buffer (*bpp) for (loffset,blksize) 512 */ 513 void 514 cluster_readcb(struct vnode *vp, off_t filesize, off_t loffset, 515 int blksize, size_t minreq, size_t maxreq, 516 void (*func)(struct bio *), void *arg) 517 { 518 struct buf *bp, *rbp, *reqbp; 519 off_t origoffset; 520 off_t doffset; 521 int i; 522 int maxra; 523 int maxrbuild; 524 525 /* 526 * Calculate the desired read-ahead in blksize'd blocks (maxra). 527 * To do this we calculate maxreq. 528 * 529 * maxreq typically starts out as a sequential heuristic. If the 530 * high level uio/resid is bigger (minreq), we pop maxreq up to 531 * minreq. This represents the case where random I/O is being 532 * performed by the userland is issuing big read()'s. 533 * 534 * Then we limit maxreq to max_readahead to ensure it is a reasonable 535 * value. 536 * 537 * Finally we must ensure that (loffset + maxreq) does not cross the 538 * boundary (filesize) for the current blocksize. If we allowed it 539 * to cross we could end up with buffers past the boundary with the 540 * wrong block size (HAMMER large-data areas use mixed block sizes). 541 * minreq is also absolutely limited to filesize. 542 */ 543 if (maxreq < minreq) 544 maxreq = minreq; 545 /* minreq not used beyond this point */ 546 547 if (maxreq > max_readahead) { 548 maxreq = max_readahead; 549 if (maxreq > 16 * 1024 * 1024) 550 maxreq = 16 * 1024 * 1024; 551 } 552 if (maxreq < blksize) 553 maxreq = blksize; 554 if (loffset + maxreq > filesize) { 555 if (loffset > filesize) 556 maxreq = 0; 557 else 558 maxreq = filesize - loffset; 559 } 560 561 maxra = (int)(maxreq / blksize); 562 563 /* 564 * Get the requested block. 565 */ 566 reqbp = bp = getblk(vp, loffset, blksize, 0, 0); 567 origoffset = loffset; 568 569 /* 570 * Calculate the maximum cluster size for a single I/O, used 571 * by cluster_rbuild(). 572 */ 573 maxrbuild = vmaxiosize(vp) / blksize; 574 575 /* 576 * if it is in the cache, then check to see if the reads have been 577 * sequential. If they have, then try some read-ahead, otherwise 578 * back-off on prospective read-aheads. 579 */ 580 if (bp->b_flags & B_CACHE) { 581 /* 582 * Setup for func() call whether we do read-ahead or not. 583 */ 584 bp->b_bio1.bio_caller_info1.ptr = arg; 585 bp->b_bio1.bio_flags |= BIO_DONE; 586 587 /* 588 * Not sequential, do not do any read-ahead 589 */ 590 if (maxra <= 1) 591 goto no_read_ahead; 592 593 /* 594 * No read-ahead mark, do not do any read-ahead 595 * yet. 596 */ 597 if ((bp->b_flags & B_RAM) == 0) 598 goto no_read_ahead; 599 bp->b_flags &= ~B_RAM; 600 601 /* 602 * We hit a read-ahead-mark, figure out how much read-ahead 603 * to do (maxra) and where to start (loffset). 604 * 605 * Shortcut the scan. Typically the way this works is that 606 * we've built up all the blocks inbetween except for the 607 * last in previous iterations, so if the second-to-last 608 * block is present we just skip ahead to it. 609 * 610 * This algorithm has O(1) cpu in the steady state no 611 * matter how large maxra is. 612 */ 613 if (findblk(vp, loffset + (maxra - 2) * blksize, FINDBLK_TEST)) 614 i = maxra - 1; 615 else 616 i = 1; 617 while (i < maxra) { 618 if (findblk(vp, loffset + i * blksize, 619 FINDBLK_TEST) == NULL) { 620 break; 621 } 622 ++i; 623 } 624 625 /* 626 * We got everything or everything is in the cache, no 627 * point continuing. 628 */ 629 if (i >= maxra) 630 goto no_read_ahead; 631 632 /* 633 * Calculate where to start the read-ahead and how much 634 * to do. Generally speaking we want to read-ahead by 635 * (maxra) when we've found a read-ahead mark. We do 636 * not want to reduce maxra here as it will cause 637 * successive read-ahead I/O's to be smaller and smaller. 638 * 639 * However, we have to make sure we don't break the 640 * filesize limitation for the clustered operation. 641 */ 642 loffset += i * blksize; 643 bp = NULL; 644 /* leave reqbp intact to force function callback */ 645 646 if (loffset >= filesize) 647 goto no_read_ahead; 648 if (loffset + maxra * blksize > filesize) { 649 maxreq = filesize - loffset; 650 maxra = (int)(maxreq / blksize); 651 } 652 } else { 653 __debugvar off_t firstread = bp->b_loffset; 654 int nblks; 655 int tmp_error; 656 657 /* 658 * Set-up synchronous read for bp. 659 */ 660 bp->b_flags &= ~(B_ERROR | B_EINTR | B_INVAL); 661 bp->b_cmd = BUF_CMD_READ; 662 bp->b_bio1.bio_done = func; 663 bp->b_bio1.bio_caller_info1.ptr = arg; 664 BUF_KERNPROC(bp); 665 reqbp = NULL; /* don't func() reqbp, it's running async */ 666 667 KASSERT(firstread != NOOFFSET, 668 ("cluster_read: no buffer offset")); 669 670 /* 671 * nblks is our cluster_rbuild request size, limited 672 * primarily by the device. 673 */ 674 if ((nblks = maxra) > maxrbuild) 675 nblks = maxrbuild; 676 677 if (nblks > 1) { 678 int burstbytes; 679 680 tmp_error = VOP_BMAP(vp, loffset, &doffset, 681 &burstbytes, NULL, BUF_CMD_READ); 682 if (tmp_error) 683 goto single_block_read; 684 if (nblks > burstbytes / blksize) 685 nblks = burstbytes / blksize; 686 if (doffset == NOOFFSET) 687 goto single_block_read; 688 if (nblks <= 1) 689 goto single_block_read; 690 691 bp = cluster_rbuild(vp, filesize, loffset, 692 doffset, blksize, nblks, bp); 693 loffset += bp->b_bufsize; 694 maxra -= bp->b_bufsize / blksize; 695 } else { 696 single_block_read: 697 /* 698 * If it isn't in the cache, then get a chunk from 699 * disk if sequential, otherwise just get the block. 700 */ 701 cluster_setram(bp); 702 loffset += blksize; 703 --maxra; 704 } 705 } 706 707 /* 708 * If bp != NULL then B_CACHE was *NOT* set and bp must be issued. 709 * bp will either be an asynchronous cluster buf or an asynchronous 710 * single-buf. 711 * 712 * NOTE: Once an async cluster buf is issued bp becomes invalid. 713 */ 714 if (bp) { 715 #if defined(CLUSTERDEBUG) 716 if (rcluster) 717 kprintf("S(%012jx,%d,%d)\n", 718 (intmax_t)bp->b_loffset, bp->b_bcount, maxra); 719 #endif 720 if ((bp->b_flags & B_CLUSTER) == 0) 721 vfs_busy_pages(vp, bp); 722 bp->b_flags &= ~(B_ERROR|B_INVAL); 723 vn_strategy(vp, &bp->b_bio1); 724 /* bp invalid now */ 725 bp = NULL; 726 } 727 728 /* 729 * If we have been doing sequential I/O, then do some read-ahead. 730 * The code above us should have positioned us at the next likely 731 * offset. 732 * 733 * Only mess with buffers which we can immediately lock. HAMMER 734 * will do device-readahead irrespective of what the blocks 735 * represent. 736 */ 737 while (maxra > 0) { 738 int burstbytes; 739 int tmp_error; 740 int nblks; 741 742 rbp = getblk(vp, loffset, blksize, 743 GETBLK_SZMATCH|GETBLK_NOWAIT, 0); 744 if (rbp == NULL) 745 goto no_read_ahead; 746 if ((rbp->b_flags & B_CACHE)) { 747 bqrelse(rbp); 748 goto no_read_ahead; 749 } 750 751 /* 752 * An error from the read-ahead bmap has nothing to do 753 * with the caller's original request. 754 */ 755 tmp_error = VOP_BMAP(vp, loffset, &doffset, 756 &burstbytes, NULL, BUF_CMD_READ); 757 if (tmp_error || doffset == NOOFFSET) { 758 rbp->b_flags |= B_INVAL; 759 brelse(rbp); 760 rbp = NULL; 761 goto no_read_ahead; 762 } 763 if ((nblks = maxra) > maxrbuild) 764 nblks = maxrbuild; 765 if (nblks > burstbytes / blksize) 766 nblks = burstbytes / blksize; 767 768 /* 769 * rbp: async read 770 */ 771 rbp->b_cmd = BUF_CMD_READ; 772 /*rbp->b_flags |= B_AGE*/; 773 cluster_setram(rbp); 774 775 if (nblks > 1) { 776 rbp = cluster_rbuild(vp, filesize, loffset, 777 doffset, blksize, 778 nblks, rbp); 779 } else { 780 rbp->b_bio2.bio_offset = doffset; 781 } 782 783 rbp->b_flags &= ~(B_ERROR|B_INVAL); 784 785 if ((rbp->b_flags & B_CLUSTER) == 0) 786 vfs_busy_pages(vp, rbp); 787 BUF_KERNPROC(rbp); 788 loffset += rbp->b_bufsize; 789 maxra -= rbp->b_bufsize / blksize; 790 vn_strategy(vp, &rbp->b_bio1); 791 /* rbp invalid now */ 792 } 793 794 /* 795 * If reqbp is non-NULL it had B_CACHE set and we issue the 796 * function callback synchronously. 797 * 798 * Note that we may start additional asynchronous I/O before doing 799 * the func() callback for the B_CACHE case 800 */ 801 no_read_ahead: 802 if (reqbp) 803 func(&reqbp->b_bio1); 804 } 805 806 /* 807 * If blocks are contiguous on disk, use this to provide clustered 808 * read ahead. We will read as many blocks as possible sequentially 809 * and then parcel them up into logical blocks in the buffer hash table. 810 * 811 * This function either returns a cluster buf or it returns fbp. fbp is 812 * already expected to be set up as a synchronous or asynchronous request. 813 * 814 * If a cluster buf is returned it will always be async. 815 */ 816 static struct buf * 817 cluster_rbuild(struct vnode *vp, off_t filesize, off_t loffset, off_t doffset, 818 int blksize, int run, struct buf *fbp) 819 { 820 struct buf *bp, *tbp; 821 off_t boffset; 822 int i, j; 823 int maxiosize = vmaxiosize(vp); 824 825 /* 826 * avoid a division 827 */ 828 while (loffset + run * blksize > filesize) { 829 --run; 830 } 831 832 tbp = fbp; 833 tbp->b_bio2.bio_offset = doffset; 834 if((tbp->b_flags & B_MALLOC) || 835 ((tbp->b_flags & B_VMIO) == 0) || (run <= 1)) { 836 return tbp; 837 } 838 839 bp = trypbuf_kva(&cluster_pbuf_freecnt); 840 if (bp == NULL) { 841 return tbp; 842 } 843 844 /* 845 * We are synthesizing a buffer out of vm_page_t's, but 846 * if the block size is not page aligned then the starting 847 * address may not be either. Inherit the b_data offset 848 * from the original buffer. 849 */ 850 bp->b_data = (char *)((vm_offset_t)bp->b_data | 851 ((vm_offset_t)tbp->b_data & PAGE_MASK)); 852 bp->b_flags |= B_CLUSTER | B_VMIO; 853 bp->b_cmd = BUF_CMD_READ; 854 bp->b_bio1.bio_done = cluster_callback; /* default to async */ 855 bp->b_bio1.bio_caller_info1.cluster_head = NULL; 856 bp->b_bio1.bio_caller_info2.cluster_tail = NULL; 857 bp->b_loffset = loffset; 858 bp->b_bio2.bio_offset = doffset; 859 KASSERT(bp->b_loffset != NOOFFSET, 860 ("cluster_rbuild: no buffer offset")); 861 862 bp->b_bcount = 0; 863 bp->b_bufsize = 0; 864 bp->b_xio.xio_npages = 0; 865 866 for (boffset = doffset, i = 0; i < run; ++i, boffset += blksize) { 867 if (i) { 868 if ((bp->b_xio.xio_npages * PAGE_SIZE) + 869 round_page(blksize) > maxiosize) { 870 break; 871 } 872 873 /* 874 * Shortcut some checks and try to avoid buffers that 875 * would block in the lock. The same checks have to 876 * be made again after we officially get the buffer. 877 */ 878 tbp = getblk(vp, loffset + i * blksize, blksize, 879 GETBLK_SZMATCH|GETBLK_NOWAIT, 0); 880 if (tbp == NULL) 881 break; 882 for (j = 0; j < tbp->b_xio.xio_npages; j++) { 883 if (tbp->b_xio.xio_pages[j]->valid) 884 break; 885 } 886 if (j != tbp->b_xio.xio_npages) { 887 bqrelse(tbp); 888 break; 889 } 890 891 /* 892 * Stop scanning if the buffer is fuly valid 893 * (marked B_CACHE), or locked (may be doing a 894 * background write), or if the buffer is not 895 * VMIO backed. The clustering code can only deal 896 * with VMIO-backed buffers. 897 */ 898 if ((tbp->b_flags & (B_CACHE|B_LOCKED)) || 899 (tbp->b_flags & B_VMIO) == 0 || 900 (LIST_FIRST(&tbp->b_dep) != NULL && 901 buf_checkread(tbp)) 902 ) { 903 bqrelse(tbp); 904 break; 905 } 906 907 /* 908 * The buffer must be completely invalid in order to 909 * take part in the cluster. If it is partially valid 910 * then we stop. 911 */ 912 for (j = 0;j < tbp->b_xio.xio_npages; j++) { 913 if (tbp->b_xio.xio_pages[j]->valid) 914 break; 915 } 916 if (j != tbp->b_xio.xio_npages) { 917 bqrelse(tbp); 918 break; 919 } 920 921 /* 922 * Set a read-ahead mark as appropriate. Always 923 * set the read-ahead mark at (run - 1). It is 924 * unclear why we were also setting it at i == 1. 925 */ 926 if (/*i == 1 ||*/ i == (run - 1)) 927 cluster_setram(tbp); 928 929 /* 930 * Depress the priority of buffers not explicitly 931 * requested. 932 */ 933 /* tbp->b_flags |= B_AGE; */ 934 935 /* 936 * Set the block number if it isn't set, otherwise 937 * if it is make sure it matches the block number we 938 * expect. 939 */ 940 if (tbp->b_bio2.bio_offset == NOOFFSET) { 941 tbp->b_bio2.bio_offset = boffset; 942 } else if (tbp->b_bio2.bio_offset != boffset) { 943 brelse(tbp); 944 break; 945 } 946 } 947 948 /* 949 * The passed-in tbp (i == 0) will already be set up for 950 * async or sync operation. All other tbp's acquire in 951 * our loop are set up for async operation. 952 */ 953 tbp->b_cmd = BUF_CMD_READ; 954 BUF_KERNPROC(tbp); 955 cluster_append(&bp->b_bio1, tbp); 956 for (j = 0; j < tbp->b_xio.xio_npages; ++j) { 957 vm_page_t m; 958 959 m = tbp->b_xio.xio_pages[j]; 960 vm_page_busy_wait(m, FALSE, "clurpg"); 961 vm_page_io_start(m); 962 vm_page_wakeup(m); 963 vm_object_pip_add(m->object, 1); 964 if ((bp->b_xio.xio_npages == 0) || 965 (bp->b_xio.xio_pages[bp->b_xio.xio_npages-1] != m)) { 966 bp->b_xio.xio_pages[bp->b_xio.xio_npages] = m; 967 bp->b_xio.xio_npages++; 968 } 969 if ((m->valid & VM_PAGE_BITS_ALL) == VM_PAGE_BITS_ALL) 970 tbp->b_xio.xio_pages[j] = bogus_page; 971 } 972 /* 973 * XXX shouldn't this be += size for both, like in 974 * cluster_wbuild()? 975 * 976 * Don't inherit tbp->b_bufsize as it may be larger due to 977 * a non-page-aligned size. Instead just aggregate using 978 * 'size'. 979 */ 980 if (tbp->b_bcount != blksize) 981 kprintf("warning: tbp->b_bcount wrong %d vs %d\n", tbp->b_bcount, blksize); 982 if (tbp->b_bufsize != blksize) 983 kprintf("warning: tbp->b_bufsize wrong %d vs %d\n", tbp->b_bufsize, blksize); 984 bp->b_bcount += blksize; 985 bp->b_bufsize += blksize; 986 } 987 988 /* 989 * Fully valid pages in the cluster are already good and do not need 990 * to be re-read from disk. Replace the page with bogus_page 991 */ 992 for (j = 0; j < bp->b_xio.xio_npages; j++) { 993 if ((bp->b_xio.xio_pages[j]->valid & VM_PAGE_BITS_ALL) == 994 VM_PAGE_BITS_ALL) { 995 bp->b_xio.xio_pages[j] = bogus_page; 996 } 997 } 998 if (bp->b_bufsize > bp->b_kvasize) { 999 panic("cluster_rbuild: b_bufsize(%d) > b_kvasize(%d)", 1000 bp->b_bufsize, bp->b_kvasize); 1001 } 1002 pmap_qenter(trunc_page((vm_offset_t) bp->b_data), 1003 (vm_page_t *)bp->b_xio.xio_pages, bp->b_xio.xio_npages); 1004 BUF_KERNPROC(bp); 1005 return (bp); 1006 } 1007 1008 /* 1009 * Cleanup after a clustered read or write. 1010 * This is complicated by the fact that any of the buffers might have 1011 * extra memory (if there were no empty buffer headers at allocbuf time) 1012 * that we will need to shift around. 1013 * 1014 * The returned bio is &bp->b_bio1 1015 */ 1016 static void 1017 cluster_callback(struct bio *bio) 1018 { 1019 struct buf *bp = bio->bio_buf; 1020 struct buf *tbp; 1021 int error = 0; 1022 1023 /* 1024 * Must propogate errors to all the components. A short read (EOF) 1025 * is a critical error. 1026 */ 1027 if (bp->b_flags & B_ERROR) { 1028 error = bp->b_error; 1029 } else if (bp->b_bcount != bp->b_bufsize) { 1030 panic("cluster_callback: unexpected EOF on cluster %p!", bio); 1031 } 1032 1033 pmap_qremove(trunc_page((vm_offset_t) bp->b_data), 1034 bp->b_xio.xio_npages); 1035 /* 1036 * Move memory from the large cluster buffer into the component 1037 * buffers and mark IO as done on these. Since the memory map 1038 * is the same, no actual copying is required. 1039 */ 1040 while ((tbp = bio->bio_caller_info1.cluster_head) != NULL) { 1041 bio->bio_caller_info1.cluster_head = tbp->b_cluster_next; 1042 if (error) { 1043 tbp->b_flags |= B_ERROR | B_IODEBUG; 1044 tbp->b_error = error; 1045 } else { 1046 tbp->b_dirtyoff = tbp->b_dirtyend = 0; 1047 tbp->b_flags &= ~(B_ERROR|B_INVAL); 1048 tbp->b_flags |= B_IODEBUG; 1049 /* 1050 * XXX the bdwrite()/bqrelse() issued during 1051 * cluster building clears B_RELBUF (see bqrelse() 1052 * comment). If direct I/O was specified, we have 1053 * to restore it here to allow the buffer and VM 1054 * to be freed. 1055 */ 1056 if (tbp->b_flags & B_DIRECT) 1057 tbp->b_flags |= B_RELBUF; 1058 1059 /* 1060 * XXX I think biodone() below will do this, but do 1061 * it here anyway for consistency. 1062 */ 1063 if (tbp->b_cmd == BUF_CMD_WRITE) 1064 bundirty(tbp); 1065 } 1066 biodone(&tbp->b_bio1); 1067 } 1068 relpbuf(bp, &cluster_pbuf_freecnt); 1069 } 1070 1071 /* 1072 * Implement modified write build for cluster. 1073 * 1074 * write_behind = 0 write behind disabled 1075 * write_behind = 1 write behind normal (default) 1076 * write_behind = 2 write behind backed-off 1077 * 1078 * In addition, write_behind is only activated for files that have 1079 * grown past a certain size (default 10MB). Otherwise temporary files 1080 * wind up generating a lot of unnecessary disk I/O. 1081 */ 1082 static __inline int 1083 cluster_wbuild_wb(struct vnode *vp, int blksize, off_t start_loffset, int len) 1084 { 1085 int r = 0; 1086 1087 switch(write_behind) { 1088 case 2: 1089 if (start_loffset < len) 1090 break; 1091 start_loffset -= len; 1092 /* fall through */ 1093 case 1: 1094 if (vp->v_filesize >= write_behind_minfilesize) { 1095 r = cluster_wbuild(vp, NULL, blksize, 1096 start_loffset, len); 1097 } 1098 /* fall through */ 1099 default: 1100 /* fall through */ 1101 break; 1102 } 1103 return(r); 1104 } 1105 1106 /* 1107 * Do clustered write for FFS. 1108 * 1109 * Three cases: 1110 * 1. Write is not sequential (write asynchronously) 1111 * Write is sequential: 1112 * 2. beginning of cluster - begin cluster 1113 * 3. middle of a cluster - add to cluster 1114 * 4. end of a cluster - asynchronously write cluster 1115 * 1116 * WARNING! vnode fields are not locked and must ONLY be used heuristically. 1117 */ 1118 void 1119 cluster_write(struct buf *bp, off_t filesize, int blksize, int seqcount) 1120 { 1121 struct vnode *vp; 1122 off_t loffset; 1123 int maxclen, cursize; 1124 int async; 1125 cluster_cache_t dummy; 1126 cluster_cache_t *cc; 1127 1128 vp = bp->b_vp; 1129 if (vp->v_type == VREG) 1130 async = vp->v_mount->mnt_flag & MNT_ASYNC; 1131 else 1132 async = 0; 1133 loffset = bp->b_loffset; 1134 KASSERT(bp->b_loffset != NOOFFSET, 1135 ("cluster_write: no buffer offset")); 1136 1137 cc = cluster_getcache(&dummy, vp, loffset); 1138 1139 /* 1140 * Initialize vnode to beginning of file. 1141 */ 1142 if (loffset == 0) 1143 cc->v_lasta = cc->v_clen = cc->v_cstart = cc->v_lastw = 0; 1144 1145 if (cc->v_clen == 0 || loffset != cc->v_lastw + blksize || 1146 bp->b_bio2.bio_offset == NOOFFSET || 1147 (bp->b_bio2.bio_offset != cc->v_lasta + blksize)) { 1148 maxclen = vmaxiosize(vp); 1149 if (cc->v_clen != 0) { 1150 /* 1151 * Next block is not sequential. 1152 * 1153 * If we are not writing at end of file, the process 1154 * seeked to another point in the file since its last 1155 * write, or we have reached our maximum cluster size, 1156 * then push the previous cluster. Otherwise try 1157 * reallocating to make it sequential. 1158 * 1159 * Change to algorithm: only push previous cluster if 1160 * it was sequential from the point of view of the 1161 * seqcount heuristic, otherwise leave the buffer 1162 * intact so we can potentially optimize the I/O 1163 * later on in the buf_daemon or update daemon 1164 * flush. 1165 */ 1166 cursize = cc->v_lastw - cc->v_cstart + blksize; 1167 if (bp->b_loffset + blksize < filesize || 1168 loffset != cc->v_lastw + blksize || 1169 cc->v_clen <= cursize) { 1170 if (!async && seqcount > 0) { 1171 cluster_wbuild_wb(vp, blksize, 1172 cc->v_cstart, cursize); 1173 } 1174 } else { 1175 struct buf **bpp, **endbp; 1176 struct cluster_save *buflist; 1177 1178 buflist = cluster_collectbufs(cc, vp, 1179 bp, blksize); 1180 endbp = &buflist->bs_children 1181 [buflist->bs_nchildren - 1]; 1182 if (VOP_REALLOCBLKS(vp, buflist)) { 1183 /* 1184 * Failed, push the previous cluster 1185 * if *really* writing sequentially 1186 * in the logical file (seqcount > 1), 1187 * otherwise delay it in the hopes that 1188 * the low level disk driver can 1189 * optimize the write ordering. 1190 * 1191 * NOTE: We do not brelse the last 1192 * element which is bp, and we 1193 * do not return here. 1194 */ 1195 for (bpp = buflist->bs_children; 1196 bpp < endbp; bpp++) 1197 brelse(*bpp); 1198 kfree(buflist, M_SEGMENT); 1199 if (seqcount > 1) { 1200 cluster_wbuild_wb(vp, 1201 blksize, cc->v_cstart, 1202 cursize); 1203 } 1204 } else { 1205 /* 1206 * Succeeded, keep building cluster. 1207 */ 1208 for (bpp = buflist->bs_children; 1209 bpp <= endbp; bpp++) 1210 bdwrite(*bpp); 1211 kfree(buflist, M_SEGMENT); 1212 cc->v_lastw = loffset; 1213 cc->v_lasta = bp->b_bio2.bio_offset; 1214 cluster_putcache(cc); 1215 return; 1216 } 1217 } 1218 } 1219 /* 1220 * Consider beginning a cluster. If at end of file, make 1221 * cluster as large as possible, otherwise find size of 1222 * existing cluster. 1223 */ 1224 if ((vp->v_type == VREG) && 1225 bp->b_loffset + blksize < filesize && 1226 (bp->b_bio2.bio_offset == NOOFFSET) && 1227 (VOP_BMAP(vp, loffset, &bp->b_bio2.bio_offset, &maxclen, NULL, BUF_CMD_WRITE) || 1228 bp->b_bio2.bio_offset == NOOFFSET)) { 1229 bdwrite(bp); 1230 cc->v_clen = 0; 1231 cc->v_lasta = bp->b_bio2.bio_offset; 1232 cc->v_cstart = loffset + blksize; 1233 cc->v_lastw = loffset; 1234 cluster_putcache(cc); 1235 return; 1236 } 1237 if (maxclen > blksize) 1238 cc->v_clen = maxclen - blksize; 1239 else 1240 cc->v_clen = 0; 1241 if (!async && cc->v_clen == 0) { /* I/O not contiguous */ 1242 cc->v_cstart = loffset + blksize; 1243 bdwrite(bp); 1244 } else { /* Wait for rest of cluster */ 1245 cc->v_cstart = loffset; 1246 bdwrite(bp); 1247 } 1248 } else if (loffset == cc->v_cstart + cc->v_clen) { 1249 /* 1250 * At end of cluster, write it out if seqcount tells us we 1251 * are operating sequentially, otherwise let the buf or 1252 * update daemon handle it. 1253 */ 1254 bdwrite(bp); 1255 if (seqcount > 1) 1256 cluster_wbuild_wb(vp, blksize, cc->v_cstart, 1257 cc->v_clen + blksize); 1258 cc->v_clen = 0; 1259 cc->v_cstart = loffset + blksize; 1260 } else if (vm_page_count_severe() && 1261 bp->b_loffset + blksize < filesize) { 1262 /* 1263 * We are low on memory, get it going NOW. However, do not 1264 * try to push out a partial block at the end of the file 1265 * as this could lead to extremely non-optimal write activity. 1266 */ 1267 bawrite(bp); 1268 } else { 1269 /* 1270 * In the middle of a cluster, so just delay the I/O for now. 1271 */ 1272 bdwrite(bp); 1273 } 1274 cc->v_lastw = loffset; 1275 cc->v_lasta = bp->b_bio2.bio_offset; 1276 cluster_putcache(cc); 1277 } 1278 1279 /* 1280 * This is the clustered version of bawrite(). It works similarly to 1281 * cluster_write() except I/O on the buffer is guaranteed to occur. 1282 */ 1283 int 1284 cluster_awrite(struct buf *bp) 1285 { 1286 int total; 1287 1288 /* 1289 * Don't bother if it isn't clusterable. 1290 */ 1291 if ((bp->b_flags & B_CLUSTEROK) == 0 || 1292 bp->b_vp == NULL || 1293 (bp->b_vp->v_flag & VOBJBUF) == 0) { 1294 total = bp->b_bufsize; 1295 bawrite(bp); 1296 return (total); 1297 } 1298 1299 total = cluster_wbuild(bp->b_vp, &bp, bp->b_bufsize, 1300 bp->b_loffset, vmaxiosize(bp->b_vp)); 1301 if (bp) 1302 bawrite(bp); 1303 1304 return total; 1305 } 1306 1307 /* 1308 * This is an awful lot like cluster_rbuild...wish they could be combined. 1309 * The last lbn argument is the current block on which I/O is being 1310 * performed. Check to see that it doesn't fall in the middle of 1311 * the current block (if last_bp == NULL). 1312 * 1313 * cluster_wbuild() normally does not guarantee anything. If bpp is 1314 * non-NULL and cluster_wbuild() is able to incorporate it into the 1315 * I/O it will set *bpp to NULL, otherwise it will leave it alone and 1316 * the caller must dispose of *bpp. 1317 */ 1318 static int 1319 cluster_wbuild(struct vnode *vp, struct buf **bpp, 1320 int blksize, off_t start_loffset, int bytes) 1321 { 1322 struct buf *bp, *tbp; 1323 int i, j; 1324 int totalwritten = 0; 1325 int must_initiate; 1326 int maxiosize = vmaxiosize(vp); 1327 1328 while (bytes > 0) { 1329 /* 1330 * If the buffer matches the passed locked & removed buffer 1331 * we used the passed buffer (which might not be B_DELWRI). 1332 * 1333 * Otherwise locate the buffer and determine if it is 1334 * compatible. 1335 */ 1336 if (bpp && (*bpp)->b_loffset == start_loffset) { 1337 tbp = *bpp; 1338 *bpp = NULL; 1339 bpp = NULL; 1340 } else { 1341 tbp = findblk(vp, start_loffset, FINDBLK_NBLOCK); 1342 if (tbp == NULL || 1343 (tbp->b_flags & (B_LOCKED | B_INVAL | B_DELWRI)) != 1344 B_DELWRI || 1345 (LIST_FIRST(&tbp->b_dep) && buf_checkwrite(tbp))) { 1346 if (tbp) 1347 BUF_UNLOCK(tbp); 1348 start_loffset += blksize; 1349 bytes -= blksize; 1350 continue; 1351 } 1352 bremfree(tbp); 1353 } 1354 KKASSERT(tbp->b_cmd == BUF_CMD_DONE); 1355 1356 /* 1357 * Extra memory in the buffer, punt on this buffer. 1358 * XXX we could handle this in most cases, but we would 1359 * have to push the extra memory down to after our max 1360 * possible cluster size and then potentially pull it back 1361 * up if the cluster was terminated prematurely--too much 1362 * hassle. 1363 */ 1364 if (((tbp->b_flags & (B_CLUSTEROK|B_MALLOC)) != B_CLUSTEROK) || 1365 (tbp->b_bcount != tbp->b_bufsize) || 1366 (tbp->b_bcount != blksize) || 1367 (bytes == blksize) || 1368 ((bp = getpbuf_kva(&cluster_pbuf_freecnt)) == NULL)) { 1369 totalwritten += tbp->b_bufsize; 1370 bawrite(tbp); 1371 start_loffset += blksize; 1372 bytes -= blksize; 1373 continue; 1374 } 1375 1376 /* 1377 * Set up the pbuf. Track our append point with b_bcount 1378 * and b_bufsize. b_bufsize is not used by the device but 1379 * our caller uses it to loop clusters and we use it to 1380 * detect a premature EOF on the block device. 1381 */ 1382 bp->b_bcount = 0; 1383 bp->b_bufsize = 0; 1384 bp->b_xio.xio_npages = 0; 1385 bp->b_loffset = tbp->b_loffset; 1386 bp->b_bio2.bio_offset = tbp->b_bio2.bio_offset; 1387 1388 /* 1389 * We are synthesizing a buffer out of vm_page_t's, but 1390 * if the block size is not page aligned then the starting 1391 * address may not be either. Inherit the b_data offset 1392 * from the original buffer. 1393 */ 1394 bp->b_data = (char *)((vm_offset_t)bp->b_data | 1395 ((vm_offset_t)tbp->b_data & PAGE_MASK)); 1396 bp->b_flags &= ~B_ERROR; 1397 bp->b_flags |= B_CLUSTER | B_BNOCLIP | 1398 (tbp->b_flags & (B_VMIO | B_NEEDCOMMIT)); 1399 bp->b_bio1.bio_caller_info1.cluster_head = NULL; 1400 bp->b_bio1.bio_caller_info2.cluster_tail = NULL; 1401 1402 /* 1403 * From this location in the file, scan forward to see 1404 * if there are buffers with adjacent data that need to 1405 * be written as well. 1406 * 1407 * IO *must* be initiated on index 0 at this point 1408 * (particularly when called from cluster_awrite()). 1409 */ 1410 for (i = 0; i < bytes; (i += blksize), (start_loffset += blksize)) { 1411 if (i == 0) { 1412 must_initiate = 1; 1413 } else { 1414 /* 1415 * Not first buffer. 1416 */ 1417 must_initiate = 0; 1418 tbp = findblk(vp, start_loffset, 1419 FINDBLK_NBLOCK); 1420 /* 1421 * Buffer not found or could not be locked 1422 * non-blocking. 1423 */ 1424 if (tbp == NULL) 1425 break; 1426 1427 /* 1428 * If it IS in core, but has different 1429 * characteristics, then don't cluster 1430 * with it. 1431 */ 1432 if ((tbp->b_flags & (B_VMIO | B_CLUSTEROK | 1433 B_INVAL | B_DELWRI | B_NEEDCOMMIT)) 1434 != (B_DELWRI | B_CLUSTEROK | 1435 (bp->b_flags & (B_VMIO | B_NEEDCOMMIT))) || 1436 (tbp->b_flags & B_LOCKED) 1437 ) { 1438 BUF_UNLOCK(tbp); 1439 break; 1440 } 1441 1442 /* 1443 * Check that the combined cluster 1444 * would make sense with regard to pages 1445 * and would not be too large 1446 * 1447 * WARNING! buf_checkwrite() must be the last 1448 * check made. If it returns 0 then 1449 * we must initiate the I/O. 1450 */ 1451 if ((tbp->b_bcount != blksize) || 1452 ((bp->b_bio2.bio_offset + i) != 1453 tbp->b_bio2.bio_offset) || 1454 ((tbp->b_xio.xio_npages + bp->b_xio.xio_npages) > 1455 (maxiosize / PAGE_SIZE)) || 1456 (LIST_FIRST(&tbp->b_dep) && 1457 buf_checkwrite(tbp)) 1458 ) { 1459 BUF_UNLOCK(tbp); 1460 break; 1461 } 1462 if (LIST_FIRST(&tbp->b_dep)) 1463 must_initiate = 1; 1464 /* 1465 * Ok, it's passed all the tests, 1466 * so remove it from the free list 1467 * and mark it busy. We will use it. 1468 */ 1469 bremfree(tbp); 1470 KKASSERT(tbp->b_cmd == BUF_CMD_DONE); 1471 } 1472 1473 /* 1474 * If the IO is via the VM then we do some 1475 * special VM hackery (yuck). Since the buffer's 1476 * block size may not be page-aligned it is possible 1477 * for a page to be shared between two buffers. We 1478 * have to get rid of the duplication when building 1479 * the cluster. 1480 */ 1481 if (tbp->b_flags & B_VMIO) { 1482 vm_page_t m; 1483 1484 /* 1485 * Try to avoid deadlocks with the VM system. 1486 * However, we cannot abort the I/O if 1487 * must_initiate is non-zero. 1488 */ 1489 if (must_initiate == 0) { 1490 for (j = 0; 1491 j < tbp->b_xio.xio_npages; 1492 ++j) { 1493 m = tbp->b_xio.xio_pages[j]; 1494 if (m->flags & PG_BUSY) { 1495 bqrelse(tbp); 1496 goto finishcluster; 1497 } 1498 } 1499 } 1500 1501 for (j = 0; j < tbp->b_xio.xio_npages; ++j) { 1502 m = tbp->b_xio.xio_pages[j]; 1503 vm_page_busy_wait(m, FALSE, "clurpg"); 1504 vm_page_io_start(m); 1505 vm_page_wakeup(m); 1506 vm_object_pip_add(m->object, 1); 1507 if ((bp->b_xio.xio_npages == 0) || 1508 (bp->b_xio.xio_pages[bp->b_xio.xio_npages - 1] != m)) { 1509 bp->b_xio.xio_pages[bp->b_xio.xio_npages] = m; 1510 bp->b_xio.xio_npages++; 1511 } 1512 } 1513 } 1514 bp->b_bcount += blksize; 1515 bp->b_bufsize += blksize; 1516 1517 /* 1518 * NOTE: see bwrite/bawrite code for why we no longer 1519 * undirty tbp here. 1520 * 1521 * bundirty(tbp); REMOVED 1522 */ 1523 tbp->b_flags &= ~B_ERROR; 1524 tbp->b_cmd = BUF_CMD_WRITE; 1525 BUF_KERNPROC(tbp); 1526 cluster_append(&bp->b_bio1, tbp); 1527 1528 /* 1529 * check for latent dependencies to be handled 1530 */ 1531 if (LIST_FIRST(&tbp->b_dep) != NULL) 1532 buf_start(tbp); 1533 } 1534 finishcluster: 1535 pmap_qenter(trunc_page((vm_offset_t)bp->b_data), 1536 (vm_page_t *)bp->b_xio.xio_pages, 1537 bp->b_xio.xio_npages); 1538 if (bp->b_bufsize > bp->b_kvasize) { 1539 panic("cluster_wbuild: b_bufsize(%d) " 1540 "> b_kvasize(%d)\n", 1541 bp->b_bufsize, bp->b_kvasize); 1542 } 1543 totalwritten += bp->b_bufsize; 1544 bp->b_dirtyoff = 0; 1545 bp->b_dirtyend = bp->b_bufsize; 1546 bp->b_bio1.bio_done = cluster_callback; 1547 bp->b_cmd = BUF_CMD_WRITE; 1548 1549 vfs_busy_pages(vp, bp); 1550 bsetrunningbufspace(bp, bp->b_bufsize); 1551 BUF_KERNPROC(bp); 1552 vn_strategy(vp, &bp->b_bio1); 1553 1554 bytes -= i; 1555 } 1556 return totalwritten; 1557 } 1558 1559 /* 1560 * Collect together all the buffers in a cluster, plus add one 1561 * additional buffer passed-in. 1562 * 1563 * Only pre-existing buffers whos block size matches blksize are collected. 1564 * (this is primarily because HAMMER1 uses varying block sizes and we don't 1565 * want to override its choices). 1566 * 1567 * This code will not try to collect buffers that it cannot lock, otherwise 1568 * it might deadlock against SMP-friendly filesystems. 1569 */ 1570 static struct cluster_save * 1571 cluster_collectbufs(cluster_cache_t *cc, struct vnode *vp, 1572 struct buf *last_bp, int blksize) 1573 { 1574 struct cluster_save *buflist; 1575 struct buf *bp; 1576 off_t loffset; 1577 int i, len; 1578 int j; 1579 int k; 1580 1581 len = (int)(cc->v_lastw - cc->v_cstart + blksize) / blksize; 1582 KKASSERT(len > 0); 1583 buflist = kmalloc(sizeof(struct buf *) * (len + 1) + sizeof(*buflist), 1584 M_SEGMENT, M_WAITOK); 1585 buflist->bs_nchildren = 0; 1586 buflist->bs_children = (struct buf **) (buflist + 1); 1587 for (loffset = cc->v_cstart, i = 0, j = 0; 1588 i < len; 1589 (loffset += blksize), i++) { 1590 bp = getcacheblk(vp, loffset, 1591 last_bp->b_bcount, GETBLK_SZMATCH | 1592 GETBLK_NOWAIT); 1593 buflist->bs_children[i] = bp; 1594 if (bp == NULL) { 1595 j = i + 1; 1596 } else if (bp->b_bio2.bio_offset == NOOFFSET) { 1597 VOP_BMAP(bp->b_vp, bp->b_loffset, 1598 &bp->b_bio2.bio_offset, 1599 NULL, NULL, BUF_CMD_WRITE); 1600 } 1601 } 1602 1603 /* 1604 * Get rid of gaps 1605 */ 1606 for (k = 0; k < j; ++k) { 1607 if (buflist->bs_children[k]) { 1608 bqrelse(buflist->bs_children[k]); 1609 buflist->bs_children[k] = NULL; 1610 } 1611 } 1612 if (j != 0) { 1613 if (j != i) { 1614 bcopy(buflist->bs_children + j, 1615 buflist->bs_children + 0, 1616 sizeof(buflist->bs_children[0]) * (i - j)); 1617 } 1618 i -= j; 1619 } 1620 buflist->bs_children[i] = bp = last_bp; 1621 if (bp->b_bio2.bio_offset == NOOFFSET) { 1622 VOP_BMAP(bp->b_vp, bp->b_loffset, &bp->b_bio2.bio_offset, 1623 NULL, NULL, BUF_CMD_WRITE); 1624 } 1625 buflist->bs_nchildren = i + 1; 1626 return (buflist); 1627 } 1628 1629 void 1630 cluster_append(struct bio *bio, struct buf *tbp) 1631 { 1632 tbp->b_cluster_next = NULL; 1633 if (bio->bio_caller_info1.cluster_head == NULL) { 1634 bio->bio_caller_info1.cluster_head = tbp; 1635 bio->bio_caller_info2.cluster_tail = tbp; 1636 } else { 1637 bio->bio_caller_info2.cluster_tail->b_cluster_next = tbp; 1638 bio->bio_caller_info2.cluster_tail = tbp; 1639 } 1640 } 1641 1642 static 1643 void 1644 cluster_setram (struct buf *bp) 1645 { 1646 bp->b_flags |= B_RAM; 1647 if (bp->b_xio.xio_npages) 1648 vm_page_flag_set(bp->b_xio.xio_pages[0], PG_RAM); 1649 } 1650