target: Perform RCU callback barrier before backend/fabric unload
authorNicholas Bellinger <nab@linux-iscsi.org>
Thu, 30 Jul 2015 05:27:13 +0000 (22:27 -0700)
committerNicholas Bellinger <nab@linux-iscsi.org>
Fri, 31 Jul 2015 05:06:29 +0000 (22:06 -0700)
commit9450918293b3c35f11883231a53da1aed2c78403
treeed355995df7cb6b312afbad50afd570024e11529
parentc4cfdd81c8fde84e2c75bc90533c7e1276937d3a
target: Perform RCU callback barrier before backend/fabric unload

This patch addresses a v4.2-rc1 regression where backend driver
module unload happening immediately after TBO->free_device()
does internal call_rcu(), will currently result in IRQ context
rcu_process_callbacks() use-after-free paging OOPsen.

It adds the missing rcu_barrier() in target_backend_unregister()
to perform an explicit RCU barrier waiting for all RCU callbacks
to complete before releasing target_backend_ops memory, and
allowing TBO->module exit to proceed.

Also, do the same for fabric drivers in target_unregister_template()
to ensure se_deve_entry->rcu_head -> kfree_rcu() callbacks have
completed, before allowing target_core_fabric_ops->owner module
exit to proceed.

Acked-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Hannes Reinecke <hare@suse.de>
Cc: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
drivers/target/target_core_configfs.c
drivers/target/target_core_hba.c