replace spinlocks with mutex
This commit is contained in:
parent
e04e2d683e
commit
c43d7065b6
@ -2318,7 +2318,7 @@ NTSTATUS VgaDevice::GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo)
|
|||||||
DbgPrint(TRACE_LEVEL_ERROR, ("x86BiosAllocateBuffer failed with Status: 0x%X\n", Status));
|
DbgPrint(TRACE_LEVEL_ERROR, ("x86BiosAllocateBuffer failed with Status: 0x%X\n", Status));
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
DbgPrint(TRACE_LEVEL_ERROR, ("x86BiosAllocateBuffer 0x%x (%x.%x)\n", VbeInfo.VideoModePtr, m_Segment, m_Offset));
|
DbgPrint(TRACE_LEVEL_INFORMATION, ("x86BiosAllocateBuffer 0x%x (%x.%x)\n", VbeInfo.VideoModePtr, m_Segment, m_Offset));
|
||||||
|
|
||||||
Status = x86BiosWriteMemory (m_Segment, m_Offset, "VBE2", 4);
|
Status = x86BiosWriteMemory (m_Segment, m_Offset, "VBE2", 4);
|
||||||
|
|
||||||
@ -2351,9 +2351,9 @@ NTSTATUS VgaDevice::GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo)
|
|||||||
return STATUS_UNSUCCESSFUL;
|
return STATUS_UNSUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
DbgPrint(TRACE_LEVEL_ERROR, ("VBE BIOS Present (%d.%d, %8ld Kb)\n", VbeInfo.Version / 0x100, VbeInfo.Version & 0xFF, VbeInfo.TotalMemory * 64));
|
DbgPrint(TRACE_LEVEL_INFORMATION, ("VBE BIOS Present (%d.%d, %8ld Kb)\n", VbeInfo.Version / 0x100, VbeInfo.Version & 0xFF, VbeInfo.TotalMemory * 64));
|
||||||
DbgPrint(TRACE_LEVEL_ERROR, ("Capabilities = 0x%x\n", VbeInfo.Capabilities));
|
DbgPrint(TRACE_LEVEL_INFORMATION, ("Capabilities = 0x%x\n", VbeInfo.Capabilities));
|
||||||
DbgPrint(TRACE_LEVEL_ERROR, ("VideoModePtr = 0x%x (0x%x.0x%x)\n", VbeInfo.VideoModePtr, HIWORD( VbeInfo.VideoModePtr), LOWORD( VbeInfo.VideoModePtr)));
|
DbgPrint(TRACE_LEVEL_INFORMATION, ("VideoModePtr = 0x%x (0x%x.0x%x)\n", VbeInfo.VideoModePtr, HIWORD( VbeInfo.VideoModePtr), LOWORD( VbeInfo.VideoModePtr)));
|
||||||
|
|
||||||
for (ModeCount = 0; ; ModeCount++)
|
for (ModeCount = 0; ; ModeCount++)
|
||||||
{
|
{
|
||||||
@ -2376,12 +2376,12 @@ NTSTATUS VgaDevice::GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DbgPrint(TRACE_LEVEL_ERROR, ("ModeCount %d\n", ModeCount));
|
DbgPrint(TRACE_LEVEL_INFORMATION, ("ModeCount %d\n", ModeCount));
|
||||||
|
|
||||||
m_ModeInfo = reinterpret_cast<PVIDEO_MODE_INFORMATION> (new (PagedPool) BYTE[sizeof (VIDEO_MODE_INFORMATION) * ModeCount]);
|
m_ModeInfo = reinterpret_cast<PVIDEO_MODE_INFORMATION> (new (PagedPool) BYTE[sizeof (VIDEO_MODE_INFORMATION) * ModeCount]);
|
||||||
m_ModeNumbers = reinterpret_cast<PUSHORT> (new (PagedPool) BYTE [sizeof (USHORT) * ModeCount]);
|
m_ModeNumbers = reinterpret_cast<PUSHORT> (new (PagedPool) BYTE [sizeof (USHORT) * ModeCount]);
|
||||||
m_CurrentMode = 0;
|
m_CurrentMode = 0;
|
||||||
DbgPrint(TRACE_LEVEL_ERROR, ("m_ModeInfo = 0x%p, m_ModeNumbers = 0x%p\n", m_ModeInfo, m_ModeNumbers));
|
DbgPrint(TRACE_LEVEL_INFORMATION, ("m_ModeInfo = 0x%p, m_ModeNumbers = 0x%p\n", m_ModeInfo, m_ModeNumbers));
|
||||||
for (CurrentMode = 0, SuitableModeCount = 0;
|
for (CurrentMode = 0, SuitableModeCount = 0;
|
||||||
CurrentMode < ModeCount;
|
CurrentMode < ModeCount;
|
||||||
CurrentMode++)
|
CurrentMode++)
|
||||||
@ -2398,7 +2398,7 @@ NTSTATUS VgaDevice::GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
DbgPrint(TRACE_LEVEL_ERROR, ("ModeTemp = 0x%X\n", ModeTemp));
|
DbgPrint(TRACE_LEVEL_INFORMATION, ("ModeTemp = 0x%X\n", ModeTemp));
|
||||||
RtlZeroMemory(®s, sizeof(regs));
|
RtlZeroMemory(®s, sizeof(regs));
|
||||||
regs.Eax = 0x4F01;
|
regs.Eax = 0x4F01;
|
||||||
regs.Ecx = ModeTemp;
|
regs.Ecx = ModeTemp;
|
||||||
@ -2442,7 +2442,7 @@ NTSTATUS VgaDevice::GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo)
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_ModeCount = SuitableModeCount;
|
m_ModeCount = SuitableModeCount;
|
||||||
DbgPrint(TRACE_LEVEL_ERROR, ("ModeCount filtered %d\n", m_ModeCount));
|
DbgPrint(TRACE_LEVEL_INFORMATION, ("ModeCount filtered %d\n", m_ModeCount));
|
||||||
for (ULONG idx = 0; idx < m_ModeCount; idx++)
|
for (ULONG idx = 0; idx < m_ModeCount; idx++)
|
||||||
{
|
{
|
||||||
DbgPrint(TRACE_LEVEL_ERROR, ("type %x, XRes = %d, YRes = %d, BPP = %d\n",
|
DbgPrint(TRACE_LEVEL_ERROR, ("type %x, XRes = %d, YRes = %d, BPP = %d\n",
|
||||||
@ -3268,7 +3268,8 @@ BOOL QxlDevice::CreateEvents()
|
|||||||
KeInitializeEvent(&m_IoCmdEvent,
|
KeInitializeEvent(&m_IoCmdEvent,
|
||||||
SynchronizationEvent,
|
SynchronizationEvent,
|
||||||
FALSE);
|
FALSE);
|
||||||
KeInitializeSpinLock(&m_MemLock);
|
KeInitializeMutex(&m_MemLock,1);
|
||||||
|
KeInitializeMutex(&m_CmdLock,1);
|
||||||
|
|
||||||
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
|
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -3540,32 +3541,6 @@ QxlDevice::ExecutePresentDisplayOnly(
|
|||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline
|
|
||||||
KIRQL
|
|
||||||
AcquireSpinLock(PVOID pSpinLock)
|
|
||||||
{
|
|
||||||
KIRQL IRQL;
|
|
||||||
|
|
||||||
IRQL = KeGetCurrentIrql();
|
|
||||||
|
|
||||||
if (DISPATCH_LEVEL == IRQL)
|
|
||||||
KeAcquireSpinLockAtDpcLevel((KSPIN_LOCK *)pSpinLock);
|
|
||||||
else
|
|
||||||
KeAcquireSpinLock((KSPIN_LOCK *)pSpinLock, &IRQL);
|
|
||||||
|
|
||||||
return IRQL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline
|
|
||||||
VOID
|
|
||||||
ReleaseSpinLock(PVOID pSpinLock, KIRQL IRQL)
|
|
||||||
{
|
|
||||||
if (DISPATCH_LEVEL == IRQL)
|
|
||||||
KeReleaseSpinLockFromDpcLevel((KSPIN_LOCK *)pSpinLock);
|
|
||||||
else
|
|
||||||
KeReleaseSpinLock((KSPIN_LOCK *)pSpinLock, IRQL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QxlDevice::WaitForReleaseRing(void)
|
void QxlDevice::WaitForReleaseRing(void)
|
||||||
{
|
{
|
||||||
int wait;
|
int wait;
|
||||||
@ -3652,7 +3627,6 @@ UINT64 QxlDevice::ReleaseOutput(UINT64 output_id)
|
|||||||
void *QxlDevice::AllocMem(UINT32 mspace_type, size_t size, BOOL force)
|
void *QxlDevice::AllocMem(UINT32 mspace_type, size_t size, BOOL force)
|
||||||
{
|
{
|
||||||
PVOID ptr;
|
PVOID ptr;
|
||||||
KIRQL old_irql;
|
|
||||||
|
|
||||||
ASSERT(m_MSInfo[mspace_type]._mspace);
|
ASSERT(m_MSInfo[mspace_type]._mspace);
|
||||||
DbgPrint(TRACE_LEVEL_VERBOSE, ("--->%s: %p(%d) size %u\n", __FUNCTION__,
|
DbgPrint(TRACE_LEVEL_VERBOSE, ("--->%s: %p(%d) size %u\n", __FUNCTION__,
|
||||||
@ -3663,14 +3637,21 @@ void *QxlDevice::AllocMem(UINT32 mspace_type, size_t size, BOOL force)
|
|||||||
mspace_malloc_stats(m_MSInfo[mspace_type]._mspace);
|
mspace_malloc_stats(m_MSInfo[mspace_type]._mspace);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
KeWaitForSingleObject
|
||||||
|
(
|
||||||
|
&m_MemLock,
|
||||||
|
Executive,
|
||||||
|
KernelMode,
|
||||||
|
FALSE,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
/* Release lots of queued resources, before allocating, as we
|
/* Release lots of queued resources, before allocating, as we
|
||||||
want to release early to minimize fragmentation risks. */
|
want to release early to minimize fragmentation risks. */
|
||||||
FlushReleaseRing();
|
FlushReleaseRing();
|
||||||
|
|
||||||
old_irql = AcquireSpinLock(&m_MemLock);
|
|
||||||
ptr = mspace_malloc(m_MSInfo[mspace_type]._mspace, size);
|
ptr = mspace_malloc(m_MSInfo[mspace_type]._mspace, size);
|
||||||
ReleaseSpinLock(&m_MemLock, old_irql);
|
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -3689,6 +3670,7 @@ void *QxlDevice::AllocMem(UINT32 mspace_type, size_t size, BOOL force)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
KeReleaseMutex(&m_MemLock,FALSE);
|
||||||
|
|
||||||
ASSERT((!ptr && !force) || (ptr >= m_MSInfo[mspace_type].mspace_start &&
|
ASSERT((!ptr && !force) || (ptr >= m_MSInfo[mspace_type].mspace_start &&
|
||||||
ptr < m_MSInfo[mspace_type].mspace_end));
|
ptr < m_MSInfo[mspace_type].mspace_end));
|
||||||
@ -3698,7 +3680,6 @@ void *QxlDevice::AllocMem(UINT32 mspace_type, size_t size, BOOL force)
|
|||||||
|
|
||||||
void QxlDevice::FreeMem(UINT32 mspace_type, void *ptr)
|
void QxlDevice::FreeMem(UINT32 mspace_type, void *ptr)
|
||||||
{
|
{
|
||||||
KIRQL old_irql;
|
|
||||||
ASSERT(m_MSInfo[mspace_type]._mspace);
|
ASSERT(m_MSInfo[mspace_type]._mspace);
|
||||||
DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
|
DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
|
||||||
|
|
||||||
@ -3710,9 +3691,16 @@ void QxlDevice::FreeMem(UINT32 mspace_type, void *ptr)
|
|||||||
m_MSInfo[mspace_type].mspace_end, mspace_type));
|
m_MSInfo[mspace_type].mspace_end, mspace_type));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
old_irql = AcquireSpinLock(&m_MemLock);
|
KeWaitForSingleObject
|
||||||
|
(
|
||||||
|
&m_MemLock,
|
||||||
|
Executive,
|
||||||
|
KernelMode,
|
||||||
|
FALSE,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
mspace_free(m_MSInfo[mspace_type]._mspace, ptr);
|
mspace_free(m_MSInfo[mspace_type]._mspace, ptr);
|
||||||
ReleaseSpinLock(&m_MemLock, old_irql);
|
KeReleaseMutex(&m_MemLock,FALSE);
|
||||||
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
|
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3851,11 +3839,20 @@ void QxlDevice::PushDrawable(QXLDrawable *drawable) {
|
|||||||
QXLCommand *cmd;
|
QXLCommand *cmd;
|
||||||
DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
|
DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s\n", __FUNCTION__));
|
||||||
|
|
||||||
|
KeWaitForSingleObject
|
||||||
|
(
|
||||||
|
&m_CmdLock,
|
||||||
|
Executive,
|
||||||
|
KernelMode,
|
||||||
|
FALSE,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
WaitForCmdRing();
|
WaitForCmdRing();
|
||||||
cmd = SPICE_RING_PROD_ITEM(m_CommandRing);
|
cmd = SPICE_RING_PROD_ITEM(m_CommandRing);
|
||||||
cmd->type = QXL_CMD_DRAW;
|
cmd->type = QXL_CMD_DRAW;
|
||||||
cmd->data = PA(drawable, m_MainMemSlot);
|
cmd->data = PA(drawable, m_MainMemSlot);
|
||||||
PushCmd();
|
PushCmd();
|
||||||
|
KeReleaseMutex(&m_CmdLock,FALSE);
|
||||||
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
|
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4094,7 +4091,7 @@ VOID QxlDevice::DpcRoutine(PVOID ptr)
|
|||||||
{
|
{
|
||||||
PDXGKRNL_INTERFACE pDxgkInterface = (PDXGKRNL_INTERFACE)ptr;
|
PDXGKRNL_INTERFACE pDxgkInterface = (PDXGKRNL_INTERFACE)ptr;
|
||||||
|
|
||||||
DbgPrint(TRACE_LEVEL_FATAL, ("---> %s\n", __FUNCTION__));
|
DbgPrint(TRACE_LEVEL_INFORMATION, ("---> %s\n", __FUNCTION__));
|
||||||
DPC_CB_CONTEXT ctx;
|
DPC_CB_CONTEXT ctx;
|
||||||
BOOLEAN dummy;
|
BOOLEAN dummy;
|
||||||
ctx.ptr = this;
|
ctx.ptr = this;
|
||||||
@ -4121,7 +4118,7 @@ VOID QxlDevice::DpcRoutine(PVOID ptr)
|
|||||||
m_RamHdr->int_mask = QXL_INTERRUPT_MASK;
|
m_RamHdr->int_mask = QXL_INTERRUPT_MASK;
|
||||||
WRITE_PORT_UCHAR((PUCHAR)(m_IoBase + QXL_IO_UPDATE_IRQ), 0);
|
WRITE_PORT_UCHAR((PUCHAR)(m_IoBase + QXL_IO_UPDATE_IRQ), 0);
|
||||||
|
|
||||||
DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
|
DbgPrint(TRACE_LEVEL_INFORMATION, ("<--- %s\n", __FUNCTION__));
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID QxlDevice::UpdateArea(RECTL *area, UINT32 surface_id)
|
VOID QxlDevice::UpdateArea(RECTL *area, UINT32 surface_id)
|
||||||
|
@ -523,7 +523,9 @@ private:
|
|||||||
PUCHAR m_LogPort;
|
PUCHAR m_LogPort;
|
||||||
PUCHAR m_LogBuf;
|
PUCHAR m_LogBuf;
|
||||||
|
|
||||||
KSPIN_LOCK m_MemLock;
|
KMUTEX m_MemLock;
|
||||||
|
KMUTEX m_CmdLock;
|
||||||
|
|
||||||
MspaceInfo m_MSInfo[NUM_MSPACES];
|
MspaceInfo m_MSInfo[NUM_MSPACES];
|
||||||
|
|
||||||
UINT64 m_FreeOutputs;
|
UINT64 m_FreeOutputs;
|
||||||
|
Loading…
Reference in New Issue
Block a user