https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c4f58bbfd85f9c713e9673...
commit c4f58bbfd85f9c713e9673114d15c61b6569e3a5 Author: Pierre Schweitzer pierre@reactos.org AuthorDate: Wed Feb 28 20:54:53 2018 +0100 Commit: Pierre Schweitzer pierre@reactos.org CommitDate: Wed Feb 28 20:58:36 2018 +0100
[NTOKSRNL] Don't blindly schedule read-ahead on CcCopyRead() call.
This avoids locking Cc for too long by trying to read-ahead data which is already in cache. We now will only schedule a read ahead if next read should bring us to a new VACB (perhaps not in cache).
This notably fixes Inkscape setup which was slown down by read-ahead due to continous 1 byte reads.
Thanks to Thomas for his help on this issue.
CORE-14395 --- ntoskrnl/cc/copy.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/ntoskrnl/cc/copy.c b/ntoskrnl/cc/copy.c index 8525d9f549..c39b2148ec 100644 --- a/ntoskrnl/cc/copy.c +++ b/ntoskrnl/cc/copy.c @@ -377,8 +377,11 @@ CcCopyData ( /* If that was a successful sync read operation, let's handle read ahead */ if (Operation == CcOperationRead && Length == 0 && Wait) { - /* If file isn't random access, schedule next read */ - if (!BooleanFlagOn(FileObject->Flags, FO_RANDOM_ACCESS)) + /* If file isn't random access and next read may get us cross VACB boundary, + * schedule next read + */ + if (!BooleanFlagOn(FileObject->Flags, FO_RANDOM_ACCESS) && + (CurrentOffset - 1) / VACB_MAPPING_GRANULARITY != (CurrentOffset + BytesCopied - 1) / VACB_MAPPING_GRANULARITY) { CcScheduleReadAhead(FileObject, (PLARGE_INTEGER)&FileOffset, BytesCopied); }