[NTOS:IO]

- Implement Lookaside Floats allocations in IoAllocateIrp and IoFreeIrp

* Fixes 2 tests in kmtest:IoIrp

svn path=/trunk/; revision=72554
This commit is contained in:
Dmitry Chapyshev 2016-09-03 21:25:45 +00:00
parent 7dc1fbc420
commit 8612af94d2

View 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);
}
}
}