diff options
author | Oleg Nesterov <oleg@tv-sign.ru> | 2006-08-29 03:15:14 -0400 |
---|---|---|
committer | Jens Axboe <axboe@nelson.home.kernel.dk> | 2006-09-30 14:31:18 -0400 |
commit | 25034d7a83cf77667f3d65822484b305d4be6b25 (patch) | |
tree | 7e4d432aae0cab93c22e692ceceffe2b5f7500d6 /block/ll_rw_blk.c | |
parent | 9bf09c23853bb8009625c2ec60dc6beb9472d3ca (diff) |
[PATCH] exit_io_context: don't disable irqs
We don't need to disable irqs to clear current->io_context, it is protected
by ->alloc_lock. Even IF it was possible to submit I/O from IRQ on behalf of
current this irq_disable() can't help: current_io_context() will re-instantiate
->io_context after irq_enable().
We don't need task_lock() or local_irq_disable() to clear ioc->task. This can't
prevent other CPUs from playing with our io_context anyway.
Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/ll_rw_blk.c')
-rw-r--r-- | block/ll_rw_blk.c | 7 |
1 files changed, 2 insertions, 5 deletions
diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c index 57992ae511c2..f757ed413214 100644 --- a/block/ll_rw_blk.c +++ b/block/ll_rw_blk.c | |||
@@ -3629,25 +3629,22 @@ EXPORT_SYMBOL(put_io_context); | |||
3629 | /* Called by the exitting task */ | 3629 | /* Called by the exitting task */ |
3630 | void exit_io_context(void) | 3630 | void exit_io_context(void) |
3631 | { | 3631 | { |
3632 | unsigned long flags; | ||
3633 | struct io_context *ioc; | 3632 | struct io_context *ioc; |
3634 | struct cfq_io_context *cic; | 3633 | struct cfq_io_context *cic; |
3635 | 3634 | ||
3636 | local_irq_save(flags); | ||
3637 | task_lock(current); | 3635 | task_lock(current); |
3638 | ioc = current->io_context; | 3636 | ioc = current->io_context; |
3639 | current->io_context = NULL; | 3637 | current->io_context = NULL; |
3640 | ioc->task = NULL; | ||
3641 | task_unlock(current); | 3638 | task_unlock(current); |
3642 | local_irq_restore(flags); | ||
3643 | 3639 | ||
3640 | ioc->task = NULL; | ||
3644 | if (ioc->aic && ioc->aic->exit) | 3641 | if (ioc->aic && ioc->aic->exit) |
3645 | ioc->aic->exit(ioc->aic); | 3642 | ioc->aic->exit(ioc->aic); |
3646 | if (ioc->cic_root.rb_node != NULL) { | 3643 | if (ioc->cic_root.rb_node != NULL) { |
3647 | cic = rb_entry(rb_first(&ioc->cic_root), struct cfq_io_context, rb_node); | 3644 | cic = rb_entry(rb_first(&ioc->cic_root), struct cfq_io_context, rb_node); |
3648 | cic->exit(ioc); | 3645 | cic->exit(ioc); |
3649 | } | 3646 | } |
3650 | 3647 | ||
3651 | put_io_context(ioc); | 3648 | put_io_context(ioc); |
3652 | } | 3649 | } |
3653 | 3650 | ||