[NTOS:MM] Do not acquire Pfn lock in MmGetRmapListHead
authorJérôme Gardou <jerome.gardou@reactos.org>
Mon, 25 Jan 2021 08:24:54 +0000 (09:24 +0100)
committerJérôme Gardou <jerome.gardou@reactos.org>
Wed, 3 Feb 2021 08:41:23 +0000 (09:41 +0100)
All callers already hold it

ntoskrnl/mm/freelist.c
ntoskrnl/mm/rmap.c

index ba16362..5cc22ce 100644 (file)
@@ -426,12 +426,10 @@ PMM_RMAP_ENTRY
 NTAPI
 MmGetRmapListHeadPage(PFN_NUMBER Pfn)
 {
-    KIRQL oldIrql;
-    PMM_RMAP_ENTRY ListHead;
     PMMPFN Pfn1;
 
-    /* Lock PFN database */
-    oldIrql = MiAcquirePfnLock();
+    /* PFN database must be locked */
+    MI_ASSERT_PFN_LOCK_HELD();
 
     /* Get the entry */
     Pfn1 = MiGetPfnEntry(Pfn);
@@ -439,19 +437,14 @@ MmGetRmapListHeadPage(PFN_NUMBER Pfn)
 
     if (!MI_IS_ROS_PFN(Pfn1))
     {
-        MiReleasePfnLock(oldIrql);
         return NULL;
     }
 
-    /* Get the list head */
-    ListHead = Pfn1->RmapListHead;
-
     /* Should not have an RMAP for a non-active page */
     ASSERT(MiIsPfnInUse(Pfn1) == TRUE);
 
-    /* Release PFN database and return rmap list head */
-    MiReleasePfnLock(oldIrql);
-    return ListHead;
+    /* Get the list head */
+    return Pfn1->RmapListHead;
 }
 
 VOID
index 785539e..f50e680 100644 (file)
@@ -250,7 +250,11 @@ MmPageOutPhysicalAddress(PFN_NUMBER Page)
 
             /* We can finally let this page go */
             MmDeleteRmap(Page, Process, Address);
+#if DBG
+            OldIrql = MiAcquirePfnLock();
             ASSERT(MmGetRmapListHeadPage(Page) == NULL);
+            MiReleasePfnLock(OldIrql);
+#endif
             MmReleasePageMemoryConsumer(MC_USER, Page);
 
             if (Address < MmSystemRangeStart)