Commit 3c9c708c9fc967e389f85bc735e4c1f65d67334e
Committed by
Jens Axboe
1 parent
b77874c969
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
block: avoid infinite loop in get_task_io_context()
Calling get_task_io_context() on a exiting task which isn't %current can loop forever. This triggers at boot time on my dev machine. BUG: soft lockup - CPU#3 stuck for 22s ! [mountall.1603] Fix this by making create_task_io_context() returns -EBUSY in this case to break the loop. Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Tejun Heo <tj@kernel.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Alan Cox <alan@linux.intel.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Showing 1 changed file with 5 additions and 1 deletions Side-by-side Diff
block/blk-ioc.c
... | ... | @@ -235,6 +235,7 @@ |
235 | 235 | int create_task_io_context(struct task_struct *task, gfp_t gfp_flags, int node) |
236 | 236 | { |
237 | 237 | struct io_context *ioc; |
238 | + int ret; | |
238 | 239 | |
239 | 240 | ioc = kmem_cache_alloc_node(iocontext_cachep, gfp_flags | __GFP_ZERO, |
240 | 241 | node); |
241 | 242 | |
... | ... | @@ -262,9 +263,12 @@ |
262 | 263 | task->io_context = ioc; |
263 | 264 | else |
264 | 265 | kmem_cache_free(iocontext_cachep, ioc); |
266 | + | |
267 | + ret = task->io_context ? 0 : -EBUSY; | |
268 | + | |
265 | 269 | task_unlock(task); |
266 | 270 | |
267 | - return 0; | |
271 | + return ret; | |
268 | 272 | } |
269 | 273 | |
270 | 274 | /** |