Author: dchapyshev
Date: Sat Sep  3 21:25:45 2016
New Revision: 72554
URL: 
http://svn.reactos.org/svn/reactos?rev=72554&view=rev
Log:
[NTOS:IO]
- Implement Lookaside Floats allocations in IoAllocateIrp and IoFreeIrp
* Fixes 2 tests in kmtest:IoIrp
Modified:
    trunk/reactos/ntoskrnl/io/iomgr/irp.c
Modified: trunk/reactos/ntoskrnl/io/iomgr/irp.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/irp.c?re…
==============================================================================
--- trunk/reactos/ntoskrnl/io/iomgr/irp.c       [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/io/iomgr/irp.c       [iso-8859-1] Sat Sep  3 21:25:45 2016
@@ -562,13 +562,14 @@
     /* 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)
@@ -576,9 +577,6 @@
             Size = IoSizeOfIrp(8);
             ListType = LookasideLargeIrpList;
         }
-
-        /* Get the PRCB */
-        Prcb = KeGetCurrentPrcb();
         /* Get the P List First */
         List = (PNPAGED_LOOKASIDE_LIST)Prcb->PPLookasideList[ListType].P;
@@ -622,8 +620,12 @@
         /* 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 @@
 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 @@
     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))
     {
@@ -1609,9 +1621,6 @@
     {
         /* 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;
@@ -1640,8 +1649,8 @@
         /* The free was within the Depth */
         if (Irp)
         {
-           InterlockedPushEntrySList(&List->L.ListHead,
-                                     (PSLIST_ENTRY)Irp);
+            InterlockedPushEntrySList(&List->L.ListHead,
+                                      (PSLIST_ENTRY)Irp);
         }
     }
 }