Author: fireball
Date: Mon Mar 3 19:03:04 2008
New Revision: 32547
URL:
http://svn.reactos.org/svn/reactos?rev=3D32547&view=3Drev
Log:
- Implement MiShutdownMemoryManager (stops MPW thread and writes all dirty =
pages to disk).
- Move MiShutdownMemoryManager invocation to where it should really happen =
(before filesystems shutdown).
- As a result, MPW doesn't have a chance to flush pages when filesystems ar=
e already down. However, 1st assertion as mentioned in bug 2872 still happe=
ns. 2nd one is gone.
See issue #2872 for more details.
Modified:
trunk/reactos/ntoskrnl/ex/shutdown.c
trunk/reactos/ntoskrnl/mm/mminit.c
trunk/reactos/ntoskrnl/mm/mpw.c
Modified: trunk/reactos/ntoskrnl/ex/shutdown.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/shutdown.=
c?rev=3D32547&r1=3D32546&r2=3D32547&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/reactos/ntoskrnl/ex/shutdown.c (original)
+++ trunk/reactos/ntoskrnl/ex/shutdown.c Mon Mar 3 19:03:04 2008
@@ -167,12 +167,11 @@
}
=
PspShutdownProcessManager();
- =
+
CmShutdownSystem();
+ MiShutdownMemoryManager();
IoShutdownRegisteredFileSystems();
IoShutdownRegisteredDevices();
-
- MiShutdownMemoryManager();
=
if (Action =3D=3D ShutdownNoReboot)
{
Modified: trunk/reactos/ntoskrnl/mm/mminit.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/mminit.c?=
rev=3D32547&r1=3D32546&r2=3D32547&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/reactos/ntoskrnl/mm/mminit.c (original)
+++ trunk/reactos/ntoskrnl/mm/mminit.c Mon Mar 3 19:03:04 2008
@@ -57,6 +57,9 @@
PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor;
MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg;
extern KMUTANT MmSystemLoadLock;
+extern HANDLE MpwThreadHandle;
+extern BOOLEAN MpwThreadShouldTerminate;
+extern KEVENT MpwThreadEvent;
BOOLEAN MiDbgEnableMdDump =3D
#ifdef _ARM_
TRUE;
@@ -70,7 +73,33 @@
NTAPI
MiShutdownMemoryManager(VOID)
{
-
+ ULONG PagesWritten;
+ PETHREAD Thread;
+
+ /* Ask MPW thread to shutdown */
+ MpwThreadShouldTerminate =3D TRUE;
+ KeSetEvent(&MpwThreadEvent, IO_NO_INCREMENT, FALSE);
+
+ /* Wait for it */
+ ObReferenceObjectByHandle(MpwThreadHandle,
+ THREAD_ALL_ACCESS,
+ PsThreadType,
+ KernelMode,
+ (PVOID*)&Thread,
+ NULL);
+
+ KeWaitForSingleObject(Thread,
+ Executive,
+ KernelMode,
+ FALSE,
+ NULL);
+
+ ObDereferenceObject(Thread);
+
+ /* Check if there are any dirty pages, and flush them.
+ There will be no other chance to do this later, since filesystems
+ are going to be shut down. */
+ CcRosFlushDirtyPages(128, &PagesWritten);
}
=
VOID
@@ -401,13 +430,10 @@
MmPagedPoolBase =3D (PVOID)PAGE_ROUND_UP((ULONG_PTR)MiNonPagedPoolStar=
t +
MiNonPagedPoolLength);
MmPagedPoolSize =3D MM_PAGED_POOL_SIZE;
- =
/* Dump kernel memory layout */
MiDbgKernelLayout();
- =
/* Initialize the page list */
MmInitializePageList();
- =
/* Unmap low memory */
MmDeletePageTable(NULL, 0);
=
Modified: trunk/reactos/ntoskrnl/mm/mpw.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/mpw.c?rev=
=3D32547&r1=3D32546&r2=3D32547&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/reactos/ntoskrnl/mm/mpw.c (original)
+++ trunk/reactos/ntoskrnl/mm/mpw.c Mon Mar 3 19:03:04 2008
@@ -17,10 +17,10 @@
=
/* GLOBALS ***************************************************************=
****/
=
-static HANDLE MpwThreadHandle;
+HANDLE MpwThreadHandle;
static CLIENT_ID MpwThreadId;
-static KEVENT MpwThreadEvent;
-static volatile BOOLEAN MpwThreadShouldTerminate;
+KEVENT MpwThreadEvent;
+BOOLEAN MpwThreadShouldTerminate;
=
/* FUNCTIONS *************************************************************=
****/
=