Skip to content

Commit 0bfe63d

Browse files
bvanasschemartinkpetersen
authored andcommitted
scsi: device_handler: alua: Remove a might_sleep() annotation
The might_sleep() annotation in alua_rtpg_queue() is not correct since the command completion code may call this function from atomic context. Calling alua_rtpg_queue() from atomic context in the command completion path is fine since request submitters must hold an sdev reference until command execution has completed. This patch fixes the following kernel complaint: BUG: sleeping function called from invalid context at drivers/scsi/device_handler/scsi_dh_alua.c:992 Call Trace: dump_stack_lvl+0xac/0x100 __might_resched+0x284/0x2c8 alua_rtpg_queue+0x3c/0x98 [scsi_dh_alua] alua_check+0x122/0x250 [scsi_dh_alua] alua_check_sense+0x172/0x228 [scsi_dh_alua] scsi_check_sense+0x8a/0x2e0 scsi_decide_disposition+0x286/0x298 scsi_complete+0x6a/0x108 blk_complete_reqs+0x6e/0x88 __do_softirq+0x13e/0x6b8 __irq_exit_rcu+0x14a/0x170 irq_exit_rcu+0x22/0x50 do_ext_irq+0x10a/0x1d0 Link: https://lore.kernel.org/r/20230118180557.1212577-1-bvanassche@acm.org Reported-by: Steffen Maier <maier@linux.ibm.com> Reviewed-by: Martin Wilck <mwilck@suse.com> Tested-by: Steffen Maier <maier@linux.ibm.com> Signed-off-by: Bart Van Assche <bvanassche@acm.org> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent f484a79 commit 0bfe63d

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

drivers/scsi/device_handler/scsi_dh_alua.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -981,6 +981,9 @@ static void alua_rtpg_work(struct work_struct *work)
981981
*
982982
* Returns true if and only if alua_rtpg_work() will be called asynchronously.
983983
* That function is responsible for calling @qdata->fn().
984+
*
985+
* Context: may be called from atomic context (alua_check()) only if the caller
986+
* holds an sdev reference.
984987
*/
985988
static bool alua_rtpg_queue(struct alua_port_group *pg,
986989
struct scsi_device *sdev,
@@ -989,8 +992,6 @@ static bool alua_rtpg_queue(struct alua_port_group *pg,
989992
int start_queue = 0;
990993
unsigned long flags;
991994

992-
might_sleep();
993-
994995
if (WARN_ON_ONCE(!pg) || scsi_device_get(sdev))
995996
return false;
996997

0 commit comments

Comments
 (0)