scsi: sched/wait: Add wait_event_lock_irq_timeout for TASK_UNINTERRUPTIBLE usage
Short of reverting commithifive-unleashed-5.100d909a107
("scsi: target: Make the session shutdown code also wait for commands that are being aborted") for v4.19, target-core needs a wait_event_t macro can be executed using TASK_UNINTERRUPTIBLE to function correctly with existing fabric drivers that expect to run with signals pending during session shutdown and active se_cmd I/O quiesce. The most notable is iscsi-target/iser-target, while ibmvscsi_tgt invokes session shutdown logic from userspace via configfs attribute that could also potentially have signals pending. So go ahead and introduce wait_event_lock_irq_timeout() to achieve this, and update + rename __wait_event_lock_irq_timeout() to make it accept 'state' as a parameter. Fixes:00d909a107
("scsi: target: Make the session shutdown code also wait for commands that are being aborted") Cc: <stable@vger.kernel.org> # v4.19+ Cc: Bart Van Assche <bvanassche@acm.org> Cc: Mike Christie <mchristi@redhat.com> Cc: Hannes Reinecke <hare@suse.com> Cc: Christoph Hellwig <hch@lst.de> Cc: Sagi Grimberg <sagi@grimberg.me> Cc: Bryant G. Ly <bryantly@linux.vnet.ibm.com> Cc: Peter Zijlstra (Intel) <peterz@infradead.org> Tested-by: Nicholas Bellinger <nab@linux-iscsi.org> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org> Reviewed-by: Bryant G. Ly <bly@catalogicsoftware.com> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Bart Van Assche <bvanassche@acm.org> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
parent
0b4aafc332
commit
25ab0bc334
|
@ -1052,10 +1052,9 @@ do { \
|
||||||
__ret; \
|
__ret; \
|
||||||
})
|
})
|
||||||
|
|
||||||
#define __wait_event_interruptible_lock_irq_timeout(wq_head, condition, \
|
#define __wait_event_lock_irq_timeout(wq_head, condition, lock, timeout, state) \
|
||||||
lock, timeout) \
|
|
||||||
___wait_event(wq_head, ___wait_cond_timeout(condition), \
|
___wait_event(wq_head, ___wait_cond_timeout(condition), \
|
||||||
TASK_INTERRUPTIBLE, 0, timeout, \
|
state, 0, timeout, \
|
||||||
spin_unlock_irq(&lock); \
|
spin_unlock_irq(&lock); \
|
||||||
__ret = schedule_timeout(__ret); \
|
__ret = schedule_timeout(__ret); \
|
||||||
spin_lock_irq(&lock));
|
spin_lock_irq(&lock));
|
||||||
|
@ -1089,8 +1088,19 @@ do { \
|
||||||
({ \
|
({ \
|
||||||
long __ret = timeout; \
|
long __ret = timeout; \
|
||||||
if (!___wait_cond_timeout(condition)) \
|
if (!___wait_cond_timeout(condition)) \
|
||||||
__ret = __wait_event_interruptible_lock_irq_timeout( \
|
__ret = __wait_event_lock_irq_timeout( \
|
||||||
wq_head, condition, lock, timeout); \
|
wq_head, condition, lock, timeout, \
|
||||||
|
TASK_INTERRUPTIBLE); \
|
||||||
|
__ret; \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define wait_event_lock_irq_timeout(wq_head, condition, lock, timeout) \
|
||||||
|
({ \
|
||||||
|
long __ret = timeout; \
|
||||||
|
if (!___wait_cond_timeout(condition)) \
|
||||||
|
__ret = __wait_event_lock_irq_timeout( \
|
||||||
|
wq_head, condition, lock, timeout, \
|
||||||
|
TASK_UNINTERRUPTIBLE); \
|
||||||
__ret; \
|
__ret; \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue