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