[NTOKSRNL] Don't blindly schedule read-ahead on CcCopyRead() call.
authorPierre Schweitzer <pierre@reactos.org>
Wed, 28 Feb 2018 19:54:53 +0000 (20:54 +0100)
committerPierre Schweitzer <pierre@reactos.org>
Wed, 28 Feb 2018 19:58:36 +0000 (20:58 +0100)
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

index 8525d9f..c39b214 100644 (file)
@@ -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);
         }