2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel
4 * FILE: ntoskrnl/cache/copysup.c
5 * PURPOSE: Logging and configuration routines
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
9 /* INCLUDES *******************************************************************/
13 #include "section/newmm.h"
17 /* GLOBALS ********************************************************************/
19 ULONG CcFastMdlReadWait
;
20 ULONG CcFastMdlReadNotPossible
;
21 ULONG CcFastReadNotPossible
;
23 ULONG CcFastReadNoWait
;
24 ULONG CcFastReadResourceMiss
;
26 #define TAG_COPY_READ TAG('C', 'o', 'p', 'y')
27 #define TAG_COPY_WRITE TAG('R', 'i', 't', 'e')
29 /* FUNCTIONS ******************************************************************/
33 CcCopyRead can be called for a region of any size and alignment, so we must
34 crawl the cache space, focusing one cache stripe after another and using
35 RtlCopyMemory to copy the input data into the cache. In constrained memory,
36 pages faulted into new stripes are often taken from old stripes, causing the
37 old stripes to be flushed right away. In the case of many short buffered in
38 order writes, like the ones generated by stdio, this can be really efficient.
43 CcCopyRead(IN PFILE_OBJECT FileObject
,
44 IN PLARGE_INTEGER FileOffset
,
48 OUT PIO_STATUS_BLOCK IoStatus
)
53 PCHAR BufferTarget
= (PCHAR
)Buffer
;
54 LARGE_INTEGER CacheOffset
, EndOfExtent
, NextOffset
;
56 DPRINT("CcCopyRead(%x,%x,%d,%d,%x)\n",
63 CacheOffset
.QuadPart
= FileOffset
->QuadPart
;
64 EndOfExtent
.QuadPart
= FileOffset
->QuadPart
+ Length
;
66 while (CacheOffset
.QuadPart
< EndOfExtent
.QuadPart
)
68 NextOffset
.QuadPart
= CacheOffset
.QuadPart
;
69 NextOffset
.LowPart
= (NextOffset
.LowPart
+ CACHE_STRIPE
) & ~(CACHE_STRIPE
-1);
70 ReadLen
= EndOfExtent
.QuadPart
- CacheOffset
.QuadPart
;
71 if (CacheOffset
.QuadPart
+ ReadLen
> NextOffset
.QuadPart
)
73 ReadLen
= NextOffset
.QuadPart
- CacheOffset
.QuadPart
;
76 DPRINT("Reading %d bytes in this go (at %08x%08x)\n",
81 if (!CcPinRead(FileObject
,
84 Wait
? PIN_WAIT
: PIN_IF_BCB
,
88 IoStatus
->Status
= STATUS_UNSUCCESSFUL
;
89 IoStatus
->Information
= 0;
90 DPRINT("Failed CcCopyRead\n");
94 DPRINT("Copying %d bytes at %08x%08x\n",
99 RtlCopyMemory(BufferTarget
, ReadBuffer
, ReadLen
);
101 BufferTarget
+= ReadLen
;
103 CacheOffset
= NextOffset
;
107 IoStatus
->Status
= STATUS_SUCCESS
;
108 IoStatus
->Information
= Length
;
110 DPRINT("Done with CcCopyRead\n");
117 CcFastCopyRead(IN PFILE_OBJECT FileObject
,
122 OUT PIO_STATUS_BLOCK IoStatus
)
130 CcCopyWrite(IN PFILE_OBJECT FileObject
,
131 IN PLARGE_INTEGER FileOffset
,
141 LARGE_INTEGER CurrentOffset
= *FileOffset
;
142 LARGE_INTEGER EndOffset
;
143 LARGE_INTEGER NextOffset
;
145 EndOffset
.QuadPart
= CurrentOffset
.QuadPart
+ Length
;
147 DPRINT("CcCopyWrite(%x,%x,%d,%d,%x)\n",
154 while (CurrentOffset
.QuadPart
< EndOffset
.QuadPart
)
156 NextOffset
.HighPart
= CurrentOffset
.HighPart
;
157 NextOffset
.LowPart
= (CurrentOffset
.LowPart
+ CACHE_STRIPE
) & ~(CACHE_STRIPE
- 1);
158 DPRINT("NextOffset %08x%08x\n", NextOffset
.u
.HighPart
, NextOffset
.u
.LowPart
);
159 WriteLen
= MIN(NextOffset
.QuadPart
- CurrentOffset
.QuadPart
, Length
);
161 DPRINT("Copying %x bytes from %08x%08x\n",
163 CurrentOffset
.u
.HighPart
,
164 CurrentOffset
.u
.LowPart
);
166 DPRINT("CcPreparePinWrite\n");
168 Result
= CcPreparePinWrite(FileObject
,
172 Wait
? PIN_WAIT
: PIN_IF_BCB
,
173 (PVOID
*)&Bcb
, &WriteBuf
);
175 DPRINT("Result %s %x %x\n", Result
? "TRUE" : "FALSE", Bcb
, WriteBuf
);
178 DPRINT1("CcPreparePinWrite Failed?\n");
180 RtlRaiseStatus(STATUS_NOT_MAPPED_DATA
);
185 DPRINT("Copying actual memory to BCB#%x (@%x) (from buffer at %x)\n",
186 Bcb
- CcCacheSections
,
190 //MiZeroFillSection(WriteBuf, &CurrentOffset, WriteLen);
191 RtlCopyMemory(WriteBuf
, ((PCHAR
)Buffer
) + Count
, WriteLen
);
194 CurrentOffset
= NextOffset
;
199 DPRINT("Done with CcCopyWrite\n");
206 CcFastCopyWrite(IN PFILE_OBJECT FileObject
,
217 CcCanIWrite(IN PFILE_OBJECT FileObject
,
218 IN ULONG BytesToWrite
,
229 CcDeferWrite(IN PFILE_OBJECT FileObject
,
230 IN PCC_POST_DEFERRED_WRITE PostRoutine
,
233 IN ULONG BytesToWrite
,