https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c4f58bbfd85f9c713e967…
commit c4f58bbfd85f9c713e9673114d15c61b6569e3a5
Author: Pierre Schweitzer <pierre(a)reactos.org>
AuthorDate: Wed Feb 28 20:54:53 2018 +0100
Commit: Pierre Schweitzer <pierre(a)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);
}