[ros-diffs] [fireball] 32630: - Move MiGetPfnEntry into arch-independent mm.h header, along with a few defines, structures, and function prototypes which are going to be used with the new pool implementation in future. - Add two new fields into PHYSICAL_PAGE structure, they will be used (in the future new pool implementation) to find end/start of a non-paged pool allocation without storing the actual pointers (based on NTs own PFN entry optimization for this) - thanks to Alex for providing this great idea!

fireball at svn.reactos.org fireball at svn.reactos.org
Sun Mar 9 22:15:12 CET 2008


Author: fireball
Date: Sun Mar  9 16:15:12 2008
New Revision: 32630

URL: http://svn.reactos.org/svn/reactos?rev=3D32630&view=3Drev
Log:
- Move MiGetPfnEntry into arch-independent mm.h header, along with a few de=
fines, structures, and function prototypes which are going to be used with =
the new pool implementation in future.
- Add two new fields into PHYSICAL_PAGE structure, they will be used (in th=
e future new pool implementation) to find end/start of a non-paged pool all=
ocation without storing the actual pointers (based on NTs own PFN entry opt=
imization for this) - thanks to Alex for providing this great idea!

Modified:
    trunk/reactos/ntoskrnl/include/internal/mm.h
    trunk/reactos/ntoskrnl/mm/freelist.c

Modified: trunk/reactos/ntoskrnl/include/internal/mm.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/inte=
rnal/mm.h?rev=3D32630&r1=3D32629&r2=3D32630&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/include/internal/mm.h (original)
+++ trunk/reactos/ntoskrnl/include/internal/mm.h Sun Mar  9 16:15:12 2008
@@ -55,6 +55,12 @@
 #define MM_PAGEOP_PAGEOUT                   (2)
 #define MM_PAGEOP_PAGESYNCH                 (3)
 #define MM_PAGEOP_ACCESSFAULT               (4)
+
+/* Number of list heads to use */
+#define MI_FREE_POOL_LISTS 4
+
+/* Signature of free pool blocks */
+#define MM_FREE_POOL_TAG    TAG('F', 'r', 'p', 'l')
 =

 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \
     ((x) / (4*1024*1024))
@@ -275,6 +281,8 @@
             ULONG Type: 2;
             ULONG Consumer: 3;
             ULONG Zero: 1;
+            ULONG StartOfAllocation: 1;
+            ULONG EndOfAllocation: 1;
         }
         Flags;
         ULONG AllFlags;
@@ -337,6 +345,28 @@
     LIST_ENTRY RegionListEntry;
 } MM_REGION, *PMM_REGION;
 =

+/* Entry describing free pool memory */
+typedef struct _MMFREE_POOL_ENTRY
+{
+    LIST_ENTRY List;
+    PFN_NUMBER Size;
+    ULONG Signature;
+    struct _MMFREE_POOL_ENTRY *Owner;
+} MMFREE_POOL_ENTRY, *PMMFREE_POOL_ENTRY;
+
+/* Paged pool information */
+typedef struct _MM_PAGED_POOL_INFO
+{  =

+    PRTL_BITMAP PagedPoolAllocationMap;
+    PRTL_BITMAP EndOfPagedPoolBitmap;
+    PMMPTE FirstPteForPagedPool;
+    PMMPTE LastPteForPagedPool;
+    PMMPTE NextPdeForPagedPoolExpansion;
+    ULONG PagedPoolHint;
+    SIZE_T PagedPoolCommit;
+    SIZE_T AllocatedPagedPool;
+} MM_PAGED_POOL_INFO, *PMM_PAGED_POOL_INFO;
+
 extern MM_MEMORY_CONSUMER MiMemoryConsumers[MC_MAXIMUM];
 =

 typedef VOID
@@ -489,6 +519,25 @@
 =

 PVOID
 NTAPI
+MiAllocatePoolPages(
+    IN POOL_TYPE PoolType,
+    IN SIZE_T SizeInBytes
+);
+
+POOL_TYPE
+NTAPI
+MmDeterminePoolType(
+    IN PVOID VirtualAddress
+);
+
+ULONG
+NTAPI
+MiFreePoolPages(
+    IN PVOID StartingAddress
+);
+
+PVOID
+NTAPI
 MmGetMdlPageAddress(
     PMDL Mdl,
     PVOID Offset
@@ -935,6 +984,29 @@
 MmPageOutPhysicalAddress(PFN_TYPE Page);
 =

 /* freelist.c **********************************************************/
+
+#define ASSERT_PFN(x) ASSERT((x)->Flags.Type !=3D 0)
+
+FORCEINLINE
+PPHYSICAL_PAGE
+MiGetPfnEntry(IN PFN_TYPE Pfn)
+{
+    PPHYSICAL_PAGE Page;
+    extern PPHYSICAL_PAGE MmPageArray;
+    extern ULONG MmPageArraySize;
+
+    /* Make sure the PFN number is valid */
+    ASSERT(Pfn <=3D MmPageArraySize);
+
+    /* Get the entry */
+    Page =3D &MmPageArray[Pfn];
+
+    /* Make sure it's valid */
+    ASSERT_PFN(Page);
+
+    /* Return it */
+    return Page;
+};
 =

 PFN_TYPE
 NTAPI

Modified: trunk/reactos/ntoskrnl/mm/freelist.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/freelist.=
c?rev=3D32630&r1=3D32629&r2=3D32630&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/freelist.c (original)
+++ trunk/reactos/ntoskrnl/mm/freelist.c Sun Mar  9 16:15:12 2008
@@ -25,12 +25,9 @@
 #define MM_PHYSICAL_PAGE_USED    (0x2)
 #define MM_PHYSICAL_PAGE_BIOS    (0x3)
 =

-
-#define ASSERT_PFN(x) ASSERT((x)->Flags.Type !=3D 0)
-
 /* GLOBALS ***************************************************************=
*/
 =

-static PPHYSICAL_PAGE MmPageArray;
+PPHYSICAL_PAGE MmPageArray;
 ULONG MmPageArraySize;
 =

 static KSPIN_LOCK PageListLock;
@@ -44,25 +41,6 @@
 static ULONG UnzeroedPageCount =3D 0;
 =

 /* FUNCTIONS *************************************************************/
-
-FORCEINLINE
-PPHYSICAL_PAGE
-MiGetPfnEntry(IN PFN_TYPE Pfn)
-{
-    PPHYSICAL_PAGE Page;
-
-    /* Make sure the PFN number is valid */
-    ASSERT(Pfn <=3D MmPageArraySize);
-
-    /* Get the entry */
-    Page =3D &MmPageArray[Pfn];
-
-    /* Make sure it's valid */
-    ASSERT_PFN(Page);
-
-    /* Return it */
-    return Page;
-}
 =

 PFN_TYPE
 NTAPI




More information about the Ros-diffs mailing list