[PATCH] Fix IntLock regression in commit 15e64ace. #1291
Closed
MartinCHarvey-Nutanix
started this conversation in
General
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
From 5f088540abe49dd3d5724dbcf9c093307f99a3db Mon Sep 17 00:00:00 2001
From: Martin Harvey martin.harvey@nutanix.com
Date: Fri, 14 Feb 2025 14:18:42 +0000
Subject: [PATCH] Fix IntLock regression in commit 15e64ac.
This corrects interrupt/spinlock acquision code regressed
previously. Locking in the driver is now the same as
prior to that point, and basic functionality is restored.
Initial regression testing has been performed. There are
however, some outstanding questions as to whether the driver
performs correctly in the crashdump/hibernation path.
I will be performing additional regression testing for
those cases, and MSI(X), and issuing further patches
if necessary.
Ref: Nutanix ENG-741981.
Signed-off-by: Martin Harvey martin.harvey@nutanix.com
vioscsi/helper.c | 4 +---
vioscsi/helper.h | 2 +-
vioscsi/vioscsi.c | 33 ++++++++++++++-------------------
3 files changed, 16 insertions(+), 23 deletions(-)
diff --git a/vioscsi/helper.c b/vioscsi/helper.c
index 440c5682..4dfaf685 100644
--- a/vioscsi/helper.c
+++ b/vioscsi/helper.c
@@ -52,7 +52,6 @@ VOID SendSRB(IN PVOID DeviceExtension, IN PSRB_TYPE Srb)
ULONG QueueNumber = VIRTIO_SCSI_REQUEST_QUEUE_0;
BOOLEAN notify = FALSE;
STOR_LOCK_HANDLE LockHandle = {0};
PVOID LockContext;
ULONG status = STOR_STATUS_SUCCESS;
UCHAR ScsiStatus = SCSISTAT_GOOD;
INT add_buffer_req_status = VQ_ADD_BUFFER_SUCCESS;
@@ -107,7 +106,6 @@ VOID SendSRB(IN PVOID DeviceExtension, IN PSRB_TYPE Srb)
}
vq_req_idx = QueueNumber - VIRTIO_SCSI_REQUEST_QUEUE_0;
LockContext = &adaptExt->dpc[vq_req_idx];
if (adaptExt->reset_in_progress)
{
@@ -117,7 +115,7 @@ VOID SendSRB(IN PVOID DeviceExtension, IN PSRB_TYPE Srb)
return;
}
StorPortAcquireSpinLock(DeviceExtension, DpcLock, LockContext, &LockHandle);
SET_VA_PA();
add_buffer_req_status = virtqueue_add_buf(adaptExt->vq[QueueNumber],
srbExt->psgl,
diff --git a/vioscsi/helper.h b/vioscsi/helper.h
index 13f2d2e6..38628278 100644
--- a/vioscsi/helper.h
+++ b/vioscsi/helper.h
@@ -130,7 +130,7 @@ SynchronizedKickEventRoutine(IN PVOID DeviceExtension, IN PVOID Context);
VOID VioScsiCompleteDpcRoutine(IN PSTOR_DPC Dpc, IN PVOID Context, IN PVOID SystemArgument1, IN PVOID SystemArgument2);
-VOID ProcessBuffer(IN PVOID DeviceExtension, IN ULONG MessageId, IN STOR_SPINLOCK LockMode);
+VOID ProcessBuffer(IN PVOID DeviceExtension, IN ULONG MessageId, IN BOOLEAN DumpModeNoSync);
VOID
// FORCEINLINE
diff --git a/vioscsi/vioscsi.c b/vioscsi/vioscsi.c
index c5b51a12..59169c50 100644
--- a/vioscsi/vioscsi.c
+++ b/vioscsi/vioscsi.c
@@ -1013,7 +1013,7 @@ VioScsiInterrupt(IN PVOID DeviceExtension)
}
else
{
@@ -1243,14 +1243,12 @@ VioScsiUnitControl(IN PVOID DeviceExtension, IN SCSI_UNIT_CONTROL_TYPE ControlTy
ULONG vq_req_idx;
PREQUEST_LIST element;
STOR_LOCK_HANDLE LockHandle = {0};
@@ -1414,14 +1412,14 @@ VOID FORCEINLINE DispatchQueue(IN PVOID DeviceExtension, IN ULONG MessageId)
&adaptExt->dpc[MessageId - QUEUE_TO_MESSAGE(VIRTIO_SCSI_REQUEST_QUEUE_0)],
ULongToPtr(MessageId),
ULongToPtr(MessageId));
EXIT_FN();
}
-VOID ProcessBuffer(IN PVOID DeviceExtension, IN ULONG MessageId, IN STOR_SPINLOCK LockMode)
+VOID ProcessBuffer(IN PVOID DeviceExtension, IN ULONG MessageId, IN BOOLEAN DumpModeNoSync)
{
PVirtIOSCSICmd cmd;
unsigned int len;
@@ -1433,7 +1431,6 @@ VOID ProcessBuffer(IN PVOID DeviceExtension, IN ULONG MessageId, IN STOR_SPINLOC
PSRB_EXTENSION srbExt = NULL;
PREQUEST_LIST element;
ULONG vq_req_idx;
PVOID LockContext = NULL; // sanity check for LockMode = InterruptLock or StartIoLock
ENTER_FN();
@@ -1448,12 +1445,9 @@ VOID ProcessBuffer(IN PVOID DeviceExtension, IN ULONG MessageId, IN STOR_SPINLOC
StorPortAcquireSpinLock(DeviceExtension, LockMode, LockContext, &LockHandle);
do
{
virtqueue_disable_cb(vq);
@@ -1488,7 +1482,9 @@ VOID ProcessBuffer(IN PVOID DeviceExtension, IN ULONG MessageId, IN STOR_SPINLOC
}
} while (!virtqueue_enable_cb(vq));
StorPortReleaseSpinLock(DeviceExtension, &LockHandle);
if (!DumpModeNoSync) {
}
EXIT_FN();
}
@@ -1499,7 +1495,7 @@ VOID VioScsiCompleteDpcRoutine(IN PSTOR_DPC Dpc, IN PVOID Context, IN PVOID Syst
ENTER_FN();
MessageId = PtrToUlong(SystemArgument1);
EXIT_FN();
}
@@ -1510,7 +1506,6 @@ VOID CompletePendingRequestsOnReset(IN PVOID DeviceExtension)
ULONG vq_req_idx;
PREQUEST_LIST element;
STOR_LOCK_HANDLE LockHandle = {0};
PVOID LockContext = NULL; // sanity check for LockMode = InterruptLock or StartIoLock
adaptExt = (PADAPTER_EXTENSION)DeviceExtension;
@@ -1524,8 +1519,8 @@ VOID CompletePendingRequestsOnReset(IN PVOID DeviceExtension)
{
element = &adaptExt->processing_srbs[vq_req_idx];
RhelDbgPrint(TRACE_LEVEL_FATAL, " queue %d cnt %d\n", vq_req_idx, element->srb_cnt);
--
2.47.1.windows.2
Beta Was this translation helpful? Give feedback.
All reactions