mirror of
https://github.com/reactos/reactos.git
synced 2024-06-30 01:42:30 +00:00
[NTOSKRNL] Replace the alloc map by a bitmap
This commit is contained in:
parent
fb07332450
commit
f080ee1305
|
@ -50,9 +50,8 @@ typedef struct _PAGINGFILE
|
||||||
LARGE_INTEGER CurrentSize;
|
LARGE_INTEGER CurrentSize;
|
||||||
PFN_NUMBER FreePages;
|
PFN_NUMBER FreePages;
|
||||||
PFN_NUMBER UsedPages;
|
PFN_NUMBER UsedPages;
|
||||||
PULONG AllocMap;
|
PRTL_BITMAP AllocMap;
|
||||||
KSPIN_LOCK AllocMapLock;
|
KSPIN_LOCK AllocMapLock;
|
||||||
ULONG AllocMapSize;
|
|
||||||
}
|
}
|
||||||
PAGINGFILE, *PPAGINGFILE;
|
PAGINGFILE, *PPAGINGFILE;
|
||||||
|
|
||||||
|
@ -297,27 +296,13 @@ static ULONG
|
||||||
MiAllocPageFromPagingFile(PPAGINGFILE PagingFile)
|
MiAllocPageFromPagingFile(PPAGINGFILE PagingFile)
|
||||||
{
|
{
|
||||||
KIRQL oldIrql;
|
KIRQL oldIrql;
|
||||||
ULONG i, j;
|
ULONG off;
|
||||||
|
|
||||||
KeAcquireSpinLock(&PagingFile->AllocMapLock, &oldIrql);
|
KeAcquireSpinLock(&PagingFile->AllocMapLock, &oldIrql);
|
||||||
|
off = RtlFindClearBitsAndSet(PagingFile->AllocMap, 1, 0);
|
||||||
for (i = 0; i < PagingFile->AllocMapSize; i++)
|
|
||||||
{
|
|
||||||
for (j = 0; j < 32; j++)
|
|
||||||
{
|
|
||||||
if (!(PagingFile->AllocMap[i] & (1 << j)))
|
|
||||||
{
|
|
||||||
PagingFile->AllocMap[i] |= (1 << j);
|
|
||||||
PagingFile->UsedPages++;
|
|
||||||
PagingFile->FreePages--;
|
|
||||||
KeReleaseSpinLock(&PagingFile->AllocMapLock, oldIrql);
|
|
||||||
return((i * 32) + j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
KeReleaseSpinLock(&PagingFile->AllocMapLock, oldIrql);
|
KeReleaseSpinLock(&PagingFile->AllocMapLock, oldIrql);
|
||||||
return(0xFFFFFFFF);
|
|
||||||
|
return off;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
@ -338,7 +323,7 @@ MmFreeSwapPage(SWAPENTRY Entry)
|
||||||
}
|
}
|
||||||
KeAcquireSpinLockAtDpcLevel(&PagingFileList[i]->AllocMapLock);
|
KeAcquireSpinLockAtDpcLevel(&PagingFileList[i]->AllocMapLock);
|
||||||
|
|
||||||
PagingFileList[i]->AllocMap[off >> 5] &= (~(1 << (off % 32)));
|
RtlClearBit(PagingFileList[i]->AllocMap, off >> 5);
|
||||||
|
|
||||||
PagingFileList[i]->FreePages++;
|
PagingFileList[i]->FreePages++;
|
||||||
PagingFileList[i]->UsedPages--;
|
PagingFileList[i]->UsedPages--;
|
||||||
|
@ -661,11 +646,10 @@ NtCreatePagingFile(IN PUNICODE_STRING FileName,
|
||||||
PagingFile->UsedPages = 0;
|
PagingFile->UsedPages = 0;
|
||||||
KeInitializeSpinLock(&PagingFile->AllocMapLock);
|
KeInitializeSpinLock(&PagingFile->AllocMapLock);
|
||||||
|
|
||||||
AllocMapSize = (PagingFile->FreePages / 32) + 1;
|
AllocMapSize = sizeof(RTL_BITMAP) + (((PagingFile->FreePages + 31) / 32) * sizeof(ULONG));
|
||||||
PagingFile->AllocMap = ExAllocatePool(NonPagedPool,
|
PagingFile->AllocMap = ExAllocatePoolWithTag(NonPagedPool,
|
||||||
AllocMapSize * sizeof(ULONG));
|
AllocMapSize,
|
||||||
PagingFile->AllocMapSize = AllocMapSize;
|
TAG_MM);
|
||||||
|
|
||||||
if (PagingFile->AllocMap == NULL)
|
if (PagingFile->AllocMap == NULL)
|
||||||
{
|
{
|
||||||
ExFreePool(PagingFile);
|
ExFreePool(PagingFile);
|
||||||
|
@ -674,7 +658,10 @@ NtCreatePagingFile(IN PUNICODE_STRING FileName,
|
||||||
return(STATUS_NO_MEMORY);
|
return(STATUS_NO_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
RtlZeroMemory(PagingFile->AllocMap, AllocMapSize * sizeof(ULONG));
|
RtlInitializeBitMap(PagingFile->AllocMap,
|
||||||
|
(PULONG)(PagingFile->AllocMap + 1),
|
||||||
|
(ULONG)(PagingFile->FreePages));
|
||||||
|
RtlClearAllBits(PagingFile->AllocMap);
|
||||||
|
|
||||||
KeAcquireSpinLock(&PagingFileListLock, &oldIrql);
|
KeAcquireSpinLock(&PagingFileListLock, &oldIrql);
|
||||||
for (i = 0; i < MAX_PAGING_FILES; i++)
|
for (i = 0; i < MAX_PAGING_FILES; i++)
|
||||||
|
|
Loading…
Reference in a new issue