Skip to content

Commit 473619a

Browse files
benyamin-codezkostyanf14
authored andcommitted
[viostor] Fix for clobbered SRB Extension IDs
Refactors SRB Extension ID assignment: 1. Moves assignment from VirtIoStartIo() in virtio_stor.c to virtio_stor_hw_helper.c: - RhelDoFlush() - RhelDoReadWrite() - RhelDoUnMap() - RhelGetSerialNumber() 2. Moves ULONG_PTR from _ADAPTER_EXTENSION stuct to _REQUEST_LIST struct 3. Renames ULONG_PTR from last_srb_id to next_id 4. Refactors element assignment to be under spinlock 5. Moves ULONG_PTR id towards top of _SRB_EXTENSION struct to resolve memory alignment issue. The refactor solves the problem because the assignment now occurs under spinlock. Resolves #1466 Reported by: @iops-hunter Signed-off-by: benyamin-codez <115509179+benyamin-codez@users.noreply.github.com>
1 parent cade4cb commit 473619a

3 files changed

Lines changed: 60 additions & 16 deletions

File tree

viostor/virtio_stor.c

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,6 @@ VirtIoFindAdapter(IN PVOID DeviceExtension,
259259

260260
adaptExt = (PADAPTER_EXTENSION)DeviceExtension;
261261

262-
adaptExt->last_srb_id = 1;
263262
adaptExt->system_io_bus_number = ConfigInfo->SystemIoBusNumber;
264263
adaptExt->slot_number = ConfigInfo->SlotNumber;
265264
adaptExt->dump_mode = IsCrashDumpMode;
@@ -895,17 +894,9 @@ VirtIoStartIo(IN PVOID DeviceExtension, IN PSCSI_REQUEST_BLOCK Srb)
895894
{
896895
PCDB cdb = SRB_CDB(Srb);
897896
PADAPTER_EXTENSION adaptExt;
898-
PSRB_EXTENSION srbExt;
899897
UCHAR ScsiStatus = SCSISTAT_GOOD;
900898

901899
adaptExt = (PADAPTER_EXTENSION)DeviceExtension;
902-
srbExt = SRB_EXTENSION(Srb);
903-
srbExt->id = adaptExt->last_srb_id;
904-
adaptExt->last_srb_id++;
905-
if (adaptExt->last_srb_id == 0)
906-
{
907-
adaptExt->last_srb_id++;
908-
}
909900

910901
SRB_SET_SCSI_STATUS(((PSRB_TYPE)Srb), ScsiStatus);
911902

@@ -2136,6 +2127,7 @@ VOID VioStorCompleteRequest(IN PVOID DeviceExtension, IN ULONG MessageID, IN BOO
21362127

21372128
Srb = (PSRB_TYPE)req->req;
21382129
srbExt = SRB_EXTENSION(Srb);
2130+
21392131
// Only SRBs with existing (i.e. non-NULL) extension
21402132
// are inserted into our queues, thus, we may help
21412133
// the Code Analysis and provide it with this information
@@ -2144,8 +2136,8 @@ VOID VioStorCompleteRequest(IN PVOID DeviceExtension, IN ULONG MessageID, IN BOO
21442136
if (srbExt->id == srbId)
21452137
{
21462138
RemoveEntryList(le);
2147-
element->srb_cnt--;
21482139
bFound = TRUE;
2140+
element->srb_cnt--;
21492141
break;
21502142
}
21512143
}

viostor/virtio_stor.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ typedef struct _REQUEST_LIST
204204
{
205205
LIST_ENTRY srb_list;
206206
ULONG srb_cnt;
207+
ULONG_PTR next_id;
207208
} REQUEST_LIST, *PREQUEST_LIST;
208209

209210
typedef struct _ADAPTER_EXTENSION
@@ -256,7 +257,6 @@ typedef struct _ADAPTER_EXTENSION
256257
REQUEST_LIST processing_srbs[MAX_CPU];
257258
BOOLEAN reset_in_progress;
258259
ULONGLONG fw_ver;
259-
ULONG_PTR last_srb_id;
260260
#ifdef DBG
261261
LONG srb_cnt;
262262
LONG inqueue_cnt;
@@ -274,11 +274,11 @@ typedef struct _VRING_DESC_ALIAS
274274
typedef struct _SRB_EXTENSION
275275
{
276276
blk_req vbr;
277+
ULONG_PTR id;
277278
ULONG out;
278279
ULONG in;
279280
ULONG MessageID;
280281
BOOLEAN fua;
281-
ULONG_PTR id;
282282
VIO_SG sg[VIRTIO_MAX_SG];
283283
VRING_DESC_ALIAS desc[VIRTIO_MAX_SG];
284284
} SRB_EXTENSION, *PSRB_EXTENSION;

viostor/virtio_stor_hw_helper.c

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,11 +127,27 @@ RhelDoFlush(PVOID DeviceExtension, PSRB_TYPE Srb, BOOLEAN resend, BOOLEAN bIsr)
127127
srbExt->sg[1].physAddr = StorPortGetPhysicalAddress(DeviceExtension, NULL, &srbExt->vbr.status, &fragLen);
128128
srbExt->sg[1].length = sizeof(srbExt->vbr.status);
129129

130-
element = &adaptExt->processing_srbs[QueueNumber];
131130
if (!resend)
132131
{
133132
VioStorVQLock(DeviceExtension, MessageId, &LockHandle, FALSE);
133+
134+
element = &adaptExt->processing_srbs[QueueNumber];
135+
136+
ULONG_PTR id = element->next_id;
137+
138+
if (id == 0)
139+
{
140+
id++;
141+
}
142+
143+
srbExt->id = id;
144+
element->next_id = ++id;
145+
}
146+
else
147+
{
148+
element = &adaptExt->processing_srbs[QueueNumber];
134149
}
150+
135151
if (virtqueue_add_buf(vq, &srbExt->sg[0], srbExt->out, srbExt->in, (void *)srbExt->id, va, pa) ==
136152
VQ_ADD_BUFFER_SUCCESS)
137153
{
@@ -216,8 +232,20 @@ RhelDoReadWrite(PVOID DeviceExtension, PSRB_TYPE Srb)
216232
vq = adaptExt->vq[QueueNumber];
217233
RhelDbgPrint(TRACE_LEVEL_VERBOSE, " QueueNumber 0x%x vq = %p\n", QueueNumber, vq);
218234

219-
element = &adaptExt->processing_srbs[QueueNumber];
220235
VioStorVQLock(DeviceExtension, MessageId, &LockHandle, FALSE);
236+
237+
element = &adaptExt->processing_srbs[QueueNumber];
238+
239+
ULONG_PTR id = element->next_id;
240+
241+
if (id == 0)
242+
{
243+
id++;
244+
}
245+
246+
srbExt->id = id;
247+
element->next_id = ++id;
248+
221249
if (virtqueue_add_buf(vq, &srbExt->sg[0], srbExt->out, srbExt->in, (void *)srbExt->id, va, pa) ==
222250
VQ_ADD_BUFFER_SUCCESS)
223251
{
@@ -369,8 +397,20 @@ RhelDoUnMap(IN PVOID DeviceExtension, IN PSRB_TYPE Srb)
369397
vq,
370398
srbExt->vbr.out_hdr.type);
371399

372-
element = &adaptExt->processing_srbs[QueueNumber];
373400
VioStorVQLock(DeviceExtension, MessageId, &LockHandle, FALSE);
401+
402+
element = &adaptExt->processing_srbs[QueueNumber];
403+
404+
ULONG_PTR id = element->next_id;
405+
406+
if (id == 0)
407+
{
408+
id++;
409+
}
410+
411+
srbExt->id = id;
412+
element->next_id = ++id;
413+
374414
if (virtqueue_add_buf(vq, &srbExt->sg[0], srbExt->out, srbExt->in, (void *)srbExt->id, va, pa) ==
375415
VQ_ADD_BUFFER_SUCCESS)
376416
{
@@ -463,8 +503,20 @@ RhelGetSerialNumber(IN PVOID DeviceExtension, IN PSRB_TYPE Srb)
463503
srbExt->sg[2].physAddr = StorPortGetPhysicalAddress(DeviceExtension, NULL, &srbExt->vbr.status, &fragLen);
464504
srbExt->sg[2].length = sizeof(srbExt->vbr.status);
465505

466-
element = &adaptExt->processing_srbs[QueueNumber];
467506
VioStorVQLock(DeviceExtension, MessageId, &LockHandle, FALSE);
507+
508+
element = &adaptExt->processing_srbs[QueueNumber];
509+
510+
ULONG_PTR id = element->next_id;
511+
512+
if (id == 0)
513+
{
514+
id++;
515+
}
516+
517+
srbExt->id = id;
518+
element->next_id = ++id;
519+
468520
if (virtqueue_add_buf(vq, &srbExt->sg[0], srbExt->out, srbExt->in, (void *)srbExt->id, va, pa) ==
469521
VQ_ADD_BUFFER_SUCCESS)
470522
{

0 commit comments

Comments
 (0)