I think as you raise notify event from callback to notify you have to protect 
critical data, mainly the transfer queue, by raising TPL to NOTIFY at accessing 
code as well.

Others look good to me.

Reviewed-by: Feng Tian <[email protected]>

-----Original Message-----
From: edk2-devel [mailto:[email protected]] On Behalf Of Hao Wu
Sent: Tuesday, December 22, 2015 00:15
To: [email protected]; Tian, Feng
Cc: Wu, Hao A
Subject: [edk2] [PATCH 0/4] Raise Tpl to TPL_NOTIFY when dealing SCSI async I/O

When reading data from non-blockingly from a CD-ROM logic partition, the 
procedure can be shown by the following call stack:
(The write process is similar)

|-------------------|
| DiskIoDxe (logic) |<---Raise Tpl to TPL_CALLBACK
|-------------------|
 |
 | Sub-task 1 (UnderRun) succeeds
 |
 |    |-----------------|     |-----------------|     |-----------------|
 +--->|  PartitionDxe   |---->| DiskIoDxe (Phy) |---->|   ScsiDiskDxe   |
 |    |-----------------|     |-----------------|     |-----------------|
 |
 | Sub-task 2 (OverRun) fails
 |
 |    |-----------------|     |-----------------|     |-----------------|
 +--->|  PartitionDxe   |---->| DiskIoDxe (Phy) |---->|   ScsiDiskDxe   |
 |    |-----------------|     |-----------------|     |-----------------|
 |                                     ^
 |                                     |
 More subtasks...              Wait indefinitely
 |
 |<---Restore Tpl
 |
 Completes

In PartitionDxe, if the 'Lba' and 'BufferSize' parameters passed to function 
PartitionReadBlocksEx() are invalid, the function will issue a blocking 
ReadDisk call (in function ProbeMediaStatusEx()).

In DiskIoDxe, blocking I/O request will wait for all the non-blocking I/O 
requests to complete first before sending down the blocking request.

If the Tpl of the async I/O callback in ScsiDiskDxe is TPL_CALLBACK and 
Sub-task 1 (UnderRun) succeeds but Sub-task 2 (OverRun) fails with an invalid 
parameter, DiskIoDxe will wait indefinitely for the event created by 
ScsiDiskDxe of Sub-task 1 to signal.

Therefore, the async I/O callback functions in ScsiDiskDxe, ScsiBusDxe and 
UefiScsiLib need to raise Tpl to TPL_NOTIFY to avoid the above-mentioned 
indefinite wait. Plus, the UFS PassThru driver also needs to raise Tpl to 
TPL_NOTIFY when processing async SCSI task list.

Hao Wu (4):
  MdeModulePkg ScsiDiskDxe: Raise the Tpl of async IO callback to
    TPL_NOTIFY
  MdePkg UefiScsiLib: Raise the Tpl of async IO callback to TPL_NOTIFY
  MdeModulePkg ScsiBusDxe: Raise the Tpl of async IO callback to
    TPL_NOTIFY
  MdeModulePkg UfsPassThruDxe: Raise to TPL_NOTIFY when dealing async
    task

 MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.c         |  2 +-
 MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c       | 59 ++++++++++++++++++----
 MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.h       |  8 ++-
 MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c  |  2 +-
 .../Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c        |  2 +-
 MdePkg/Library/UefiScsiLib/UefiScsiLib.c           |  8 +--
 6 files changed, 62 insertions(+), 19 deletions(-)

--
1.9.5.msysgit.0

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to