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?rev... ============================================================================== --- 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); } } }