ULONG VioScsiAcquireSpinLock( IN PVOID DeviceExtension, IN ULONG MessageID, IN PSTOR_LOCK_HANDLE LockHandle ) { PADAPTER_EXTENSION adaptExt; ULONG status = STOR_STATUS_SUCCESS; ENTER_FN(); adaptExt = (PADAPTER_EXTENSION)DeviceExtension; if (adaptExt->num_queues > 1) { ULONG oldIrql = 0; status = StorPortAcquireMSISpinLock(DeviceExtension, MessageID, &oldIrql); LockHandle->Context.OldIrql = (KIRQL)oldIrql; if (status != STOR_STATUS_SUCCESS) { RhelDbgPrint(TRACE_LEVEL_ERROR, ("%s StorPortAcquireMSISpinLock returned status 0x%x\n", __FUNCTION__, status)); } } else { StorPortAcquireSpinLock(DeviceExtension, InterruptLock, NULL, LockHandle); } return status; EXIT_FN(); }
VOID VioStorVQLock( IN PVOID DeviceExtension, IN ULONG MessageID, IN OUT PSTOR_LOCK_HANDLE LockHandle, IN BOOLEAN isr ) { PADAPTER_EXTENSION adaptExt; RhelDbgPrint(TRACE_LEVEL_VERBOSE, ("--->%s MessageID = %d\n", __FUNCTION__, MessageID)); adaptExt = (PADAPTER_EXTENSION)DeviceExtension; if (!adaptExt->msix_enabled) { if (!isr) { StorPortAcquireSpinLock(DeviceExtension, InterruptLock, NULL, LockHandle); } } else { if ((adaptExt->num_queues == 1) || (!CHECKFLAG(adaptExt->perfFlags, STOR_PERF_CONCURRENT_CHANNELS))) { if (!isr) { ULONG oldIrql = 0; StorPortAcquireMSISpinLock(DeviceExtension, (adaptExt->msix_one_vector ? 0 : MessageID), &oldIrql); LockHandle->Context.OldIrql = (KIRQL)oldIrql; } } else { NT_ASSERT(MessageID > 0); NT_ASSERT(MessageID <= adaptExt->num_queues); StorPortAcquireSpinLock(DeviceExtension, StartIoLock, &adaptExt->dpc[MessageID - 1], LockHandle); } } RhelDbgPrint(TRACE_LEVEL_VERBOSE, ("<---%s MessageID = %d\n", __FUNCTION__, MessageID)); }
VOID CompleteDpcRoutine( IN PSTOR_DPC Dpc, IN PVOID Context, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ) { STOR_LOCK_HANDLE LockHandle; PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION)Context; #ifdef MSI_SUPPORTED ULONG MessageID = PtrToUlong(SystemArgument1); ULONG OldIrql; #endif #ifdef MSI_SUPPORTED if(adaptExt->msix_vectors) { StorPortAcquireMSISpinLock (Context, MessageID, &OldIrql); } else { #endif StorPortAcquireSpinLock ( Context, InterruptLock , NULL, &LockHandle); #ifdef MSI_SUPPORTED } #endif while (!IsListEmpty(&adaptExt->complete_list)) { PSCSI_REQUEST_BLOCK Srb; PRHEL_SRB_EXTENSION srbExt; pblk_req vbr; vbr = (pblk_req) RemoveHeadList(&adaptExt->complete_list); Srb = (PSCSI_REQUEST_BLOCK)vbr->req; srbExt = (PRHEL_SRB_EXTENSION)Srb->SrbExtension; #ifdef MSI_SUPPORTED if(adaptExt->msix_vectors) { StorPortReleaseMSISpinLock (Context, MessageID, OldIrql); } else { #endif StorPortReleaseSpinLock (Context, &LockHandle); #ifdef MSI_SUPPORTED } #endif if (Srb->DataTransferLength > srbExt->Xfer) { Srb->DataTransferLength = srbExt->Xfer; Srb->SrbStatus = SRB_STATUS_DATA_OVERRUN; } ScsiPortNotification(RequestComplete, Context, Srb); #ifdef MSI_SUPPORTED if(adaptExt->msix_vectors) { StorPortAcquireMSISpinLock (Context, MessageID, &OldIrql); } else { #endif StorPortAcquireSpinLock ( Context, InterruptLock , NULL, &LockHandle); #ifdef MSI_SUPPORTED } #endif } #ifdef MSI_SUPPORTED if(adaptExt->msix_vectors) { StorPortReleaseMSISpinLock (Context, MessageID, OldIrql); } else { #endif StorPortReleaseSpinLock (Context, &LockHandle); #ifdef MSI_SUPPORTED } #endif return; }