Files
linux/include/linux
NeilBrown 9cff8adeaa sched: Prevent recursion in io_schedule()
io_schedule() calls blk_flush_plug() which, depending on the
contents of current->plug, can initiate arbitrary blk-io requests.

Note that this contrasts with blk_schedule_flush_plug() which requires
all non-trivial work to be handed off to a separate thread.

This makes it possible for io_schedule() to recurse, and initiating
block requests could possibly call mempool_alloc() which, in times of
memory pressure, uses io_schedule().

Apart from any stack usage issues, io_schedule() will not behave
correctly when called recursively as delayacct_blkio_start() does
not allow for repeated calls.

So:
 - use ->in_iowait to detect recursion.  Set it earlier, and restore
   it to the old value.
 - move the call to "raw_rq" after the call to blk_flush_plug().
   As this is some sort of per-cpu thing, we want some chance that
   we are on the right CPU
 - When io_schedule() is called recurively, use blk_schedule_flush_plug()
   which cannot further recurse.
 - as this makes io_schedule() a lot more complex and as io_schedule()
   must match io_schedule_timeout(), but all the changes in io_schedule_timeout()
   and make io_schedule a simple wrapper for that.

Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
[ Moved the now rudimentary io_schedule() into sched.h. ]
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Tony Battersby <tonyb@cybernetics.com>
Link: http://lkml.kernel.org/r/20150213162600.059fffb2@notabene.brown
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2015-02-18 14:27:44 +01:00
..
2014-09-22 16:48:47 +09:00
2014-12-02 16:20:59 -08:00
2014-11-24 17:24:08 -05:00
2014-12-15 18:19:03 -08:00
2014-11-25 20:11:12 -08:00
2014-12-18 19:08:10 -08:00
2014-12-19 22:55:06 +01:00
2014-07-08 13:36:52 -07:00
2014-11-10 09:27:30 -07:00
2014-01-16 10:23:02 +10:30
2014-11-04 17:34:15 -08:00
2014-04-01 23:19:14 -04:00
2014-10-09 11:35:48 +03:00
2014-10-08 16:01:41 -04:00
2014-08-07 14:40:08 -04:00
2014-04-18 14:20:48 +02:00
2014-08-06 18:01:24 -07:00
2014-05-20 10:30:40 +09:00
2014-01-16 11:15:50 +01:00
2014-06-06 16:08:13 -07:00
2014-09-29 15:37:01 -04:00
2014-06-02 14:56:01 -07:00
2013-12-29 16:34:25 -05:00
2014-03-13 12:11:00 +10:30
2014-07-22 21:55:45 +01:00
2014-12-18 09:39:51 +01:00
2014-05-27 17:38:11 -07:00
2013-12-26 13:29:35 -05:00
2014-12-17 08:26:51 -05:00
2015-01-29 10:51:32 -08:00
2014-10-09 22:25:58 -04:00
2014-10-24 00:14:36 +02:00
2014-03-04 13:51:06 -05:00
2014-01-27 21:02:39 -08:00
2014-04-01 23:19:10 -04:00
2014-11-25 16:38:32 -05:00
2014-11-25 16:38:32 -05:00
2014-01-25 03:14:05 -05:00
2014-04-07 10:59:19 -07:00
2014-11-04 13:18:52 -07:00
2014-11-04 13:29:38 +00:00
2014-07-09 14:58:37 +01:00
2015-01-06 11:01:13 -08:00
2014-08-08 15:57:26 -07:00
2014-08-08 15:57:31 -07:00
2015-01-22 15:10:56 +01:00
2014-06-12 00:21:11 -04:00
2014-06-04 16:53:57 -07:00
2014-08-08 15:57:24 -07:00
2014-06-04 16:53:56 -07:00
2014-11-06 14:57:27 -08:00
2014-12-17 06:43:56 -05:00
2014-09-23 21:40:48 -07:00
2014-11-28 16:08:16 +01:00
2014-09-16 15:02:55 -06:00
2014-12-09 12:05:24 +02:00
2014-04-07 16:35:53 -07:00
2014-06-04 16:53:57 -07:00
2014-12-15 23:49:28 +02:00