- Implement Lookaside Floats allocations in IoAllocateIrp and IoFreeIrp
* Fixes 2 tests in kmtest:IoIrp
svn path=/trunk/; revision=72554
/* Set Charge Quota Flag */
if (ChargeQuota) Flags |= IRP_QUOTA_CHARGED;
/* 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 */
/* Figure out which Lookaside List to use */
- if ((StackSize <= 8) && (ChargeQuota == FALSE))
+ if ((StackSize <= 8) && (ChargeQuota == FALSE || Prcb->LookasideIrpFloat > 0))
{
/* Set Fixed Size Flag */
{
/* Set Fixed Size Flag */
- Flags = IRP_ALLOCATED_FIXED_SIZE;
+ Flags |= IRP_ALLOCATED_FIXED_SIZE;
/* See if we should use big list */
if (StackSize != 1)
/* See if we should use big list */
if (StackSize != 1)
ListType = LookasideLargeIrpList;
}
ListType = LookasideLargeIrpList;
}
- /* Get the PRCB */
- Prcb = KeGetCurrentPrcb();
-
/* Get the P List First */
List = (PNPAGED_LOOKASIDE_LIST)Prcb->PPLookasideList[ListType].P;
/* Get the P List First */
List = (PNPAGED_LOOKASIDE_LIST)Prcb->PPLookasideList[ListType].P;
/* Make sure it was sucessful */
if (!Irp) return NULL;
}
/* Make sure it was sucessful */
if (!Irp) return NULL;
}
+ 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;
}
/* In this case there is no charge quota */
Flags &= ~IRP_QUOTA_CHARGED;
}
IoFreeIrp(IN PIRP Irp)
{
PNPAGED_LOOKASIDE_LIST List;
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",
PKPRCB Prcb;
IOTRACE(IO_IRP_DEBUG,
"%s - Freeing IRPs %p\n",
ASSERT(IsListEmpty(&Irp->ThreadListEntry));
ASSERT(Irp->CurrentLocation >= Irp->StackCount);
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))
{
/* If this was a pool alloc, free it with the pool */
if (!(Irp->AllocationFlags & IRP_ALLOCATED_FIXED_SIZE))
{
/* Check if this was a Big IRP */
if (Irp->StackCount != 1) ListType = LookasideLargeIrpList;
/* 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++;
/* Use the P List */
List = (PNPAGED_LOOKASIDE_LIST)Prcb->PPLookasideList[ListType].P;
List->L.TotalFrees++;
/* The free was within the Depth */
if (Irp)
{
/* The free was within the Depth */
if (Irp)
{
- InterlockedPushEntrySList(&List->L.ListHead,
- (PSLIST_ENTRY)Irp);
+ InterlockedPushEntrySList(&List->L.ListHead,
+ (PSLIST_ENTRY)Irp);