On Wed, 21 May 2008 15:52:04 +0900 Hisashi Hifumi <hifumi.hisashi@oss.ntt.co.jp> wrote:I suppose that makes sense. That's not a terribly good benchmark, IMO. It's too complex. To work out the best-case for a change like this I'd suggest a microbenchmark which does something such as seeking all around a file doing single-byte reads. Then one should think up a benchmark which demonstrates the worst-case, such as reading one-byte-quantities from a file at offsets 0, 0x2000, 0x4000, 0x6000, ... and then read more one-byte-quantities at offsets 0x1000, 0x3000, 0x5000, etc. That would be a pretty cruel comparison, but as one tosses in more such artificial worklaods, one is in a better position to work out whether the change is an aggregate benefit. The results from a great big lumped-together benchmark such as sysbench aren't a lot of use to us in predicting how effective this change will be across all the workloads which the kernel implements. We shouldn't do this. See, the code which you have here is assuming that if PagePrivate is set, then the thing which is at page.private is a ring of buffer_heads. But this code (do_generic_file_read) doesn't know that! Take a look at afs, nfs, perhaps other filesystems, grep for set_page_private(). Only the address_space implementation (ie: the filesystem) knows whether page.private holds buffer_heads and only the address_space_operations functions are allowed to call into library functions which treat page.private as a buffer_head ring. Now, your code _may_ not crash, because perhaps there is no filesystem which puts something else into page.private which also uses do_generic_file_read(). But it's still wrong. I guess a suitable fix might be to implement the above using a new address_space_operations callback: if (PagePrivate(page) && aops->is_partially_uptodate) { if (aops->is_partially_uptodate(page, desc, offset)) <OK, we can copy the data> then implement a generic_file_is_partially_uptodate() in fs/buffer.c and wire that up in the filesystems. Note that things like network filesystems can then implement this also. --
| Greg Kroah-Hartman | [PATCH 012/196] nozomi driver |
| Ingo Molnar | Re: [patch 00/13] Syslets, "Threadlets", generic AIO support, v3 |
| Rafael J. Wysocki | [PATCH -mm 5/6] Freezer: Remove PF_NOFREEZE from bluetooth threads |
| Ingo Molnar | Re: [PATCH 00/23] per device dirty throttling -v8 |
git: | |
| David Miller | [GIT]: Networking |
| David Miller | Re: [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
| Gerrit Renker | [PATCH 15/37] dccp: Set per-connection CCIDs via socket options |
| Natalie Protasevich | [BUG] New Kernel Bugs |
