https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c4f58bbfd85f9c713e9673114d15c61b6569e3a5

commit c4f58bbfd85f9c713e9673114d15c61b6569e3a5
Author:     Pierre Schweitzer <[email protected]>
AuthorDate: Wed Feb 28 20:54:53 2018 +0100
Commit:     Pierre Schweitzer <[email protected]>
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);
         }

Reply via email to