block: Simplify bsg complete all
It took me a few tries to figure out what this code did; lets rewrite it into a more regular form. The thing that makes this one 'special' is the BSG_F_BLOCK flag, if that is not set we're not supposed/allowed to block and should spin wait for completion. The (new) io_wait_event() will never see a false condition in case of the spinning and we will therefore not block. Cc: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Jens Axboe <axboe@fb.com>
This commit is contained in:
parent
b7f120b211
commit
2c56124652
2 changed files with 40 additions and 47 deletions
|
@ -267,6 +267,21 @@ do { \
|
|||
__wait_event(wq, condition); \
|
||||
} while (0)
|
||||
|
||||
#define __io_wait_event(wq, condition) \
|
||||
(void)___wait_event(wq, condition, TASK_UNINTERRUPTIBLE, 0, 0, \
|
||||
io_schedule())
|
||||
|
||||
/*
|
||||
* io_wait_event() -- like wait_event() but with io_schedule()
|
||||
*/
|
||||
#define io_wait_event(wq, condition) \
|
||||
do { \
|
||||
might_sleep(); \
|
||||
if (condition) \
|
||||
break; \
|
||||
__io_wait_event(wq, condition); \
|
||||
} while (0)
|
||||
|
||||
#define __wait_event_freezable(wq, condition) \
|
||||
___wait_event(wq, condition, TASK_INTERRUPTIBLE, 0, 0, \
|
||||
schedule(); try_to_freeze())
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue