[PATCH] viostor driver. Complete SRBs at DPC level

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




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 {

[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux