[NTOS:IO]
authorDmitry Chapyshev <dmitry@reactos.org>
Sat, 3 Sep 2016 21:25:45 +0000 (21:25 +0000)
committerDmitry Chapyshev <dmitry@reactos.org>
Sat, 3 Sep 2016 21:25:45 +0000 (21:25 +0000)
- Implement Lookaside Floats allocations in IoAllocateIrp and IoFreeIrp

* Fixes 2 tests in kmtest:IoIrp

svn path=/trunk/; revision=72554

reactos/ntoskrnl/io/iomgr/irp.c

index 49e4312..e243cfc 100644 (file)
@@ -562,13 +562,14 @@ IoAllocateIrp(IN CCHAR StackSize,
     /* Set Charge Quota Flag */
     if (ChargeQuota) Flags |= IRP_QUOTA_CHARGED;
 
-    /* FIXME: Implement Lookaside Floats */
+    /* Get the PRCB */
+    Prcb = KeGetCurrentPrcb();
 
     /* Figure out which Lookaside List to use */
-    if ((StackSize <= 8) && (ChargeQuota == FALSE))
+    if ((StackSize <= 8) && (ChargeQuota == FALSE || Prcb->LookasideIrpFloat > 0))
     {
         /* Set Fixed Size Flag */
-        Flags = IRP_ALLOCATED_FIXED_SIZE;
+        Flags |= IRP_ALLOCATED_FIXED_SIZE;
 
         /* See if we should use big list */
         if (StackSize != 1)
@@ -577,9 +578,6 @@ IoAllocateIrp(IN CCHAR StackSize,
             ListType = LookasideLargeIrpList;
         }
 
-        /* Get the PRCB */
-        Prcb = KeGetCurrentPrcb();
-
         /* Get the P List First */
         List = (PNPAGED_LOOKASIDE_LIST)Prcb->PPLookasideList[ListType].P;
 
@@ -622,8 +620,12 @@ IoAllocateIrp(IN CCHAR StackSize,
         /* Make sure it was sucessful */
         if (!Irp) return NULL;
     }
-    else
+    else if (Flags & IRP_QUOTA_CHARGED)
     {
+        /* Decrement lookaside float */
+        InterlockedDecrement(&Prcb->LookasideIrpFloat);
+        Flags |= IRP_LOOKASIDE_ALLOCATION;
+
         /* In this case there is no charge quota */
         Flags &= ~IRP_QUOTA_CHARGED;
     }
@@ -1587,7 +1589,7 @@ NTAPI
 IoFreeIrp(IN PIRP Irp)
 {
     PNPAGED_LOOKASIDE_LIST List;
-    PP_NPAGED_LOOKASIDE_NUMBER ListType =  LookasideSmallIrpList;
+    PP_NPAGED_LOOKASIDE_NUMBER ListType = LookasideSmallIrpList;
     PKPRCB Prcb;
     IOTRACE(IO_IRP_DEBUG,
             "%s - Freeing IRPs %p\n",
@@ -1599,6 +1601,16 @@ IoFreeIrp(IN PIRP Irp)
     ASSERT(IsListEmpty(&Irp->ThreadListEntry));
     ASSERT(Irp->CurrentLocation >= Irp->StackCount);
 
+    /* Get the PRCB */
+    Prcb = KeGetCurrentPrcb();
+
+    /* If this was a lookaside alloc, increment lookaside float */
+    if (Irp->AllocationFlags & IRP_LOOKASIDE_ALLOCATION)
+    {
+        Irp->AllocationFlags &= ~IRP_LOOKASIDE_ALLOCATION;
+        InterlockedIncrement(&Prcb->LookasideIrpFloat);
+    }
+
     /* If this was a pool alloc, free it with the pool */
     if (!(Irp->AllocationFlags & IRP_ALLOCATED_FIXED_SIZE))
     {
@@ -1610,9 +1622,6 @@ IoFreeIrp(IN PIRP Irp)
         /* Check if this was a Big IRP */
         if (Irp->StackCount != 1) ListType = LookasideLargeIrpList;
 
-        /* Get the PRCB */
-        Prcb = KeGetCurrentPrcb();
-
         /* Use the P List */
         List = (PNPAGED_LOOKASIDE_LIST)Prcb->PPLookasideList[ListType].P;
         List->L.TotalFrees++;
@@ -1640,8 +1649,8 @@ IoFreeIrp(IN PIRP Irp)
         /* The free was within the Depth */
         if (Irp)
         {
-           InterlockedPushEntrySList(&List->L.ListHead,
-                                     (PSLIST_ENTRY)Irp);
+            InterlockedPushEntrySList(&List->L.ListHead,
+                                      (PSLIST_ENTRY)Irp);
         }
     }
 }