exit_io_context: don't disable irqs
PATCH 1/1 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.
block/ll_rw_blk.c renamed from block/ll_rw_blk.c~6_exit +2 -5
@@ -3580,25 +3580,22 @@ EXPORT_SYMBOL(put_io_context);/* Called by the exitting task */ void exit_io_context (void ) { -unsigned long flags;struct io_context *ioc;struct cfq_io_context *cic; -local_irq_save (flags);task_lock (current); ioc = current->io_context; current->io_context =NULL ; - ioc->task =NULL ;task_unlock (current); -local_irq_restore (flags); + ioc->task =NULL ;if (ioc->aic && ioc->aic->exit) ioc->aic->exit (ioc->aic);if (ioc->cic_root.rb_node !=NULL ) { cic = rb_entry(rb_first(&ioc->cic_root), struct cfq_io_context, rb_node); cic->exit (ioc); } - +put_io_context (ioc); }
Quoted 10 lines · Oleg Nesterov
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 thisirq_disable()can't help:current_io_context()will re-instantiate ->io_context afterirq_enable().We don't need
task_lock()orlocal_irq_disable()to clearioc->task. This can't prevent other CPUs from playing with ourio_contextanyway.Signed-off-by Oleg Nesterov <[email protected]>
Applied, thanks.
Signature · 1 line
Jens Axboe