repository: /home/vadimr/shares/kvm-guest-drivers-windows branch: master commit c507d6b279010ff1e1939927d2b2e91a59daac3b Author: Vadim Rozenfeld<vrozenfe@xxxxxxxxxx> Date: Thu Sep 24 22:03:00 2009 +0300 [PATCH] viostor driver. Complete SRBs at DPC level Signed-off-by: Vadim Rozenfeld<vrozenfe@xxxxxxxxxx> diff --git a/viostor/virtio_stor.c b/viostor/virtio_stor.c index 297949a..375021b 100644 --- a/viostor/virtio_stor.c +++ b/viostor/virtio_stor.c @@ -30,6 +30,14 @@ VirtIoBuildIo( IN PVOID DeviceExtension, IN PSCSI_REQUEST_BLOCK Srb ); + +VOID +CompleteDpcRoutine( + IN PSTOR_DPC Dpc, + IN PVOID Context, + IN PVOID SystemArgument1, + IN PVOID SystemArgument2 + ) ; #endif BOOLEAN @@ -91,6 +99,13 @@ CompleteSRB( IN PSCSI_REQUEST_BLOCK Srb ); +VOID +FORCEINLINE +CompleteDPC( + IN PVOID DeviceExtension, + IN pblk_req vbr + ); + ULONG DriverEntry( IN PVOID DriverObject, @@ -325,10 +340,28 @@ VirtIoFindAdapter( } InitializeListHead(&adaptExt->list_head); + InitializeListHead(&adaptExt->complete_list); return SP_RETURN_FOUND; } +#ifdef USE_STORPORT +BOOLEAN +VirtIoPassiveInitializeRoutine ( + IN PVOID DeviceExtension + ) +{ + PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION)DeviceExtension; + + StorPortInitializeDpc(DeviceExtension, +&adaptExt->completion_dpc, + CompleteDpcRoutine); + + return TRUE; +} +#endif + + BOOLEAN VirtIoHwInitialize( IN PVOID DeviceExtension @@ -400,6 +433,13 @@ VirtIoHwInitialize( ScsiPortMoveMemory(&adaptExt->inquiry_data.ProductRevisionLevel, "0001", sizeof("0001")); ScsiPortMoveMemory(&adaptExt->inquiry_data.VendorSpecific, "0001", sizeof("0001")); +#ifdef USE_STORPORT + if(!adaptExt->dump_mode) + { + return StorPortEnablePassiveInitialization(DeviceExtension, VirtIoPassiveInitializeRoutine); + } +#endif + return TRUE; } @@ -564,8 +604,7 @@ VirtIoInterrupt( Srb->SrbStatus = SRB_STATUS_ERROR; break; } - RemoveEntryList(&vbr->list_entry); - CompleteSRB(DeviceExtension, Srb); + CompleteDPC(DeviceExtension, vbr); } } RhelDbgPrint(TRACE_LEVEL_VERBOSE, ("%s isInterruptServiced = %d\n", __FUNCTION__, isInterruptServiced)); @@ -974,3 +1013,63 @@ CompleteSRB( Srb->Lun); #endif } + +VOID +FORCEINLINE +CompleteDPC( + IN PVOID DeviceExtension, + IN pblk_req vbr + ) +{ + PSCSI_REQUEST_BLOCK Srb = (PSCSI_REQUEST_BLOCK)vbr->req; + PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION)DeviceExtension; + + RemoveEntryList(&vbr->list_entry); + +#ifdef USE_STORPORT + if(!adaptExt->dump_mode) { + InsertTailList(&adaptExt->complete_list,&vbr->list_entry); + StorPortIssueDpc(DeviceExtension, +&adaptExt->completion_dpc, + NULL, + NULL); + return; + } +#endif + CompleteSRB(DeviceExtension, Srb); +} + + +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; + + StorPortAcquireSpinLock ( Context, InterruptLock , NULL,&LockHandle); + + while (!IsListEmpty(&adaptExt->complete_list)) { + PSCSI_REQUEST_BLOCK Srb; + pblk_req vbr; + vbr = (pblk_req) RemoveHeadList(&adaptExt->complete_list); + Srb = (PSCSI_REQUEST_BLOCK)vbr->req; + + StorPortReleaseSpinLock (Context,&LockHandle); + + ScsiPortNotification(RequestComplete, + Context, + Srb); + + StorPortAcquireSpinLock ( Context, InterruptLock , NULL,&LockHandle); + + } + + StorPortReleaseSpinLock (Context,&LockHandle); + + return; +} diff --git a/viostor/virtio_stor.h b/viostor/virtio_stor.h index 2d98738..2533148 100644 --- a/viostor/virtio_stor.h +++ b/viostor/virtio_stor.h @@ -95,6 +95,8 @@ typedef struct _ADAPTER_EXTENSION { ULONG queue_depth; BOOLEAN dump_mode; LIST_ENTRY list_head; + LIST_ENTRY complete_list; + STOR_DPC completion_dpc; }ADAPTER_EXTENSION, *PADAPTER_EXTENSION; typedef struct _RHEL_SRB_EXTENSION { -- To unsubscribe from this list: send the line "unsubscribe kvm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/viostor/virtio_stor.c b/viostor/virtio_stor.c index 297949a..375021b 100644 --- a/viostor/virtio_stor.c +++ b/viostor/virtio_stor.c @@ -30,6 +30,14 @@ VirtIoBuildIo( IN PVOID DeviceExtension, IN PSCSI_REQUEST_BLOCK Srb ); + +VOID +CompleteDpcRoutine( + IN PSTOR_DPC Dpc, + IN PVOID Context, + IN PVOID SystemArgument1, + IN PVOID SystemArgument2 + ) ; #endif BOOLEAN @@ -91,6 +99,13 @@ CompleteSRB( IN PSCSI_REQUEST_BLOCK Srb ); +VOID +FORCEINLINE +CompleteDPC( + IN PVOID DeviceExtension, + IN pblk_req vbr + ); + ULONG DriverEntry( IN PVOID DriverObject, @@ -325,10 +340,28 @@ VirtIoFindAdapter( } InitializeListHead(&adaptExt->list_head); + InitializeListHead(&adaptExt->complete_list); return SP_RETURN_FOUND; } +#ifdef USE_STORPORT +BOOLEAN +VirtIoPassiveInitializeRoutine ( + IN PVOID DeviceExtension + ) +{ + PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION)DeviceExtension; + + StorPortInitializeDpc(DeviceExtension, + &adaptExt->completion_dpc, + CompleteDpcRoutine); + + return TRUE; +} +#endif + + BOOLEAN VirtIoHwInitialize( IN PVOID DeviceExtension @@ -400,6 +433,13 @@ VirtIoHwInitialize( ScsiPortMoveMemory(&adaptExt->inquiry_data.ProductRevisionLevel, "0001", sizeof("0001")); ScsiPortMoveMemory(&adaptExt->inquiry_data.VendorSpecific, "0001", sizeof("0001")); +#ifdef USE_STORPORT + if(!adaptExt->dump_mode) + { + return StorPortEnablePassiveInitialization(DeviceExtension, VirtIoPassiveInitializeRoutine); + } +#endif + return TRUE; } @@ -564,8 +604,7 @@ VirtIoInterrupt( Srb->SrbStatus = SRB_STATUS_ERROR; break; } - RemoveEntryList(&vbr->list_entry); - CompleteSRB(DeviceExtension, Srb); + CompleteDPC(DeviceExtension, vbr); } } RhelDbgPrint(TRACE_LEVEL_VERBOSE, ("%s isInterruptServiced = %d\n", __FUNCTION__, isInterruptServiced)); @@ -974,3 +1013,63 @@ CompleteSRB( Srb->Lun); #endif } + +VOID +FORCEINLINE +CompleteDPC( + IN PVOID DeviceExtension, + IN pblk_req vbr + ) +{ + PSCSI_REQUEST_BLOCK Srb = (PSCSI_REQUEST_BLOCK)vbr->req; + PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION)DeviceExtension; + + RemoveEntryList(&vbr->list_entry); + +#ifdef USE_STORPORT + if(!adaptExt->dump_mode) { + InsertTailList(&adaptExt->complete_list, &vbr->list_entry); + StorPortIssueDpc(DeviceExtension, + &adaptExt->completion_dpc, + NULL, + NULL); + return; + } +#endif + CompleteSRB(DeviceExtension, Srb); +} + + +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; + + StorPortAcquireSpinLock ( Context, InterruptLock , NULL, &LockHandle); + + while (!IsListEmpty(&adaptExt->complete_list)) { + PSCSI_REQUEST_BLOCK Srb; + pblk_req vbr; + vbr = (pblk_req) RemoveHeadList(&adaptExt->complete_list); + Srb = (PSCSI_REQUEST_BLOCK)vbr->req; + + StorPortReleaseSpinLock (Context, &LockHandle); + + ScsiPortNotification(RequestComplete, + Context, + Srb); + + StorPortAcquireSpinLock ( Context, InterruptLock , NULL, &LockHandle); + + } + + StorPortReleaseSpinLock (Context, &LockHandle); + + return; +} diff --git a/viostor/virtio_stor.h b/viostor/virtio_stor.h index 2d98738..2533148 100644 --- a/viostor/virtio_stor.h +++ b/viostor/virtio_stor.h @@ -95,6 +95,8 @@ typedef struct _ADAPTER_EXTENSION { ULONG queue_depth; BOOLEAN dump_mode; LIST_ENTRY list_head; + LIST_ENTRY complete_list; + STOR_DPC completion_dpc; }ADAPTER_EXTENSION, *PADAPTER_EXTENSION; typedef struct _RHEL_SRB_EXTENSION {