From 4cc183197db378f8f795394cadc95088fb18252f Mon Sep 17 00:00:00 2001 From: Vadim Rozenfeld Date: Wed, 18 Jun 2025 13:23:52 +1000 Subject: [PATCH 1/7] Revert "NO-SDV [vioscsi] Reduce spinlock management complexity" This reverts commit 15e64acef5d5ca30418e29fe8ef6e1f6fe66c217. --- vioscsi/helper.c | 49 +++++++++++++++++++++++--- vioscsi/helper.h | 13 ++++++- vioscsi/vioscsi.c | 87 +++++++++++++++++++++-------------------------- 3 files changed, 95 insertions(+), 54 deletions(-) diff --git a/vioscsi/helper.c b/vioscsi/helper.c index 779aedd6c..6acc8e804 100644 --- a/vioscsi/helper.c +++ b/vioscsi/helper.c @@ -52,9 +52,9 @@ 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; + ULONG MessageId; INT add_buffer_req_status = VQ_ADD_BUFFER_SUCCESS; PREQUEST_LIST element; ULONG vq_req_idx; @@ -106,8 +106,8 @@ VOID SendSRB(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) return; } + MessageId = QUEUE_TO_MESSAGE(QueueNumber); vq_req_idx = QueueNumber - VIRTIO_SCSI_REQUEST_QUEUE_0; - LockContext = &adaptExt->dpc[vq_req_idx]; if (adaptExt->reset_in_progress) { @@ -117,7 +117,7 @@ VOID SendSRB(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) return; } - StorPortAcquireSpinLock(DeviceExtension, DpcLock, LockContext, &LockHandle); + VioScsiVQLock(DeviceExtension, MessageId, &LockHandle, FALSE); SET_VA_PA(); add_buffer_req_status = virtqueue_add_buf(adaptExt->vq[QueueNumber], srbExt->psgl, @@ -152,7 +152,7 @@ VOID SendSRB(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) Srb->TimeOutValue); CompleteRequest(DeviceExtension, Srb); } - StorPortReleaseSpinLock(DeviceExtension, &LockHandle); + VioScsiVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE); if (notify) { virtqueue_notify(adaptExt->vq[QueueNumber]); @@ -538,7 +538,46 @@ KickEvent(IN PVOID DeviceExtension, IN PVirtIOSCSIEventNode EventNode) EXIT_FN(); } -VOID FirmwareRequest(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) +VOID +VioScsiVQLock(IN PVOID DeviceExtension, IN ULONG MessageID, IN OUT PSTOR_LOCK_HANDLE LockHandle, IN BOOLEAN isr) +{ + PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION)DeviceExtension; + ULONG QueueNumber = MESSAGE_TO_QUEUE(MessageID); + ENTER_FN(); + + if (!isr) + { + if (adaptExt->msix_enabled) + { + // Queue numbers start at 0, message ids at 1. + NT_ASSERT(MessageID > VIRTIO_SCSI_REQUEST_QUEUE_0); + if (QueueNumber >= (adaptExt->num_queues + VIRTIO_SCSI_REQUEST_QUEUE_0)) + { + QueueNumber %= adaptExt->num_queues; + } + StorPortAcquireSpinLock(DeviceExtension, DpcLock, &adaptExt->dpc[QueueNumber - VIRTIO_SCSI_REQUEST_QUEUE_0], LockHandle); + } + else + { + StorPortAcquireSpinLock(DeviceExtension, InterruptLock, NULL, LockHandle); + } + } + EXIT_FN(); +} + +VOID +VioScsiVQUnlock(IN PVOID DeviceExtension, IN ULONG MessageID, IN PSTOR_LOCK_HANDLE LockHandle, IN BOOLEAN isr) +{ + ENTER_FN(); + if (!isr) + { + StorPortReleaseSpinLock(DeviceExtension, LockHandle); + } + EXIT_FN(); +} + +VOID +FirmwareRequest(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) { PADAPTER_EXTENSION adaptExt; PSRB_EXTENSION srbExt = NULL; diff --git a/vioscsi/helper.h b/vioscsi/helper.h index 13f2d2e62..93f38a745 100644 --- a/vioscsi/helper.h +++ b/vioscsi/helper.h @@ -133,7 +133,18 @@ VOID VioScsiCompleteDpcRoutine(IN PSTOR_DPC Dpc, IN PVOID Context, IN PVOID Syst VOID ProcessBuffer(IN PVOID DeviceExtension, IN ULONG MessageId, IN STOR_SPINLOCK LockMode); VOID -// FORCEINLINE +VioScsiCompleteDpcRoutine(IN PSTOR_DPC Dpc, IN PVOID Context, IN PVOID SystemArgument1, IN PVOID SystemArgument2); + +VOID +ProcessQueue(IN PVOID DeviceExtension, IN ULONG MessageID, IN BOOLEAN isr); + +VOID +VioScsiVQLock(IN PVOID DeviceExtension, IN ULONG MessageID, IN OUT PSTOR_LOCK_HANDLE LockHandle, IN BOOLEAN isr); + +VOID +VioScsiVQUnlock(IN PVOID DeviceExtension, IN ULONG MessageID, IN PSTOR_LOCK_HANDLE LockHandle, IN BOOLEAN isr); + +VOID HandleResponse(IN PVOID DeviceExtension, IN PVirtIOSCSICmd cmd); PVOID diff --git a/vioscsi/vioscsi.c b/vioscsi/vioscsi.c index d19523cec..590301875 100644 --- a/vioscsi/vioscsi.c +++ b/vioscsi/vioscsi.c @@ -1025,7 +1025,7 @@ VioScsiInterrupt(IN PVOID DeviceExtension) } else { - ProcessBuffer(DeviceExtension, QUEUE_TO_MESSAGE(VIRTIO_SCSI_REQUEST_QUEUE_0), InterruptLock); + ProcessQueue(DeviceExtension, QUEUE_TO_MESSAGE(VIRTIO_SCSI_REQUEST_QUEUE_0), TRUE); } } @@ -1254,17 +1254,17 @@ VioScsiUnitControl(IN PVOID DeviceExtension, IN SCSI_UNIT_CONTROL_TYPE ControlTy break; case ScsiUnitRemove: case ScsiUnitSurpriseRemoval: - ULONG vq_req_idx; - PREQUEST_LIST element; - STOR_LOCK_HANDLE LockHandle = {0}; - PVOID LockContext = NULL; // sanity check for LockMode = InterruptLock or StartIoLock - PSTOR_ADDR_BTL8 stor_addr = (PSTOR_ADDR_BTL8)Parameters; + ULONG QueuNum; + ULONG MsgId; + STOR_LOCK_HANDLE LockHandle = { 0 }; + PSTOR_ADDR_BTL8 stor_addr = (PSTOR_ADDR_BTL8)Parameters; - for (vq_req_idx = 0; vq_req_idx < adaptExt->num_queues; vq_req_idx++) + for (index = 0; index < adaptExt->num_queues; index++) { - element = &adaptExt->processing_srbs[vq_req_idx]; - LockContext = &adaptExt->dpc[vq_req_idx]; - StorPortAcquireSpinLock(DeviceExtension, DpcLock, LockContext, &LockHandle); + PREQUEST_LIST element = &adaptExt->processing_srbs[index]; + QueuNum = index + VIRTIO_SCSI_REQUEST_QUEUE_0; + MsgId = QUEUE_TO_MESSAGE(QueuNum); + VioScsiVQLock(DeviceExtension, MsgId, &LockHandle, FALSE); if (!IsListEmpty(&element->srb_list)) { PLIST_ENTRY entry = element->srb_list.Flink; @@ -1287,7 +1287,7 @@ VioScsiUnitControl(IN PVOID DeviceExtension, IN SCSI_UNIT_CONTROL_TYPE ControlTy entry = entry->Flink; } } - StorPortReleaseSpinLock(DeviceExtension, &LockHandle); + VioScsiVQUnlock(DeviceExtension, MsgId, &LockHandle, FALSE); } Status = ScsiUnitControlSuccess; break; @@ -1426,47 +1426,38 @@ VOID FORCEINLINE DispatchQueue(IN PVOID DeviceExtension, IN ULONG MessageId) { NT_ASSERT(MessageId >= QUEUE_TO_MESSAGE(VIRTIO_SCSI_REQUEST_QUEUE_0)); StorPortIssueDpc(DeviceExtension, - &adaptExt->dpc[MessageId - QUEUE_TO_MESSAGE(VIRTIO_SCSI_REQUEST_QUEUE_0)], - ULongToPtr(MessageId), - ULongToPtr(MessageId)); + &adaptExt->dpc[MessageId - QUEUE_TO_MESSAGE(VIRTIO_SCSI_REQUEST_QUEUE_0)], + ULongToPtr(MessageId), + ULongToPtr(MessageId)); EXIT_FN(); return; } - ProcessBuffer(DeviceExtension, MessageId, InterruptLock); + ProcessQueue(DeviceExtension, MessageId, TRUE); EXIT_FN(); } -VOID ProcessBuffer(IN PVOID DeviceExtension, IN ULONG MessageId, IN STOR_SPINLOCK LockMode) +VOID +ProcessQueue(IN PVOID DeviceExtension, IN ULONG MessageID, IN BOOLEAN isr) { ULONG_PTR srbId; unsigned int len; - PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION)DeviceExtension; - ULONG QueueNumber = MESSAGE_TO_QUEUE(MessageId); - STOR_LOCK_HANDLE LockHandle = {0}; + PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION)DeviceExtension; + ULONG index = MESSAGE_TO_QUEUE(MessageID); + STOR_LOCK_HANDLE queueLock = { 0 }; struct virtqueue *vq; PSRB_EXTENSION srbExt = NULL; - PREQUEST_LIST element; - ULONG vq_req_idx; - PVOID LockContext = NULL; // sanity check for LockMode = InterruptLock or StartIoLock ENTER_FN(); - if (QueueNumber >= (adaptExt->num_queues + VIRTIO_SCSI_REQUEST_QUEUE_0)) + if (index >= (adaptExt->num_queues + VIRTIO_SCSI_REQUEST_QUEUE_0)) { - RhelDbgPrint(TRACE_LEVEL_VERBOSE, - " Modulo assignment required for QueueNumber as it exceeds the number of virtqueues available.\n"); - QueueNumber %= adaptExt->num_queues; + index %= adaptExt->num_queues; } - vq_req_idx = QueueNumber - VIRTIO_SCSI_REQUEST_QUEUE_0; - element = &adaptExt->processing_srbs[vq_req_idx]; - vq = adaptExt->vq[QueueNumber]; + PREQUEST_LIST element = &adaptExt->processing_srbs[index - VIRTIO_SCSI_REQUEST_QUEUE_0]; + vq = adaptExt->vq[index]; - if (LockMode == DpcLock) - { - LockContext = &adaptExt->dpc[vq_req_idx]; - } - StorPortAcquireSpinLock(DeviceExtension, LockMode, LockContext, &LockHandle); + VioScsiVQLock(DeviceExtension, MessageID, &queueLock, isr); do { @@ -1500,7 +1491,7 @@ VOID ProcessBuffer(IN PVOID DeviceExtension, IN ULONG MessageId, IN STOR_SPINLOC } } while (!virtqueue_enable_cb(vq)); - StorPortReleaseSpinLock(DeviceExtension, &LockHandle); + VioScsiVQUnlock(DeviceExtension, MessageID, &queueLock, isr); EXIT_FN(); } @@ -1511,18 +1502,16 @@ VOID VioScsiCompleteDpcRoutine(IN PSTOR_DPC Dpc, IN PVOID Context, IN PVOID Syst ENTER_FN(); MessageId = PtrToUlong(SystemArgument1); - ProcessBuffer(Context, MessageId, DpcLock); + ProcessQueue(Context, MessageId, FALSE); EXIT_FN(); } -VOID CompletePendingRequestsOnReset(IN PVOID DeviceExtension) +VOID +CompletePendingRequestsOnReset(IN PVOID DeviceExtension) { PADAPTER_EXTENSION adaptExt; - ULONG QueueNumber; - ULONG vq_req_idx; - PREQUEST_LIST element; - STOR_LOCK_HANDLE LockHandle = {0}; - PVOID LockContext = NULL; // sanity check for LockMode = InterruptLock or StartIoLock + ULONG QueueNum; + ULONG MsgId; adaptExt = (PADAPTER_EXTENSION)DeviceExtension; @@ -1532,12 +1521,14 @@ VOID CompletePendingRequestsOnReset(IN PVOID DeviceExtension) StorPortPause(DeviceExtension, 10); DeviceReset(DeviceExtension); - for (vq_req_idx = 0; vq_req_idx < adaptExt->num_queues; vq_req_idx++) + for (ULONG index = 0; index < adaptExt->num_queues; index++) { - element = &adaptExt->processing_srbs[vq_req_idx]; - RhelDbgPrint(TRACE_LEVEL_FATAL, " queue %d cnt %d\n", vq_req_idx, element->srb_cnt); - LockContext = &adaptExt->dpc[vq_req_idx]; - StorPortAcquireSpinLock(DeviceExtension, DpcLock, LockContext, &LockHandle); + PREQUEST_LIST element = &adaptExt->processing_srbs[index]; + STOR_LOCK_HANDLE LockHandle = { 0 }; + RhelDbgPrint(TRACE_LEVEL_FATAL, " queue %d cnt %d\n", index, element->srb_cnt); + QueueNum = index + VIRTIO_SCSI_REQUEST_QUEUE_0; + MsgId = QUEUE_TO_MESSAGE(QueueNum); + VioScsiVQLock(DeviceExtension, MsgId, &LockHandle, FALSE); while (!IsListEmpty(&element->srb_list)) { PLIST_ENTRY entry = RemoveHeadList(&element->srb_list); @@ -1557,7 +1548,7 @@ VOID CompletePendingRequestsOnReset(IN PVOID DeviceExtension) { element->srb_cnt = 0; } - StorPortReleaseSpinLock(DeviceExtension, &LockHandle); + VioScsiVQUnlock(DeviceExtension, MsgId, &LockHandle, FALSE); } StorPortResume(DeviceExtension); } From 7b9c6bdf486910e7d679ca1dba6e60390fefc60c Mon Sep 17 00:00:00 2001 From: Vadim Rozenfeld Date: Wed, 2 Apr 2025 18:01:56 +1100 Subject: [PATCH 2/7] Revert "Fix returning SUCCESS when really -ENOSPC (regression)" This reverts commit d32a1e11b68dff035f26d885c3b979be201ffd57. --- viostor/virtio_stor_hw_helper.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/viostor/virtio_stor_hw_helper.c b/viostor/virtio_stor_hw_helper.c index fb8257265..5b7206aaa 100644 --- a/viostor/virtio_stor_hw_helper.c +++ b/viostor/virtio_stor_hw_helper.c @@ -144,10 +144,6 @@ RhelDoFlush(PVOID DeviceExtension, PSRB_TYPE Srb, BOOLEAN resend, BOOLEAN bIsr) element = &adaptExt->processing_srbs[QueueNumber]; InsertTailList(&element->srb_list, &srbExt->vbr.list_entry); element->srb_cnt++; - result = TRUE; -#ifdef DBG - InterlockedIncrement((LONG volatile *)&adaptExt->inqueue_cnt); -#endif } else { @@ -158,6 +154,10 @@ RhelDoFlush(PVOID DeviceExtension, PSRB_TYPE Srb, BOOLEAN resend, BOOLEAN bIsr) { VioStorVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE); } +#ifdef DBG + InterlockedIncrement((LONG volatile *)&adaptExt->inqueue_cnt); +#endif + result = TRUE; if (notify) { virtqueue_notify(adaptExt->vq[QueueNumber]); @@ -231,10 +231,6 @@ RhelDoReadWrite(PVOID DeviceExtension, PSRB_TYPE Srb) element = &adaptExt->processing_srbs[QueueNumber]; InsertTailList(&element->srb_list, &srbExt->vbr.list_entry); element->srb_cnt++; - result = TRUE; -#ifdef DBG - InterlockedIncrement((LONG volatile *)&adaptExt->inqueue_cnt); -#endif } else { @@ -242,6 +238,10 @@ RhelDoReadWrite(PVOID DeviceExtension, PSRB_TYPE Srb) StorPortBusy(DeviceExtension, 2); } VioStorVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE); +#ifdef DBG + InterlockedIncrement((LONG volatile *)&adaptExt->inqueue_cnt); +#endif + result = TRUE; if (notify) { virtqueue_notify(adaptExt->vq[QueueNumber]); @@ -388,10 +388,6 @@ RhelDoUnMap(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) element = &adaptExt->processing_srbs[QueueNumber]; InsertTailList(&element->srb_list, &srbExt->vbr.list_entry); element->srb_cnt++; - result = TRUE; -#ifdef DBG - InterlockedIncrement((LONG volatile *)&adaptExt->inqueue_cnt); -#endif } else { @@ -399,6 +395,10 @@ RhelDoUnMap(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) StorPortBusy(DeviceExtension, 2); } VioStorVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE); +#ifdef DBG + InterlockedIncrement((LONG volatile *)&adaptExt->inqueue_cnt); +#endif + result = TRUE; if (notify) { RhelDbgPrint(TRACE_LEVEL_INFORMATION, " %s virtqueue_notify %d.\n", __FUNCTION__, QueueNumber); @@ -486,10 +486,6 @@ RhelGetSerialNumber(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) element = &adaptExt->processing_srbs[QueueNumber]; InsertTailList(&element->srb_list, &srbExt->vbr.list_entry); element->srb_cnt++; - result = TRUE; -#ifdef DBG - InterlockedIncrement((LONG volatile *)&adaptExt->inqueue_cnt); -#endif } else { @@ -497,6 +493,10 @@ RhelGetSerialNumber(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) StorPortBusy(DeviceExtension, 2); } VioStorVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE); +#ifdef DBG + InterlockedIncrement((LONG volatile *)&adaptExt->inqueue_cnt); +#endif + result = TRUE; if (notify) { virtqueue_notify(adaptExt->vq[QueueNumber]); From 939cac47083639ebe7be254cf6b58debbc3c7928 Mon Sep 17 00:00:00 2001 From: Vadim Rozenfeld Date: Wed, 2 Apr 2025 18:45:45 +1100 Subject: [PATCH 3/7] Revert "Backport vioscsi SendSRB fixes and improvements" This reverts commit a4f4aa405df6f473bc0d403f55afae49632594f9. --- viostor/virtio_stor_hw_helper.c | 156 +++++++++++++++----------------- 1 file changed, 71 insertions(+), 85 deletions(-) diff --git a/viostor/virtio_stor_hw_helper.c b/viostor/virtio_stor_hw_helper.c index 5b7206aaa..a7b2083f3 100644 --- a/viostor/virtio_stor_hw_helper.c +++ b/viostor/virtio_stor_hw_helper.c @@ -74,7 +74,7 @@ RhelDoFlush(PVOID DeviceExtension, PSRB_TYPE Srb, BOOLEAN resend, BOOLEAN bIsr) bool notify = FALSE; STOR_LOCK_HANDLE LockHandle = {0}; ULONG status = STOR_STATUS_SUCCESS; - INT add_buffer_req_status = VQ_ADD_BUFFER_SUCCESS; + struct virtqueue *vq = NULL; PREQUEST_LIST element; SET_VA_PA(); @@ -112,6 +112,7 @@ RhelDoFlush(PVOID DeviceExtension, PSRB_TYPE Srb, BOOLEAN resend, BOOLEAN bIsr) } srbExt->MessageID = MessageId; + vq = adaptExt->vq[QueueNumber]; srbExt->vbr.out_hdr.sector = 0; srbExt->vbr.out_hdr.ioprio = 0; @@ -130,37 +131,35 @@ RhelDoFlush(PVOID DeviceExtension, PSRB_TYPE Srb, BOOLEAN resend, BOOLEAN bIsr) { VioStorVQLock(DeviceExtension, MessageId, &LockHandle, FALSE); } - add_buffer_req_status = virtqueue_add_buf(adaptExt->vq[QueueNumber], - &srbExt->sg[0], - srbExt->out, - srbExt->in, - (void *)srbExt->id, - va, - pa); - - if (add_buffer_req_status == VQ_ADD_BUFFER_SUCCESS) + if (virtqueue_add_buf(vq, + &srbExt->sg[0], + srbExt->out, srbExt->in, + (void *)srbExt->id, va, pa) == VQ_ADD_BUFFER_SUCCESS) { - notify = virtqueue_kick_prepare(adaptExt->vq[QueueNumber]); - element = &adaptExt->processing_srbs[QueueNumber]; + notify = virtqueue_kick_prepare(vq); InsertTailList(&element->srb_list, &srbExt->vbr.list_entry); element->srb_cnt++; + if (!resend) + { + VioStorVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE); + } + result = TRUE; +#ifdef DBG + InterlockedIncrement((LONG volatile*)&adaptExt->inqueue_cnt); +#endif } else { + if (!resend) + { + VioStorVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE); + } RhelDbgPrint(TRACE_LEVEL_ERROR, " Can not add packet to queue %d.\n", QueueNumber); StorPortBusy(DeviceExtension, 2); } - if (!resend) - { - VioStorVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE); - } -#ifdef DBG - InterlockedIncrement((LONG volatile *)&adaptExt->inqueue_cnt); -#endif - result = TRUE; if (notify) { - virtqueue_notify(adaptExt->vq[QueueNumber]); + virtqueue_notify(vq); } return result; @@ -181,7 +180,7 @@ RhelDoReadWrite(PVOID DeviceExtension, PSRB_TYPE Srb) bool notify = FALSE; STOR_LOCK_HANDLE LockHandle = {0}; ULONG status = STOR_STATUS_SUCCESS; - INT add_buffer_req_status = VQ_ADD_BUFFER_SUCCESS; + struct virtqueue *vq = NULL; PREQUEST_LIST element; SET_VA_PA(); @@ -214,37 +213,34 @@ RhelDoReadWrite(PVOID DeviceExtension, PSRB_TYPE Srb) } srbExt->MessageID = MessageId; - RhelDbgPrint(TRACE_LEVEL_VERBOSE, " QueueNumber 0x%x vq = %p\n", QueueNumber, adaptExt->vq[QueueNumber]); + vq = adaptExt->vq[QueueNumber]; + RhelDbgPrint(TRACE_LEVEL_VERBOSE, " QueueNumber 0x%x vq = %p\n", QueueNumber, vq); + element = &adaptExt->processing_srbs[QueueNumber]; VioStorVQLock(DeviceExtension, MessageId, &LockHandle, FALSE); - add_buffer_req_status = virtqueue_add_buf(adaptExt->vq[QueueNumber], - &srbExt->sg[0], - srbExt->out, - srbExt->in, - (void *)srbExt->id, - va, - pa); - - if (add_buffer_req_status == VQ_ADD_BUFFER_SUCCESS) - { - notify = virtqueue_kick_prepare(adaptExt->vq[QueueNumber]); - element = &adaptExt->processing_srbs[QueueNumber]; + if (virtqueue_add_buf(vq, + &srbExt->sg[0], + srbExt->out, srbExt->in, + (void *)srbExt->id, va, pa) == VQ_ADD_BUFFER_SUCCESS) + { + notify = virtqueue_kick_prepare(vq); InsertTailList(&element->srb_list, &srbExt->vbr.list_entry); element->srb_cnt++; + VioStorVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE); +#ifdef DBG + InterlockedIncrement((LONG volatile*)&adaptExt->inqueue_cnt); +#endif + result = TRUE; } else { + VioStorVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE); RhelDbgPrint(TRACE_LEVEL_ERROR, " Can not add packet to queue %d.\n", QueueNumber); StorPortBusy(DeviceExtension, 2); } - VioStorVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE); -#ifdef DBG - InterlockedIncrement((LONG volatile *)&adaptExt->inqueue_cnt); -#endif - result = TRUE; if (notify) { - virtqueue_notify(adaptExt->vq[QueueNumber]); + virtqueue_notify(vq); } if (adaptExt->num_queues > 1) @@ -273,7 +269,6 @@ RhelDoUnMap(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) PUNMAP_BLOCK_DESCRIPTOR BlockDescriptors = NULL; USHORT BlockDescrCount = 0; ULONG fragLen = 0UL; - INT add_buffer_req_status = VQ_ADD_BUFFER_SUCCESS; PREQUEST_LIST element; PVOID va = NULL; @@ -286,6 +281,7 @@ RhelDoUnMap(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) BOOLEAN notify = FALSE; STOR_LOCK_HANDLE LockHandle = {0}; ULONG status = STOR_STATUS_SUCCESS; + struct virtqueue *vq = NULL; SET_VA_PA(); @@ -367,42 +363,35 @@ RhelDoUnMap(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) } srbExt->MessageID = MessageId; - RhelDbgPrint(TRACE_LEVEL_INFORMATION, - " QueueNumber 0x%x vq = %p type = %d\n", - QueueNumber, - adaptExt->vq[QueueNumber], - srbExt->vbr.out_hdr.type); + vq = adaptExt->vq[QueueNumber]; + RhelDbgPrint(TRACE_LEVEL_INFORMATION, " QueueNumber 0x%x vq = %p type = %d\n", QueueNumber, vq, srbExt->vbr.out_hdr.type); + element = &adaptExt->processing_srbs[QueueNumber]; VioStorVQLock(DeviceExtension, MessageId, &LockHandle, FALSE); - add_buffer_req_status = virtqueue_add_buf(adaptExt->vq[QueueNumber], - &srbExt->sg[0], - srbExt->out, - srbExt->in, - (void *)srbExt->id, - va, - pa); - - if (add_buffer_req_status == VQ_ADD_BUFFER_SUCCESS) - { - notify = virtqueue_kick_prepare(adaptExt->vq[QueueNumber]); - element = &adaptExt->processing_srbs[QueueNumber]; + if (virtqueue_add_buf(vq, + &srbExt->sg[0], + srbExt->out, srbExt->in, + (void *)srbExt->id, va, pa) == VQ_ADD_BUFFER_SUCCESS) + { + notify = virtqueue_kick_prepare(vq); InsertTailList(&element->srb_list, &srbExt->vbr.list_entry); element->srb_cnt++; + VioStorVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE); +#ifdef DBG + InterlockedIncrement((LONG volatile*)&adaptExt->inqueue_cnt); +#endif + result = TRUE; } else { + VioStorVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE); RhelDbgPrint(TRACE_LEVEL_ERROR, " Can not add packet to queue %d.\n", QueueNumber); StorPortBusy(DeviceExtension, 2); } - VioStorVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE); -#ifdef DBG - InterlockedIncrement((LONG volatile *)&adaptExt->inqueue_cnt); -#endif - result = TRUE; if (notify) { - RhelDbgPrint(TRACE_LEVEL_INFORMATION, " %s virtqueue_notify %d.\n", __FUNCTION__, QueueNumber); - virtqueue_notify(adaptExt->vq[QueueNumber]); + RhelDbgPrint(TRACE_LEVEL_INFORMATION, " %s virtqueue_notify %d.\n", __FUNCTION__, QueueNumber); + virtqueue_notify(vq); } return result; } @@ -414,6 +403,7 @@ RhelGetSerialNumber(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) ULONG OldIrql = 0; ULONG MessageId = 1; STOR_LOCK_HANDLE LockHandle = {0}; + struct virtqueue *vq = NULL; PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION)DeviceExtension; PSRB_EXTENSION srbExt = SRB_EXTENSION(Srb); ULONG status = STOR_STATUS_SUCCESS; @@ -422,7 +412,6 @@ RhelGetSerialNumber(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) BOOLEAN result = FALSE; BOOLEAN notify = FALSE; ULONG fragLen = 0UL; - INT add_buffer_req_status = VQ_ADD_BUFFER_SUCCESS; PREQUEST_LIST element; SET_VA_PA(); @@ -456,6 +445,7 @@ RhelGetSerialNumber(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) } srbExt->MessageID = MessageId; + vq = adaptExt->vq[QueueNumber]; srbExt->vbr.out_hdr.sector = 0; srbExt->vbr.out_hdr.ioprio = 0; @@ -471,35 +461,31 @@ RhelGetSerialNumber(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) srbExt->sg[2].physAddr = StorPortGetPhysicalAddress(DeviceExtension, NULL, &srbExt->vbr.status, &fragLen); srbExt->sg[2].length = sizeof(srbExt->vbr.status); + element = &adaptExt->processing_srbs[QueueNumber]; VioStorVQLock(DeviceExtension, MessageId, &LockHandle, FALSE); - add_buffer_req_status = virtqueue_add_buf(adaptExt->vq[QueueNumber], - &srbExt->sg[0], - srbExt->out, - srbExt->in, - (void *)srbExt->id, - va, - pa); - - if (add_buffer_req_status == VQ_ADD_BUFFER_SUCCESS) - { - notify = virtqueue_kick_prepare(adaptExt->vq[QueueNumber]); - element = &adaptExt->processing_srbs[QueueNumber]; + if (virtqueue_add_buf(vq, + &srbExt->sg[0], + srbExt->out, srbExt->in, + (void *)srbExt->id, va, pa) == VQ_ADD_BUFFER_SUCCESS) + { + notify = virtqueue_kick_prepare(vq); InsertTailList(&element->srb_list, &srbExt->vbr.list_entry); element->srb_cnt++; + VioStorVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE); + result = TRUE; +#ifdef DBG + InterlockedIncrement((LONG volatile*)&adaptExt->inqueue_cnt); +#endif } else { + VioStorVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE); RhelDbgPrint(TRACE_LEVEL_ERROR, " Can not add packet to queue %d.\n", QueueNumber); StorPortBusy(DeviceExtension, 2); } - VioStorVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE); -#ifdef DBG - InterlockedIncrement((LONG volatile *)&adaptExt->inqueue_cnt); -#endif - result = TRUE; if (notify) { - virtqueue_notify(adaptExt->vq[QueueNumber]); + virtqueue_notify(vq); } return result; From 0686f2c46ea0599e61906e4aba8d85d2db139550 Mon Sep 17 00:00:00 2001 From: Vadim Rozenfeld Date: Tue, 12 Aug 2025 23:24:25 +1000 Subject: [PATCH 4/7] RHEL-107617 set data transfer length to 0 in case if no data transfered Signed-off-by: Vadim Rozenfeld --- vioscsi/helper.c | 19 +++++++++++-------- vioscsi/vioscsi.c | 4 ++++ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/vioscsi/helper.c b/vioscsi/helper.c index 6acc8e804..a38e1ea12 100644 --- a/vioscsi/helper.c +++ b/vioscsi/helper.c @@ -69,6 +69,16 @@ VOID SendSRB(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) if (adaptExt->bRemoved) { SRB_SET_SRB_STATUS(Srb, SRB_STATUS_NO_DEVICE); + SRB_SET_DATA_TRANSFER_LENGTH(Srb, 0); + CompleteRequest(DeviceExtension, Srb); + return; + } + + if (adaptExt->reset_in_progress) + { + RhelDbgPrint(TRACE_LEVEL_FATAL, " Reset is in progress, completing SRB 0x%p with SRB_STATUS_BUS_RESET.\n", Srb); + SRB_SET_DATA_TRANSFER_LENGTH(Srb, 0); + SRB_SET_SRB_STATUS(Srb, SRB_STATUS_BUS_RESET); CompleteRequest(DeviceExtension, Srb); return; } @@ -109,14 +119,6 @@ VOID SendSRB(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) MessageId = QUEUE_TO_MESSAGE(QueueNumber); vq_req_idx = QueueNumber - VIRTIO_SCSI_REQUEST_QUEUE_0; - if (adaptExt->reset_in_progress) - { - RhelDbgPrint(TRACE_LEVEL_FATAL, " Reset is in progress, completing SRB 0x%p with SRB_STATUS_BUS_RESET.\n", Srb); - SRB_SET_SRB_STATUS(Srb, SRB_STATUS_BUS_RESET); - CompleteRequest(DeviceExtension, Srb); - return; - } - VioScsiVQLock(DeviceExtension, MessageId, &LockHandle, FALSE); SET_VA_PA(); add_buffer_req_status = virtqueue_add_buf(adaptExt->vq[QueueNumber], @@ -701,6 +703,7 @@ FirmwareRequest(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) break; default: RhelDbgPrint(TRACE_LEVEL_INFORMATION, " Unsupported Function %ul\n", firmwareRequest->Function); + SRB_SET_DATA_TRANSFER_LENGTH(Srb, 0); SRB_SET_SRB_STATUS(Srb, SRB_STATUS_INVALID_REQUEST); break; } diff --git a/vioscsi/vioscsi.c b/vioscsi/vioscsi.c index 590301875..c7eb2ed7e 100644 --- a/vioscsi/vioscsi.c +++ b/vioscsi/vioscsi.c @@ -1276,6 +1276,7 @@ VioScsiUnitControl(IN PVOID DeviceExtension, IN SCSI_UNIT_CONTROL_TYPE ControlTy SRB_LUN(currSrb) == stor_addr->Lun) { SRB_SET_SRB_STATUS(currSrb, SRB_STATUS_NO_DEVICE); + SRB_SET_DATA_TRANSFER_LENGTH(currSrb, 0); CompleteRequest(DeviceExtension, (PSRB_TYPE)currSrb); RhelDbgPrint(TRACE_LEVEL_INFORMATION, " Complete pending I/Os on Path %d Target %d Lun %d \n", @@ -1326,6 +1327,7 @@ VioScsiBuildIo(IN PVOID DeviceExtension, IN PSCSI_REQUEST_BLOCK Srb) (Lun >= adaptExt->scsi_config.max_lun) || adaptExt->bRemoved) { SRB_SET_SRB_STATUS(Srb, SRB_STATUS_NO_DEVICE); + SRB_SET_DATA_TRANSFER_LENGTH(Srb, 0); StorPortNotification(RequestComplete, DeviceExtension, Srb); return FALSE; } @@ -1539,6 +1541,7 @@ CompletePendingRequestsOnReset(IN PVOID DeviceExtension) if (currSrb) { SRB_SET_SRB_STATUS(currSrb, SRB_STATUS_BUS_RESET); + SRB_SET_DATA_TRANSFER_LENGTH(currSrb, 0); CompleteRequest(DeviceExtension, (PSRB_TYPE)currSrb); element->srb_cnt--; } @@ -1926,6 +1929,7 @@ VOID VioScsiIoControl(IN PVOID DeviceExtension, IN OUT PSRB_TYPE Srb) break; default: SRB_SET_SRB_STATUS(Srb, SRB_STATUS_INVALID_REQUEST); + SRB_SET_DATA_TRANSFER_LENGTH(Srb, 0); RhelDbgPrint(TRACE_LEVEL_INFORMATION, " <--> Unsupport control code 0x%x\n", srbControl->ControlCode); break; } From 410f21f5d70bb9dc5bf9eebb2b4e365fb427969b Mon Sep 17 00:00:00 2001 From: Vadim Rozenfeld Date: Tue, 12 Aug 2025 23:25:58 +1000 Subject: [PATCH 5/7] RHEL-107617 set data transfer length to 0 in case if no data transfered Signed-off-by: Vadim Rozenfeld --- viostor/virtio_stor.c | 5 ++++- viostor/virtio_stor_hw_helper.c | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/viostor/virtio_stor.c b/viostor/virtio_stor.c index d25922fba..04ed675c4 100644 --- a/viostor/virtio_stor.c +++ b/viostor/virtio_stor.c @@ -869,6 +869,7 @@ VOID CompletePendingRequests(IN PVOID DeviceExtension) PSRB_EXTENSION currSrbExt = SRB_EXTENSION(currSrb); if (currSrb) { + SRB_SET_DATA_TRANSFER_LENGTH(currSrb, 0); CompleteRequestWithStatus(DeviceExtension, (PSRB_TYPE)currSrb, SRB_STATUS_BUS_RESET); element->srb_cnt--; } @@ -1012,6 +1013,7 @@ VirtIoStartIo(IN PVOID DeviceExtension, IN PSCSI_REQUEST_BLOCK Srb) default: { + SRB_SET_DATA_TRANSFER_LENGTH(Srb, 0); CompleteRequestWithStatus(DeviceExtension, (PSRB_TYPE)Srb, SRB_STATUS_INVALID_REQUEST); return TRUE; } @@ -1149,7 +1151,7 @@ VirtIoStartIo(IN PVOID DeviceExtension, IN PSCSI_REQUEST_BLOCK Srb) Srb, SRB_FUNCTION(Srb), cdb->CDB6GENERIC.OperationCode); - + SRB_SET_DATA_TRANSFER_LENGTH(Srb, 0); CompleteRequestWithStatus(DeviceExtension, (PSRB_TYPE)Srb, SRB_STATUS_INVALID_REQUEST); return TRUE; } @@ -1335,6 +1337,7 @@ VirtIoBuildIo(IN PVOID DeviceExtension, IN PSCSI_REQUEST_BLOCK Srb) #endif if (SRB_PATH_ID(Srb) || SRB_TARGET_ID(Srb) || SRB_LUN(Srb) || ((adaptExt->removed == TRUE))) { + SRB_SET_DATA_TRANSFER_LENGTH(Srb, 0); CompleteRequestWithStatus(DeviceExtension, (PSRB_TYPE)Srb, SRB_STATUS_NO_DEVICE); return FALSE; } diff --git a/viostor/virtio_stor_hw_helper.c b/viostor/virtio_stor_hw_helper.c index a7b2083f3..5ba47da07 100644 --- a/viostor/virtio_stor_hw_helper.c +++ b/viostor/virtio_stor_hw_helper.c @@ -107,6 +107,7 @@ RhelDoFlush(PVOID DeviceExtension, PSRB_TYPE Srb, BOOLEAN resend, BOOLEAN bIsr) if (adaptExt->reset_in_progress) { + SRB_SET_DATA_TRANSFER_LENGTH(Srb, 0); CompleteRequestWithStatus(DeviceExtension, Srb, SRB_STATUS_BUS_RESET); return TRUE; } @@ -208,6 +209,7 @@ RhelDoReadWrite(PVOID DeviceExtension, PSRB_TYPE Srb) if (adaptExt->reset_in_progress) { + SRB_SET_DATA_TRANSFER_LENGTH(Srb, 0); CompleteRequestWithStatus(DeviceExtension, Srb, SRB_STATUS_BUS_RESET); return TRUE; } @@ -358,6 +360,7 @@ RhelDoUnMap(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) if (adaptExt->reset_in_progress) { + SRB_SET_DATA_TRANSFER_LENGTH(Srb, 0); CompleteRequestWithStatus(DeviceExtension, Srb, SRB_STATUS_BUS_RESET); return TRUE; } @@ -440,6 +443,7 @@ RhelGetSerialNumber(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) } if (adaptExt->reset_in_progress) { + SRB_SET_DATA_TRANSFER_LENGTH(Srb, 0); CompleteRequestWithStatus(DeviceExtension, Srb, SRB_STATUS_BUS_RESET); return TRUE; } From 798b688837acbc090fb0193843192acfcfe36f34 Mon Sep 17 00:00:00 2001 From: Vadim Rozenfeld Date: Wed, 24 Sep 2025 04:02:08 +1000 Subject: [PATCH 6/7] [vioscsi] fix clang format warnings Signed-off-by: Vadim Rozenfeld --- vioscsi/helper.c | 18 +++++++++--------- vioscsi/helper.h | 15 ++++----------- vioscsi/vioscsi.c | 22 ++++++++++------------ 3 files changed, 23 insertions(+), 32 deletions(-) diff --git a/vioscsi/helper.c b/vioscsi/helper.c index a38e1ea12..c0fd97aa5 100644 --- a/vioscsi/helper.c +++ b/vioscsi/helper.c @@ -540,11 +540,10 @@ KickEvent(IN PVOID DeviceExtension, IN PVirtIOSCSIEventNode EventNode) EXIT_FN(); } -VOID -VioScsiVQLock(IN PVOID DeviceExtension, IN ULONG MessageID, IN OUT PSTOR_LOCK_HANDLE LockHandle, IN BOOLEAN isr) +VOID VioScsiVQLock(IN PVOID DeviceExtension, IN ULONG MessageID, IN OUT PSTOR_LOCK_HANDLE LockHandle, IN BOOLEAN isr) { - PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION)DeviceExtension; - ULONG QueueNumber = MESSAGE_TO_QUEUE(MessageID); + PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION)DeviceExtension; + ULONG QueueNumber = MESSAGE_TO_QUEUE(MessageID); ENTER_FN(); if (!isr) @@ -557,7 +556,10 @@ VioScsiVQLock(IN PVOID DeviceExtension, IN ULONG MessageID, IN OUT PSTOR_LOCK_HA { QueueNumber %= adaptExt->num_queues; } - StorPortAcquireSpinLock(DeviceExtension, DpcLock, &adaptExt->dpc[QueueNumber - VIRTIO_SCSI_REQUEST_QUEUE_0], LockHandle); + StorPortAcquireSpinLock(DeviceExtension, + DpcLock, + &adaptExt->dpc[QueueNumber - VIRTIO_SCSI_REQUEST_QUEUE_0], + LockHandle); } else { @@ -567,8 +569,7 @@ VioScsiVQLock(IN PVOID DeviceExtension, IN ULONG MessageID, IN OUT PSTOR_LOCK_HA EXIT_FN(); } -VOID -VioScsiVQUnlock(IN PVOID DeviceExtension, IN ULONG MessageID, IN PSTOR_LOCK_HANDLE LockHandle, IN BOOLEAN isr) +VOID VioScsiVQUnlock(IN PVOID DeviceExtension, IN ULONG MessageID, IN PSTOR_LOCK_HANDLE LockHandle, IN BOOLEAN isr) { ENTER_FN(); if (!isr) @@ -578,8 +579,7 @@ VioScsiVQUnlock(IN PVOID DeviceExtension, IN ULONG MessageID, IN PSTOR_LOCK_HAND EXIT_FN(); } -VOID -FirmwareRequest(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) +VOID FirmwareRequest(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) { PADAPTER_EXTENSION adaptExt; PSRB_EXTENSION srbExt = NULL; diff --git a/vioscsi/helper.h b/vioscsi/helper.h index 93f38a745..b37eacbae 100644 --- a/vioscsi/helper.h +++ b/vioscsi/helper.h @@ -132,20 +132,13 @@ VOID VioScsiCompleteDpcRoutine(IN PSTOR_DPC Dpc, IN PVOID Context, IN PVOID Syst VOID ProcessBuffer(IN PVOID DeviceExtension, IN ULONG MessageId, IN STOR_SPINLOCK LockMode); -VOID -VioScsiCompleteDpcRoutine(IN PSTOR_DPC Dpc, IN PVOID Context, IN PVOID SystemArgument1, IN PVOID SystemArgument2); +VOID ProcessQueue(IN PVOID DeviceExtension, IN ULONG MessageID, IN BOOLEAN isr); -VOID -ProcessQueue(IN PVOID DeviceExtension, IN ULONG MessageID, IN BOOLEAN isr); +VOID VioScsiVQLock(IN PVOID DeviceExtension, IN ULONG MessageID, IN OUT PSTOR_LOCK_HANDLE LockHandle, IN BOOLEAN isr); -VOID -VioScsiVQLock(IN PVOID DeviceExtension, IN ULONG MessageID, IN OUT PSTOR_LOCK_HANDLE LockHandle, IN BOOLEAN isr); +VOID VioScsiVQUnlock(IN PVOID DeviceExtension, IN ULONG MessageID, IN PSTOR_LOCK_HANDLE LockHandle, IN BOOLEAN isr); -VOID -VioScsiVQUnlock(IN PVOID DeviceExtension, IN ULONG MessageID, IN PSTOR_LOCK_HANDLE LockHandle, IN BOOLEAN isr); - -VOID -HandleResponse(IN PVOID DeviceExtension, IN PVirtIOSCSICmd cmd); +VOID HandleResponse(IN PVOID DeviceExtension, IN PVirtIOSCSICmd cmd); PVOID VioScsiPoolAlloc(IN PVOID DeviceExtension, IN SIZE_T size); diff --git a/vioscsi/vioscsi.c b/vioscsi/vioscsi.c index c7eb2ed7e..ca52197f9 100644 --- a/vioscsi/vioscsi.c +++ b/vioscsi/vioscsi.c @@ -1256,8 +1256,8 @@ VioScsiUnitControl(IN PVOID DeviceExtension, IN SCSI_UNIT_CONTROL_TYPE ControlTy case ScsiUnitSurpriseRemoval: ULONG QueuNum; ULONG MsgId; - STOR_LOCK_HANDLE LockHandle = { 0 }; - PSTOR_ADDR_BTL8 stor_addr = (PSTOR_ADDR_BTL8)Parameters; + STOR_LOCK_HANDLE LockHandle = {0}; + PSTOR_ADDR_BTL8 stor_addr = (PSTOR_ADDR_BTL8)Parameters; for (index = 0; index < adaptExt->num_queues; index++) { @@ -1428,9 +1428,9 @@ VOID FORCEINLINE DispatchQueue(IN PVOID DeviceExtension, IN ULONG MessageId) { NT_ASSERT(MessageId >= QUEUE_TO_MESSAGE(VIRTIO_SCSI_REQUEST_QUEUE_0)); StorPortIssueDpc(DeviceExtension, - &adaptExt->dpc[MessageId - QUEUE_TO_MESSAGE(VIRTIO_SCSI_REQUEST_QUEUE_0)], - ULongToPtr(MessageId), - ULongToPtr(MessageId)); + &adaptExt->dpc[MessageId - QUEUE_TO_MESSAGE(VIRTIO_SCSI_REQUEST_QUEUE_0)], + ULongToPtr(MessageId), + ULongToPtr(MessageId)); EXIT_FN(); return; } @@ -1438,14 +1438,13 @@ VOID FORCEINLINE DispatchQueue(IN PVOID DeviceExtension, IN ULONG MessageId) EXIT_FN(); } -VOID -ProcessQueue(IN PVOID DeviceExtension, IN ULONG MessageID, IN BOOLEAN isr) +VOID ProcessQueue(IN PVOID DeviceExtension, IN ULONG MessageID, IN BOOLEAN isr) { ULONG_PTR srbId; unsigned int len; - PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION)DeviceExtension; + PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION)DeviceExtension; ULONG index = MESSAGE_TO_QUEUE(MessageID); - STOR_LOCK_HANDLE queueLock = { 0 }; + STOR_LOCK_HANDLE queueLock = {0}; struct virtqueue *vq; PSRB_EXTENSION srbExt = NULL; @@ -1508,8 +1507,7 @@ VOID VioScsiCompleteDpcRoutine(IN PSTOR_DPC Dpc, IN PVOID Context, IN PVOID Syst EXIT_FN(); } -VOID -CompletePendingRequestsOnReset(IN PVOID DeviceExtension) +VOID CompletePendingRequestsOnReset(IN PVOID DeviceExtension) { PADAPTER_EXTENSION adaptExt; ULONG QueueNum; @@ -1526,7 +1524,7 @@ CompletePendingRequestsOnReset(IN PVOID DeviceExtension) for (ULONG index = 0; index < adaptExt->num_queues; index++) { PREQUEST_LIST element = &adaptExt->processing_srbs[index]; - STOR_LOCK_HANDLE LockHandle = { 0 }; + STOR_LOCK_HANDLE LockHandle = {0}; RhelDbgPrint(TRACE_LEVEL_FATAL, " queue %d cnt %d\n", index, element->srb_cnt); QueueNum = index + VIRTIO_SCSI_REQUEST_QUEUE_0; MsgId = QUEUE_TO_MESSAGE(QueueNum); From 70c568dcab27514d37bc8715a193025ee50bb889 Mon Sep 17 00:00:00 2001 From: Vadim Rozenfeld Date: Wed, 24 Sep 2025 04:02:41 +1000 Subject: [PATCH 7/7] [viostor] fix clang format warnings Signed-off-by: Vadim Rozenfeld --- viostor/virtio_stor_hw_helper.c | 40 +++++++++++++++------------------ 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/viostor/virtio_stor_hw_helper.c b/viostor/virtio_stor_hw_helper.c index 5ba47da07..91aa32cb1 100644 --- a/viostor/virtio_stor_hw_helper.c +++ b/viostor/virtio_stor_hw_helper.c @@ -132,10 +132,8 @@ RhelDoFlush(PVOID DeviceExtension, PSRB_TYPE Srb, BOOLEAN resend, BOOLEAN bIsr) { VioStorVQLock(DeviceExtension, MessageId, &LockHandle, FALSE); } - if (virtqueue_add_buf(vq, - &srbExt->sg[0], - srbExt->out, srbExt->in, - (void *)srbExt->id, va, pa) == VQ_ADD_BUFFER_SUCCESS) + if (virtqueue_add_buf(vq, &srbExt->sg[0], srbExt->out, srbExt->in, (void *)srbExt->id, va, pa) == + VQ_ADD_BUFFER_SUCCESS) { notify = virtqueue_kick_prepare(vq); InsertTailList(&element->srb_list, &srbExt->vbr.list_entry); @@ -146,7 +144,7 @@ RhelDoFlush(PVOID DeviceExtension, PSRB_TYPE Srb, BOOLEAN resend, BOOLEAN bIsr) } result = TRUE; #ifdef DBG - InterlockedIncrement((LONG volatile*)&adaptExt->inqueue_cnt); + InterlockedIncrement((LONG volatile *)&adaptExt->inqueue_cnt); #endif } else @@ -220,17 +218,15 @@ RhelDoReadWrite(PVOID DeviceExtension, PSRB_TYPE Srb) element = &adaptExt->processing_srbs[QueueNumber]; VioStorVQLock(DeviceExtension, MessageId, &LockHandle, FALSE); - if (virtqueue_add_buf(vq, - &srbExt->sg[0], - srbExt->out, srbExt->in, - (void *)srbExt->id, va, pa) == VQ_ADD_BUFFER_SUCCESS) + if (virtqueue_add_buf(vq, &srbExt->sg[0], srbExt->out, srbExt->in, (void *)srbExt->id, va, pa) == + VQ_ADD_BUFFER_SUCCESS) { notify = virtqueue_kick_prepare(vq); InsertTailList(&element->srb_list, &srbExt->vbr.list_entry); element->srb_cnt++; VioStorVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE); #ifdef DBG - InterlockedIncrement((LONG volatile*)&adaptExt->inqueue_cnt); + InterlockedIncrement((LONG volatile *)&adaptExt->inqueue_cnt); #endif result = TRUE; } @@ -367,21 +363,23 @@ RhelDoUnMap(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) srbExt->MessageID = MessageId; vq = adaptExt->vq[QueueNumber]; - RhelDbgPrint(TRACE_LEVEL_INFORMATION, " QueueNumber 0x%x vq = %p type = %d\n", QueueNumber, vq, srbExt->vbr.out_hdr.type); + RhelDbgPrint(TRACE_LEVEL_INFORMATION, + " QueueNumber 0x%x vq = %p type = %d\n", + QueueNumber, + vq, + srbExt->vbr.out_hdr.type); element = &adaptExt->processing_srbs[QueueNumber]; VioStorVQLock(DeviceExtension, MessageId, &LockHandle, FALSE); - if (virtqueue_add_buf(vq, - &srbExt->sg[0], - srbExt->out, srbExt->in, - (void *)srbExt->id, va, pa) == VQ_ADD_BUFFER_SUCCESS) + if (virtqueue_add_buf(vq, &srbExt->sg[0], srbExt->out, srbExt->in, (void *)srbExt->id, va, pa) == + VQ_ADD_BUFFER_SUCCESS) { notify = virtqueue_kick_prepare(vq); InsertTailList(&element->srb_list, &srbExt->vbr.list_entry); element->srb_cnt++; VioStorVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE); #ifdef DBG - InterlockedIncrement((LONG volatile*)&adaptExt->inqueue_cnt); + InterlockedIncrement((LONG volatile *)&adaptExt->inqueue_cnt); #endif result = TRUE; } @@ -393,7 +391,7 @@ RhelDoUnMap(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) } if (notify) { - RhelDbgPrint(TRACE_LEVEL_INFORMATION, " %s virtqueue_notify %d.\n", __FUNCTION__, QueueNumber); + RhelDbgPrint(TRACE_LEVEL_INFORMATION, " %s virtqueue_notify %d.\n", __FUNCTION__, QueueNumber); virtqueue_notify(vq); } return result; @@ -467,10 +465,8 @@ RhelGetSerialNumber(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) element = &adaptExt->processing_srbs[QueueNumber]; VioStorVQLock(DeviceExtension, MessageId, &LockHandle, FALSE); - if (virtqueue_add_buf(vq, - &srbExt->sg[0], - srbExt->out, srbExt->in, - (void *)srbExt->id, va, pa) == VQ_ADD_BUFFER_SUCCESS) + if (virtqueue_add_buf(vq, &srbExt->sg[0], srbExt->out, srbExt->in, (void *)srbExt->id, va, pa) == + VQ_ADD_BUFFER_SUCCESS) { notify = virtqueue_kick_prepare(vq); InsertTailList(&element->srb_list, &srbExt->vbr.list_entry); @@ -478,7 +474,7 @@ RhelGetSerialNumber(IN PVOID DeviceExtension, IN PSRB_TYPE Srb) VioStorVQUnlock(DeviceExtension, MessageId, &LockHandle, FALSE); result = TRUE; #ifdef DBG - InterlockedIncrement((LONG volatile*)&adaptExt->inqueue_cnt); + InterlockedIncrement((LONG volatile *)&adaptExt->inqueue_cnt); #endif } else