>From 3fbee0ab3165657626828f661244ad3145d8b7dc Mon Sep 17 00:00:00 2001 From: Vadim Rozenfeld Date: Sun, 14 Sep 2014 18:57:48 +1000 Subject: [PATCH 1/1] queue depth 254 (cherry picked from commit 540b638bf86bad908b4b7527fdfc634ddca3f0e8) --- vioscsi/helper.c | 52 ++++++++++++++++++++++++++++++++++++++++++++-------- vioscsi/helper.h | 7 ++++++- vioscsi/vioscsi.c | 40 ++++++++++++++++------------------------ vioscsi/vioscsi.h | 6 +++++- 4 files changed, 71 insertions(+), 34 deletions(-) mode change 100644 => 100755 vioscsi/helper.c mode change 100644 => 100755 vioscsi/helper.h mode change 100644 => 100755 vioscsi/vioscsi.c mode change 100644 => 100755 vioscsi/vioscsi.h diff --git a/vioscsi/helper.c b/vioscsi/helper.c old mode 100644 new mode 100755 index dcbb8d9..6cd6217 --- a/vioscsi/helper.c +++ b/vioscsi/helper.c @@ -37,28 +37,60 @@ SynchronizedSRBRoutine( ENTER_FN(); SET_VA_PA(); - if (virtqueue_add_buf(adaptExt->vq[2], + if (IsListEmpty(&adaptExt->list_head) && virtqueue_add_buf(adaptExt->vq[2], &srbExt->sg[0], srbExt->out, srbExt->in, &srbExt->cmd, va, pa) >= 0){ - virtqueue_kick(adaptExt->vq[2]); +// virtqueue_kick(adaptExt->vq[2]); return TRUE; } - Srb->SrbStatus = SRB_STATUS_BUSY; - StorPortBusy(DeviceExtension, 2); - virtqueue_kick(adaptExt->vq[2]); -EXIT_ERR(); + InsertTailList(&adaptExt->list_head, &srbExt->list_entry); return FALSE; } -BOOLEAN +VOID +ResendSRB( + IN PVOID DeviceExtension + ) +{ + PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION)DeviceExtension; + PVOID va; + ULONGLONG pa; + BOOLEAN kick = FALSE; + while (!IsListEmpty(&adaptExt->list_head)) { + PSCSI_REQUEST_BLOCK Srb; + PSRB_EXTENSION srbExt; + srbExt = (PSRB_EXTENSION)RemoveHeadList(&adaptExt->list_head); + Srb = (PSCSI_REQUEST_BLOCK)srbExt->Srb; + + SET_VA_PA(); + + if (virtqueue_add_buf(adaptExt->vq[2], + &srbExt->sg[0], + srbExt->out, srbExt->in, + &srbExt->cmd, va, pa) >= 0) { + kick = TRUE; + } else { + InsertHeadList(&adaptExt->list_head, &srbExt->list_entry); + return; + } + } + if (kick) { + virtqueue_kick(adaptExt->vq[2]); + } +} + +VOID SendSRB( IN PVOID DeviceExtension, IN PSCSI_REQUEST_BLOCK Srb ) { + PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION)DeviceExtension; ENTER_FN(); - return StorPortSynchronizeAccess(DeviceExtension, SynchronizedSRBRoutine, (PVOID)Srb); + if (StorPortSynchronizeAccess(DeviceExtension, SynchronizedSRBRoutine, (PVOID)Srb)) { + virtqueue_kick(adaptExt->vq[2]); + } EXIT_FN(); } @@ -152,6 +184,10 @@ ShutDown( { PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION)DeviceExtension; ENTER_FN(); + while (!IsListEmpty(&adaptExt->list_head)) { + StorPortStallExecution(999); + } + VirtIODeviceReset(&adaptExt->vdev); StorPortWritePortUshort(DeviceExtension, (PUSHORT)(adaptExt->device_base + VIRTIO_PCI_GUEST_FEATURES), 0); if (adaptExt->vq[0]) { diff --git a/vioscsi/helper.h b/vioscsi/helper.h old mode 100644 new mode 100755 index b107b42..17e62ef --- a/vioscsi/helper.h +++ b/vioscsi/helper.h @@ -24,12 +24,17 @@ #include "virtio_pci.h" #include "vioscsi.h" -BOOLEAN +VOID SendSRB( IN PVOID DeviceExtension, IN PSCSI_REQUEST_BLOCK Srb ); +VOID +ResendSRB( + IN PVOID DeviceExtension + ); + BOOLEAN SendTMF( IN PVOID DeviceExtension, diff --git a/vioscsi/vioscsi.c b/vioscsi/vioscsi.c old mode 100644 new mode 100755 index e2b2e0d..7e78c72 --- a/vioscsi/vioscsi.c +++ b/vioscsi/vioscsi.c @@ -351,14 +351,7 @@ ENTER_FN(); #else adaptExt->indirect = 0; #endif - - // The windows device queue must be between 20 and 254 for - // StorPortSetDeviceQueueDepth to succeed. - adaptExt->queue_depth = min(254, max(20, (pageNum / 4))); - RhelDbgPrint(TRACE_LEVEL_ERROR, ("breaks_number = %x queue_depth = %x\n", - ConfigInfo->NumberOfPhysicalBreaks, - adaptExt->queue_depth)); - + adaptExt->queue_depth = 254; adaptExt->uncachedExtensionVa = StorPortGetUncachedExtension(DeviceExtension, ConfigInfo, allocationSize); if (!adaptExt->uncachedExtensionVa) { LogError(DeviceExtension, @@ -373,7 +366,7 @@ ENTER_FN(); ASSERT(adaptExt->vq[1] != NULL); ASSERT(adaptExt->vq[2] != NULL); } - + InitializeListHead(&adaptExt->list_head); return SP_RETURN_FOUND; } @@ -520,15 +513,14 @@ VioScsiStartIo( ) { ENTER_FN(); - if (PreProcessRequest(DeviceExtension, Srb) || - !SendSRB(DeviceExtension, Srb)) + if (PreProcessRequest(DeviceExtension, Srb)) { - if(Srb->SrbStatus == SRB_STATUS_PENDING) - { - Srb->SrbStatus = SRB_STATUS_ERROR; - } CompleteRequest(DeviceExtension, Srb); } + else + { + SendSRB(DeviceExtension, Srb); + } EXIT_FN(); return TRUE; } @@ -623,9 +615,9 @@ VioScsiInterrupt( Srb->DataTransferLength = srbExt->Xfer; Srb->SrbStatus = SRB_STATUS_DATA_OVERRUN; } - --adaptExt->in_fly; CompleteRequest(DeviceExtension, Srb); } + ResendSRB(DeviceExtension); if (adaptExt->tmf_infly) { while((cmd = (PVirtIOSCSICmd)virtqueue_get_buf(adaptExt->vq[0], &len)) != NULL) { VirtIOSCSICtrlTMFResp *resp; @@ -814,9 +806,9 @@ VioScsiMSInterrupt ( Srb->DataTransferLength = srbExt->Xfer; Srb->SrbStatus = SRB_STATUS_DATA_OVERRUN; } - --adaptExt->in_fly; CompleteRequest(DeviceExtension, Srb); } + ResendSRB(DeviceExtension); return TRUE; } return FALSE; @@ -938,6 +930,7 @@ ENTER_FN(); RhelDbgPrint(TRACE_LEVEL_VERBOSE, ("<-->%s (%d::%d::%d)\n", DbgGetScsiOpStr(Srb), Srb->PathId, Srb->TargetId, Srb->Lun)); memset(srbExt, 0, sizeof(*srbExt)); + srbExt->Srb = Srb; cmd = &srbExt->cmd; cmd->sc = Srb; @@ -1035,13 +1028,12 @@ ENTER_FN(); { case SCSIOP_READ_CAPACITY: case SCSIOP_READ_CAPACITY16: - if (!StorPortSetDeviceQueueDepth( DeviceExtension, Srb->PathId, - Srb->TargetId, Srb->Lun, - adaptExt->queue_depth)) { - RhelDbgPrint(TRACE_LEVEL_ERROR, ("StorPortSetDeviceQueueDepth(%p, %x) failed.\n", - DeviceExtension, - adaptExt->queue_depth)); - } + if (!StorPortSetDeviceQueueDepth(DeviceExtension, Srb->PathId, + Srb->TargetId, Srb->Lun, + adaptExt->queue_depth)) + { + RhelDbgPrint(TRACE_LEVEL_ERROR, ("StorPortSetDeviceQueueDepth failed\n")); + } break; default: break; diff --git a/vioscsi/vioscsi.h b/vioscsi/vioscsi.h old mode 100644 new mode 100755 index 73869a7..45ef911 --- a/vioscsi/vioscsi.h +++ b/vioscsi/vioscsi.h @@ -208,6 +208,8 @@ typedef struct vring_desc_alias #pragma pack(1) typedef struct _SRB_EXTENSION { + LIST_ENTRY list_entry; + PSCSI_REQUEST_BLOCK Srb; ULONG out; ULONG in; ULONG Xfer; @@ -245,9 +247,11 @@ typedef struct _ADAPTER_EXTENSION { TMF_COMMAND tmf_cmd; BOOLEAN tmf_infly; - ULONG in_fly; PVirtIOSCSIEventNode events; + + LIST_ENTRY list_head; + }ADAPTER_EXTENSION, * PADAPTER_EXTENSION; #if (MSI_SUPPORTED == 1) -- 1.9.3