- Used MmStats.NrFreePages instead of MiNrAvailablePages.

svn path=/trunk/; revision=10325
This commit is contained in:
Hartmut Birr 2004-07-31 09:44:36 +00:00
parent b67cc5006c
commit ae9493fada
3 changed files with 12 additions and 20 deletions

View file

@ -1,4 +1,4 @@
/* $Id: sysinfo.c,v 1.42 2004/07/31 00:14:39 jimtabor Exp $ /* $Id: sysinfo.c,v 1.43 2004/07/31 09:44:36 hbirr Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -409,7 +409,7 @@ QSI_DEF(SystemPerformanceInformation)
Spi->WriteOperationCount = IoWriteOperationCount; Spi->WriteOperationCount = IoWriteOperationCount;
Spi->OtherOperationCount = IoOtherOperationCount; Spi->OtherOperationCount = IoOtherOperationCount;
Spi->AvailablePages = MiNrAvailablePages; Spi->AvailablePages = MmStats.NrFreePages;
/* /*
Add up all the used "Commitied" memory + pagefile. Add up all the used "Commitied" memory + pagefile.
Not sure this is right. 8^\ Not sure this is right. 8^\

View file

@ -13,7 +13,6 @@
extern ULONG MiFreeSwapPages; extern ULONG MiFreeSwapPages;
extern ULONG MiUsedSwapPages; extern ULONG MiUsedSwapPages;
extern ULONG MmPagedPoolSize; extern ULONG MmPagedPoolSize;
extern ULONG MiNrAvailablePages;
struct _EPROCESS; struct _EPROCESS;

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: balance.c,v 1.29 2004/04/22 01:57:49 jimtabor Exp $ /* $Id: balance.c,v 1.30 2004/07/31 09:44:35 hbirr Exp $
* *
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* FILE: ntoskrnl/mm/balance.c * FILE: ntoskrnl/mm/balance.c
@ -48,7 +48,6 @@ MM_ALLOCATION_REQUEST, *PMM_ALLOCATION_REQUEST;
MM_MEMORY_CONSUMER MiMemoryConsumers[MC_MAXIMUM]; MM_MEMORY_CONSUMER MiMemoryConsumers[MC_MAXIMUM];
static ULONG MiMinimumAvailablePages; static ULONG MiMinimumAvailablePages;
ULONG MiNrAvailablePages;
static ULONG MiNrTotalPages; static ULONG MiNrTotalPages;
static LIST_ENTRY AllocationListHead; static LIST_ENTRY AllocationListHead;
static KSPIN_LOCK AllocationListLock; static KSPIN_LOCK AllocationListLock;
@ -65,10 +64,10 @@ static LONG MiBalancerWork = 0;
VOID MmPrintMemoryStatistic(VOID) VOID MmPrintMemoryStatistic(VOID)
{ {
DbgPrint("MC_CACHE %d, MC_USER %d, MC_PPOOL %d, MC_NPPOOL %d, MiNrAvailablePages %d\n", DbgPrint("MC_CACHE %d, MC_USER %d, MC_PPOOL %d, MC_NPPOOL %d, MmStats.NrFreePages %d\n",
MiMemoryConsumers[MC_CACHE].PagesUsed, MiMemoryConsumers[MC_USER].PagesUsed, MiMemoryConsumers[MC_CACHE].PagesUsed, MiMemoryConsumers[MC_USER].PagesUsed,
MiMemoryConsumers[MC_PPOOL].PagesUsed, MiMemoryConsumers[MC_NPPOOL].PagesUsed, MiMemoryConsumers[MC_PPOOL].PagesUsed, MiMemoryConsumers[MC_NPPOOL].PagesUsed,
MiNrAvailablePages); MmStats.NrFreePages);
} }
VOID INIT_FUNCTION VOID INIT_FUNCTION
@ -78,7 +77,7 @@ MmInitializeBalancer(ULONG NrAvailablePages, ULONG NrSystemPages)
InitializeListHead(&AllocationListHead); InitializeListHead(&AllocationListHead);
KeInitializeSpinLock(&AllocationListLock); KeInitializeSpinLock(&AllocationListLock);
MiNrAvailablePages = MiNrTotalPages = NrAvailablePages; MiNrTotalPages = NrAvailablePages;
/* Set up targets. */ /* Set up targets. */
MiMinimumAvailablePages = 64; MiMinimumAvailablePages = 64;
@ -104,7 +103,6 @@ MmReleasePageMemoryConsumer(ULONG Consumer, PHYSICAL_ADDRESS Page)
PMM_ALLOCATION_REQUEST Request; PMM_ALLOCATION_REQUEST Request;
PLIST_ENTRY Entry; PLIST_ENTRY Entry;
KIRQL oldIrql; KIRQL oldIrql;
ULONG OldAvailable;
#if defined(__GNUC__) #if defined(__GNUC__)
@ -113,7 +111,6 @@ MmReleasePageMemoryConsumer(ULONG Consumer, PHYSICAL_ADDRESS Page)
if (Page.QuadPart == 0) if (Page.QuadPart == 0)
#endif #endif
{ {
DPRINT1("Tried to release page zero.\n"); DPRINT1("Tried to release page zero.\n");
KEBUGCHECK(0); KEBUGCHECK(0);
@ -123,8 +120,7 @@ MmReleasePageMemoryConsumer(ULONG Consumer, PHYSICAL_ADDRESS Page)
if (MmGetReferenceCountPage(Page) == 1) if (MmGetReferenceCountPage(Page) == 1)
{ {
InterlockedDecrement((LONG *)&MiMemoryConsumers[Consumer].PagesUsed); InterlockedDecrement((LONG *)&MiMemoryConsumers[Consumer].PagesUsed);
OldAvailable = InterlockedIncrement((LONG *)&MiNrAvailablePages); if (IsListEmpty(&AllocationListHead) || MmStats.NrFreePages < MiMinimumAvailablePages)
if (IsListEmpty(&AllocationListHead) || OldAvailable + 1 < MiMinimumAvailablePages)
{ {
KeReleaseSpinLock(&AllocationListLock, oldIrql); KeReleaseSpinLock(&AllocationListLock, oldIrql);
MmDereferencePage(Page); MmDereferencePage(Page);
@ -174,7 +170,7 @@ MmRebalanceMemoryConsumers(VOID)
ULONG NrFreedPages; ULONG NrFreedPages;
NTSTATUS Status; NTSTATUS Status;
Target = (MiMinimumAvailablePages - MiNrAvailablePages) + MiPagesRequired; Target = (MiMinimumAvailablePages - MmStats.NrFreePages) + MiPagesRequired;
Target = max(Target, (LONG) MiMinimumPagesPerRun); Target = max(Target, (LONG) MiMinimumPagesPerRun);
for (i = 0; i < MC_MAXIMUM && Target > 0; i++) for (i = 0; i < MC_MAXIMUM && Target > 0; i++)
@ -203,7 +199,6 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait,
PHYSICAL_ADDRESS* AllocatedPage) PHYSICAL_ADDRESS* AllocatedPage)
{ {
ULONG OldUsed; ULONG OldUsed;
ULONG OldAvailable;
PHYSICAL_ADDRESS Page; PHYSICAL_ADDRESS Page;
KIRQL oldIrql; KIRQL oldIrql;
@ -222,7 +217,6 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait,
MiTrimMemoryConsumer(Consumer); MiTrimMemoryConsumer(Consumer);
} }
OldAvailable = InterlockedDecrement((LONG *)&MiNrAvailablePages);
/* /*
* Allocate always memory for the non paged pool and for the pager thread. * Allocate always memory for the non paged pool and for the pager thread.
*/ */
@ -241,7 +235,7 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait,
KEBUGCHECK(0); KEBUGCHECK(0);
} }
*AllocatedPage = Page; *AllocatedPage = Page;
if (OldAvailable < MiMinimumAvailablePages && if (MmStats.NrFreePages <= MiMinimumAvailablePages &&
MiBalancerThreadHandle != NULL) MiBalancerThreadHandle != NULL)
{ {
KeSetEvent(&MiBalancerEvent, IO_NO_INCREMENT, FALSE); KeSetEvent(&MiBalancerEvent, IO_NO_INCREMENT, FALSE);
@ -252,13 +246,12 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait,
/* /*
* Make sure we don't exceed global targets. * Make sure we don't exceed global targets.
*/ */
if (OldAvailable < MiMinimumAvailablePages) if (MmStats.NrFreePages <= MiMinimumAvailablePages)
{ {
MM_ALLOCATION_REQUEST Request; MM_ALLOCATION_REQUEST Request;
if (!CanWait) if (!CanWait)
{ {
InterlockedIncrement((LONG *)&MiNrAvailablePages);
InterlockedDecrement((LONG *)&MiMemoryConsumers[Consumer].PagesUsed); InterlockedDecrement((LONG *)&MiMemoryConsumers[Consumer].PagesUsed);
return(STATUS_NO_MEMORY); return(STATUS_NO_MEMORY);
} }
@ -357,7 +350,7 @@ MiBalancerThread(PVOID Unused)
{ {
/* MiBalancerEvent */ /* MiBalancerEvent */
CHECKPOINT; CHECKPOINT;
while (MiNrAvailablePages < MiMinimumAvailablePages + 5) while (MmStats.NrFreePages < MiMinimumAvailablePages + 5)
{ {
for (i = 0; i < MC_MAXIMUM; i++) for (i = 0; i < MC_MAXIMUM; i++)
{ {
@ -378,7 +371,7 @@ MiBalancerThread(PVOID Unused)
else if (Status == STATUS_SUCCESS + 1) else if (Status == STATUS_SUCCESS + 1)
{ {
/* MiBalancerTimer */ /* MiBalancerTimer */
ShouldRun = MiNrAvailablePages < MiMinimumAvailablePages + 5 ? TRUE : FALSE; ShouldRun = MmStats.NrFreePages < MiMinimumAvailablePages + 5 ? TRUE : FALSE;
for (i = 0; i < MC_MAXIMUM; i++) for (i = 0; i < MC_MAXIMUM; i++)
{ {
if (MiMemoryConsumers[i].Trim != NULL) if (MiMemoryConsumers[i].Trim != NULL)