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
)
124 UNIMPLEMENTED_DBGBREAK();
129 CcCopyWrite(IN PFILE_OBJECT FileObject
,
130 IN PLARGE_INTEGER FileOffset
,
140 LARGE_INTEGER CurrentOffset
= *FileOffset
;
141 LARGE_INTEGER EndOffset
;
142 LARGE_INTEGER NextOffset
;
144 EndOffset
.QuadPart
= CurrentOffset
.QuadPart
+ Length
;
146 DPRINT("CcCopyWrite(%x,%x,%d,%d,%x)\n",
153 while (CurrentOffset
.QuadPart
< EndOffset
.QuadPart
)
155 NextOffset
.HighPart
= CurrentOffset
.HighPart
;
156 NextOffset
.LowPart
= (CurrentOffset
.LowPart
+ CACHE_STRIPE
) & ~(CACHE_STRIPE
- 1);
157 DPRINT("NextOffset %08x%08x\n", NextOffset
.u
.HighPart
, NextOffset
.u
.LowPart
);
158 WriteLen
= MIN(NextOffset
.QuadPart
- CurrentOffset
.QuadPart
, Length
);
160 DPRINT("Copying %x bytes from %08x%08x\n",
162 CurrentOffset
.u
.HighPart
,
163 CurrentOffset
.u
.LowPart
);
165 DPRINT("CcPreparePinWrite\n");
167 Result
= CcPreparePinWrite(FileObject
,
171 Wait
? PIN_WAIT
: PIN_IF_BCB
,
172 (PVOID
*)&Bcb
, &WriteBuf
);
174 DPRINT("Result %s %x %x\n", Result
? "TRUE" : "FALSE", Bcb
, WriteBuf
);
177 DPRINT1("CcPreparePinWrite Failed?\n");
179 RtlRaiseStatus(STATUS_NOT_MAPPED_DATA
);
184 DPRINT("Copying actual memory to BCB#%x (@%x) (from buffer at %x)\n",
185 Bcb
- CcCacheSections
,
189 //MiZeroFillSection(WriteBuf, &CurrentOffset, WriteLen);
190 RtlCopyMemory(WriteBuf
, ((PCHAR
)Buffer
) + Count
, WriteLen
);
193 CurrentOffset
= NextOffset
;
198 DPRINT("Done with CcCopyWrite\n");
205 CcFastCopyWrite(IN PFILE_OBJECT FileObject
,
210 UNIMPLEMENTED_DBGBREAK();
215 CcCanIWrite(IN PFILE_OBJECT FileObject
,
216 IN ULONG BytesToWrite
,
220 UNIMPLEMENTED_DBGBREAK();
226 CcDeferWrite(IN PFILE_OBJECT FileObject
,
227 IN PCC_POST_DEFERRED_WRITE PostRoutine
,
230 IN ULONG BytesToWrite
,
233 UNIMPLEMENTED_DBGBREAK();