From: Madhuparna Bhowmik <madhuparnabhowmik04@xxxxxxxxx> The address_handler_list is traversed with list_for_each_entry_rcu with address_handler_list_lock held. list_for_each_entry_rcu has built-in RCU and lock checking. Use it for address_handler_list traversal. Signed-off-by: Madhuparna Bhowmik <madhuparnabhowmik04@xxxxxxxxx> --- drivers/firewire/core-transaction.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/firewire/core-transaction.c b/drivers/firewire/core-transaction.c index 404a035f104d..a15e70027932 100644 --- a/drivers/firewire/core-transaction.c +++ b/drivers/firewire/core-transaction.c @@ -61,6 +61,11 @@ #define PHY_CONFIG_ROOT_ID(node_id) ((((node_id) & 0x3f) << 24) | (1 << 23)) #define PHY_IDENTIFIER(id) ((id) << 30) +static DEFINE_SPINLOCK(address_handler_list_lock); +static LIST_HEAD(address_handler_list); + +#define address_handler_list_lock_held() lock_is_held(&(address_handler_list_lock).dep_map) + /* returns 0 if the split timeout handler is already running */ static int try_cancel_split_timeout(struct fw_transaction *t) { @@ -485,7 +490,7 @@ static struct fw_address_handler *lookup_overlapping_address_handler( { struct fw_address_handler *handler; - list_for_each_entry_rcu(handler, list, link) { + list_for_each_entry_rcu(handler, list, link, address_handler_list_lock_held()) { if (handler->offset < offset + length && offset < handler->offset + handler->length) return handler; @@ -514,8 +519,6 @@ static struct fw_address_handler *lookup_enclosing_address_handler( return NULL; } -static DEFINE_SPINLOCK(address_handler_list_lock); -static LIST_HEAD(address_handler_list); const struct fw_address_region fw_high_memory_region = { .start = FW_MAX_PHYSICAL_RANGE, .end = 0xffffe0000000ULL, }; -- 2.17.1