block, cfq: move io_cq exit/release to blk-ioc.c
With kmem_cache managed by blk-ioc, io_cq exit/release can be moved to blk-ioc too. The odd ->io_cq->exit/release() callbacks are replaced with elevator_ops->elevator_exit_icq_fn() with unlinking from both ioc and q, and freeing automatically handled by blk-ioc. The elevator operation only need to perform exit operation specific to the elevator - in cfq's case, exiting the cfqq's. Also, clearing of io_cq's on q detach is moved to block core and automatically performed on elevator switch and q release. Because the q io_cq points to might be freed before RCU callback for the io_cq runs, blk-ioc code should remember to which cache the io_cq needs to be freed when the io_cq is released. New field io_cq->__rcu_icq_cache is added for this purpose. As both the new field and rcu_head are used only after io_cq is released and the q/ioc_node fields aren't, they are put into unions. Signed-off-by:Tejun Heo <tj@kernel.org> Signed-off-by:
Jens Axboe <axboe@kernel.dk>
Showing
- block/blk-ioc.c 68 additions, 8 deletionsblock/blk-ioc.c
- block/blk-sysfs.c 5 additions, 1 deletionblock/blk-sysfs.c
- block/blk.h 1 addition, 0 deletionsblock/blk.h
- block/cfq-iosched.c 2 additions, 45 deletionsblock/cfq-iosched.c
- block/elevator.c 2 additions, 1 deletionblock/elevator.c
- include/linux/elevator.h 5 additions, 0 deletionsinclude/linux/elevator.h
- include/linux/iocontext.h 14 additions, 6 deletionsinclude/linux/iocontext.h
Please register or sign in to comment