Skip to content

Commit 99569b3

Browse files
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 <[email protected]>
1 parent 2bcf04f commit 99569b3

File tree

3 files changed

+16
-23
lines changed

3 files changed

+16
-23
lines changed

vioscsi/helper.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ VOID SendSRB(IN PVOID DeviceExtension, IN PSRB_TYPE Srb)
5252
ULONG QueueNumber = VIRTIO_SCSI_REQUEST_QUEUE_0;
5353
BOOLEAN notify = FALSE;
5454
STOR_LOCK_HANDLE LockHandle = {0};
55-
PVOID LockContext;
5655
ULONG status = STOR_STATUS_SUCCESS;
5756
UCHAR ScsiStatus = SCSISTAT_GOOD;
5857
INT add_buffer_req_status = VQ_ADD_BUFFER_SUCCESS;
@@ -107,7 +106,6 @@ VOID SendSRB(IN PVOID DeviceExtension, IN PSRB_TYPE Srb)
107106
}
108107

109108
vq_req_idx = QueueNumber - VIRTIO_SCSI_REQUEST_QUEUE_0;
110-
LockContext = &adaptExt->dpc[vq_req_idx];
111109

112110
if (adaptExt->reset_in_progress)
113111
{
@@ -117,7 +115,7 @@ VOID SendSRB(IN PVOID DeviceExtension, IN PSRB_TYPE Srb)
117115
return;
118116
}
119117

120-
StorPortAcquireSpinLock(DeviceExtension, DpcLock, LockContext, &LockHandle);
118+
StorPortAcquireSpinLock(DeviceExtension, DpcLock, &adaptExt->dpc[vq_req_idx], &LockHandle);
121119
SET_VA_PA();
122120
add_buffer_req_status = virtqueue_add_buf(adaptExt->vq[QueueNumber],
123121
srbExt->psgl,

vioscsi/helper.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ SynchronizedKickEventRoutine(IN PVOID DeviceExtension, IN PVOID Context);
130130

131131
VOID VioScsiCompleteDpcRoutine(IN PSTOR_DPC Dpc, IN PVOID Context, IN PVOID SystemArgument1, IN PVOID SystemArgument2);
132132

133-
VOID ProcessBuffer(IN PVOID DeviceExtension, IN ULONG MessageId, IN STOR_SPINLOCK LockMode);
133+
VOID ProcessBuffer(IN PVOID DeviceExtension, IN ULONG MessageId, IN BOOLEAN DumpModeNoSync);
134134

135135
VOID
136136
// FORCEINLINE

vioscsi/vioscsi.c

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,7 +1013,7 @@ VioScsiInterrupt(IN PVOID DeviceExtension)
10131013
}
10141014
else
10151015
{
1016-
ProcessBuffer(DeviceExtension, QUEUE_TO_MESSAGE(VIRTIO_SCSI_REQUEST_QUEUE_0), InterruptLock);
1016+
ProcessBuffer(DeviceExtension, QUEUE_TO_MESSAGE(VIRTIO_SCSI_REQUEST_QUEUE_0), TRUE);
10171017
}
10181018
}
10191019

@@ -1243,14 +1243,12 @@ VioScsiUnitControl(IN PVOID DeviceExtension, IN SCSI_UNIT_CONTROL_TYPE ControlTy
12431243
ULONG vq_req_idx;
12441244
PREQUEST_LIST element;
12451245
STOR_LOCK_HANDLE LockHandle = {0};
1246-
PVOID LockContext = NULL; // sanity check for LockMode = InterruptLock or StartIoLock
12471246
PSTOR_ADDR_BTL8 stor_addr = (PSTOR_ADDR_BTL8)Parameters;
12481247

12491248
for (vq_req_idx = 0; vq_req_idx < adaptExt->num_queues; vq_req_idx++)
12501249
{
12511250
element = &adaptExt->processing_srbs[vq_req_idx];
1252-
LockContext = &adaptExt->dpc[vq_req_idx];
1253-
StorPortAcquireSpinLock(DeviceExtension, DpcLock, LockContext, &LockHandle);
1251+
StorPortAcquireSpinLock(DeviceExtension, DpcLock, &adaptExt->dpc[vq_req_idx], &LockHandle);
12541252
if (!IsListEmpty(&element->srb_list))
12551253
{
12561254
PLIST_ENTRY entry = element->srb_list.Flink;
@@ -1414,14 +1412,14 @@ VOID FORCEINLINE DispatchQueue(IN PVOID DeviceExtension, IN ULONG MessageId)
14141412
&adaptExt->dpc[MessageId - QUEUE_TO_MESSAGE(VIRTIO_SCSI_REQUEST_QUEUE_0)],
14151413
ULongToPtr(MessageId),
14161414
ULongToPtr(MessageId));
1417-
EXIT_FN();
1418-
return;
1415+
} else
1416+
{
1417+
ProcessBuffer(DeviceExtension, MessageId, TRUE);
14191418
}
1420-
ProcessBuffer(DeviceExtension, MessageId, InterruptLock);
14211419
EXIT_FN();
14221420
}
14231421

1424-
VOID ProcessBuffer(IN PVOID DeviceExtension, IN ULONG MessageId, IN STOR_SPINLOCK LockMode)
1422+
VOID ProcessBuffer(IN PVOID DeviceExtension, IN ULONG MessageId, IN BOOLEAN DumpModeNoSync)
14251423
{
14261424
PVirtIOSCSICmd cmd;
14271425
unsigned int len;
@@ -1433,7 +1431,6 @@ VOID ProcessBuffer(IN PVOID DeviceExtension, IN ULONG MessageId, IN STOR_SPINLOC
14331431
PSRB_EXTENSION srbExt = NULL;
14341432
PREQUEST_LIST element;
14351433
ULONG vq_req_idx;
1436-
PVOID LockContext = NULL; // sanity check for LockMode = InterruptLock or StartIoLock
14371434

14381435
ENTER_FN();
14391436

@@ -1448,12 +1445,9 @@ VOID ProcessBuffer(IN PVOID DeviceExtension, IN ULONG MessageId, IN STOR_SPINLOC
14481445

14491446
vq = adaptExt->vq[QueueNumber];
14501447

1451-
if (LockMode == DpcLock)
1452-
{
1453-
LockContext = &adaptExt->dpc[vq_req_idx];
1448+
if (!DumpModeNoSync) {
1449+
StorPortAcquireSpinLock(DeviceExtension, DpcLock, &adaptExt->dpc[vq_req_idx], &LockHandle);
14541450
}
1455-
StorPortAcquireSpinLock(DeviceExtension, LockMode, LockContext, &LockHandle);
1456-
14571451
do
14581452
{
14591453
virtqueue_disable_cb(vq);
@@ -1488,7 +1482,9 @@ VOID ProcessBuffer(IN PVOID DeviceExtension, IN ULONG MessageId, IN STOR_SPINLOC
14881482
}
14891483
} while (!virtqueue_enable_cb(vq));
14901484

1491-
StorPortReleaseSpinLock(DeviceExtension, &LockHandle);
1485+
if (!DumpModeNoSync) {
1486+
StorPortReleaseSpinLock(DeviceExtension, &LockHandle);
1487+
}
14921488

14931489
EXIT_FN();
14941490
}
@@ -1499,7 +1495,7 @@ VOID VioScsiCompleteDpcRoutine(IN PSTOR_DPC Dpc, IN PVOID Context, IN PVOID Syst
14991495

15001496
ENTER_FN();
15011497
MessageId = PtrToUlong(SystemArgument1);
1502-
ProcessBuffer(Context, MessageId, DpcLock);
1498+
ProcessBuffer(Context, MessageId, FALSE);
15031499
EXIT_FN();
15041500
}
15051501

@@ -1510,7 +1506,6 @@ VOID CompletePendingRequestsOnReset(IN PVOID DeviceExtension)
15101506
ULONG vq_req_idx;
15111507
PREQUEST_LIST element;
15121508
STOR_LOCK_HANDLE LockHandle = {0};
1513-
PVOID LockContext = NULL; // sanity check for LockMode = InterruptLock or StartIoLock
15141509

15151510
adaptExt = (PADAPTER_EXTENSION)DeviceExtension;
15161511

@@ -1524,8 +1519,8 @@ VOID CompletePendingRequestsOnReset(IN PVOID DeviceExtension)
15241519
{
15251520
element = &adaptExt->processing_srbs[vq_req_idx];
15261521
RhelDbgPrint(TRACE_LEVEL_FATAL, " queue %d cnt %d\n", vq_req_idx, element->srb_cnt);
1527-
LockContext = &adaptExt->dpc[vq_req_idx];
1528-
StorPortAcquireSpinLock(DeviceExtension, DpcLock, LockContext, &LockHandle);
1522+
1523+
StorPortAcquireSpinLock(DeviceExtension, DpcLock, &adaptExt->dpc[vq_req_idx], &LockHandle);
15291524
while (!IsListEmpty(&element->srb_list))
15301525
{
15311526
PLIST_ENTRY entry = RemoveHeadList(&element->srb_list);

0 commit comments

Comments
 (0)