Hello, i would like to get some reviews, opinions and/or comments on the patch below. a little bit background, as far as i understand, cluster_read() can initiate two disk i/o's: one for exact amount of data being requested (rounded up to a filesystem block size) and another for a configurable read ahead. read ahead data are always extra and do not super set data being requested. also, read ahead can be controlled via f_seqcount (on per descriptor basis) and/or vfs.read_max (global knob). in some cases and/or on some work loads it can be beneficial to bundle original data and read ahead data in one i/o request. in other words, read more than caller has requested, but only perform one larger i/o, i.e. super set data being requested and read ahead. === Index: trunk/cache/src/sys/kern/vfs_cluster.c =================================================================== diff -u -N -r515 -r1888 --- trunk/cache/src/sys/kern/vfs_cluster.c (.../vfs_cluster.c) (revision 515) +++ trunk/cache/src/sys/kern/vfs_cluster.c (.../vfs_cluster.c) (revision 1888) _at__at_ -75,6 +75,10 _at__at_ SYSCTL_INT(_vfs, OID_AUTO, read_max, CTLFLAG_RW, &read_max, 0, "Cluster read-ahead max block count"); +static int read_min = 1; +SYSCTL_INT(_vfs, OID_AUTO, read_min, CTLFLAG_RW, &read_min, 0, + "Cluster read min block count"); + /* Page expended to mark partially backed buffers */ extern vm_page_t bogus_page; _at__at_ -169,13 +173,21 _at__at_ } else { off_t firstread = bp->b_offset; int nblks; + long minread; KASSERT(bp->b_offset != NOOFFSET, ("cluster_read: no buffer offset")); ncontig = 0; /* + * Adjust totread if needed + */ + minread = read_min * size; + if (minread > totread) + totread = minread; + + /* * Compute the total number of blocks that we should read * synchronously. */ === thanks, maxReceived on Wed Mar 27 2013 - 19:43:38 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:36 UTC