- Used interlocked functions to modify the values for the ipi functions on smp machines. Modified: trunk/reactos/ntoskrnl/include/internal/ke.h Modified: trunk/reactos/ntoskrnl/ke/ipi.c _____
Modified: trunk/reactos/ntoskrnl/include/internal/ke.h --- trunk/reactos/ntoskrnl/include/internal/ke.h 2005-01-01 11:18:54 UTC (rev 12688) +++ trunk/reactos/ntoskrnl/include/internal/ke.h 2005-01-01 11:22:12 UTC (rev 12689) @@ -43,9 +43,9 @@
struct _KPCR; struct _KEXCEPTION_FRAME;
-#define IPI_REQUEST_FUNCTIONCALL 1 -#define IPI_REQUEST_APC 2 -#define IPI_REQUEST_DPC 4 +#define IPI_REQUEST_FUNCTIONCALL 0 +#define IPI_REQUEST_APC 1 +#define IPI_REQUEST_DPC 2
/* ipi.c ********************************************************************/
_____
Modified: trunk/reactos/ntoskrnl/ke/ipi.c --- trunk/reactos/ntoskrnl/ke/ipi.c 2005-01-01 11:18:54 UTC (rev 12688) +++ trunk/reactos/ntoskrnl/ke/ipi.c 2005-01-01 11:22:12 UTC (rev 12689) @@ -1,4 +1,4 @@
-/* $Id: ipi.c,v 1.5 2004/12/24 17:06:58 navaraf Exp $ +/* $Id$ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -33,7 +33,7 @@ if (TargetSet & (1 << i)) { Pcr = (PKPCR)(KPCR_BASE + i * PAGE_SIZE); - Pcr->PrcbData.IpiFrozen |= IpiRequest; + Ke386TestAndSetBit(IpiRequest, &Pcr->PrcbData.IpiFrozen); HalRequestIpi(i); } } @@ -51,8 +51,6 @@ LARGE_INTEGER StartTime, CurrentTime, Frequency; ULONG Count = 5; #endif - ULONG TargetSet, Processor; - PKPCR Pcr;
ASSERT(KeGetCurrentIrql() == IPI_LEVEL); @@ -61,23 +59,21 @@
Pcr = KeGetCurrentKPCR();
- if (Pcr->PrcbData.IpiFrozen & IPI_REQUEST_APC) + if (Ke386TestAndClearBit(IPI_REQUEST_APC, &Pcr->PrcbData.IpiFrozen)) { - Pcr->PrcbData.IpiFrozen &= ~IPI_REQUEST_APC; HalRequestSoftwareInterrupt(APC_LEVEL); }
- if (Pcr->PrcbData.IpiFrozen & IPI_REQUEST_DPC) + if (Ke386TestAndClearBit(IPI_REQUEST_DPC, &Pcr->PrcbData.IpiFrozen)) { - Pcr->PrcbData.IpiFrozen &= ~IPI_REQUEST_DPC; Pcr->PrcbData.DpcInterruptRequested = TRUE; HalRequestSoftwareInterrupt(DISPATCH_LEVEL); }
- if (Pcr->PrcbData.IpiFrozen & IPI_REQUEST_FUNCTIONCALL) + if (Ke386TestAndClearBit(IPI_REQUEST_FUNCTIONCALL, &Pcr->PrcbData.IpiFrozen)) {
InterlockedDecrementUL(&Pcr->PrcbData.SignalDone->CurrentPacket[1]); - if (Pcr->PrcbData.SignalDone->CurrentPacket[2]) + if (InterlockedCompareExchangeUL(&Pcr->PrcbData.SignalDone->CurrentPacket[2 ], 0, 0)) { #ifdef DBG StartTime = KeQueryPerformanceCounter(&Frequency); @@ -88,20 +84,16 @@ CurrentTime = KeQueryPerformanceCounter(NULL); if (CurrentTime.QuadPart > StartTime.QuadPart + Count * Frequency.QuadPart) { - DPRINT1("Waiting longer than %d seconds to start the ipi routine\n", Count); + DbgPrint("(%s:%d) CPU%d, waiting longer than %d seconds to start the ipi routine\n", __FILE__,__LINE__, KeGetCurrentProcessorNumber(), Count); KEBUGCHECK(0); } #endif } } ((VOID STDCALL(*)(PVOID))(Pcr->PrcbData.SignalDone->WorkerRoutine))(Pcr->PrcbDa ta.SignalDone->CurrentPacket[0]); - do + Ke386TestAndClearBit(KeGetCurrentProcessorNumber(), &Pcr->PrcbData.SignalDone->TargetSet); + if (InterlockedCompareExchangeUL(&Pcr->PrcbData.SignalDone->CurrentPacket[2 ], 0, 0)) { - Processor = 1 << KeGetCurrentProcessorNumber(); - TargetSet = Pcr->PrcbData.SignalDone->TargetSet; - } while (Processor & InterlockedCompareExchangeUL(&Pcr->PrcbData.SignalDone->TargetSet, TargetSet & ~Processor, TargetSet)); - if (Pcr->PrcbData.SignalDone->CurrentPacket[2]) - { #ifdef DBG StartTime = KeQueryPerformanceCounter(&Frequency); #endif @@ -111,14 +103,13 @@ CurrentTime = KeQueryPerformanceCounter(NULL); if (CurrentTime.QuadPart > StartTime.QuadPart + Count * Frequency.QuadPart) { - DPRINT1("Waiting longer than %d seconds after executing the ipi routine\n", Count); + DbgPrint("(%s:%d) CPU%d, waiting longer than %d seconds after executing the ipi routine\n", __FILE__,__LINE__, KeGetCurrentProcessorNumber(), Count); KEBUGCHECK(0); } #endif } } InterlockedExchangePointer(&Pcr->PrcbData.SignalDone, NULL); - Pcr->PrcbData.IpiFrozen &= ~IPI_REQUEST_FUNCTIONCALL; } DPRINT("KiIpiServiceRoutine done\n"); return TRUE; @@ -136,11 +127,11 @@ ASSERT(KeGetCurrentIrql() == SYNCH_LEVEL);
CurrentPcr = KeGetCurrentKPCR(); - CurrentPcr->PrcbData.TargetSet = TargetSet; - CurrentPcr->PrcbData.WorkerRoutine = (ULONG_PTR)WorkerRoutine; - CurrentPcr->PrcbData.CurrentPacket[0] = Argument; - CurrentPcr->PrcbData.CurrentPacket[1] = (PVOID)Count; - CurrentPcr->PrcbData.CurrentPacket[2] = (PVOID)(ULONG)Synchronize; + InterlockedExchangeUL(&CurrentPcr->PrcbData.TargetSet, TargetSet); + InterlockedExchangeUL(&CurrentPcr->PrcbData.WorkerRoutine, (ULONG_PTR)WorkerRoutine); + InterlockedExchangePointer(&CurrentPcr->PrcbData.CurrentPacket[0], Argument); + InterlockedExchangeUL(&CurrentPcr->PrcbData.CurrentPacket[1], Count); + InterlockedExchangeUL(&CurrentPcr->PrcbData.CurrentPacket[2], Synchronize ? 1 : 0);
CurrentProcessor = 1 << KeGetCurrentProcessorNumber();
@@ -150,7 +141,7 @@ { Pcr = (PKPCR)(KPCR_BASE + i * PAGE_SIZE); while(0 != InterlockedCompareExchangeUL(&Pcr->PrcbData.SignalDone, (LONG)&CurrentPcr->PrcbData, 0)); - Pcr->PrcbData.IpiFrozen |= IPI_REQUEST_FUNCTIONCALL; + Ke386TestAndSetBit(IPI_REQUEST_FUNCTIONCALL, &Pcr->PrcbData.IpiFrozen); if (Processor != CurrentProcessor) { HalRequestIpi(i);