nvmet-fc: move RCU read lock to nvmet_fc_assoc_exists
authorDaniel Wagner <dwagner@suse.de>
Thu, 4 Apr 2024 14:41:30 +0000 (16:41 +0200)
committerKeith Busch <kbusch@kernel.org>
Thu, 4 Apr 2024 15:47:56 +0000 (08:47 -0700)
The RCU lock is only needed for the lookup loop and not for
list_ad_tail_rcu call. Thus move it down the call chain into
nvmet_fc_assoc_exists.

While at it also fix the name typo of the function.

Signed-off-by: Daniel Wagner <dwagner@suse.de>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
drivers/nvme/target/fc.c

index fd229f310c931fbfd6c3132185f2b73c135cd633..337ee1cb09ae644bb98bdf5e8da0525ff40230c3 100644 (file)
@@ -1115,16 +1115,21 @@ nvmet_fc_schedule_delete_assoc(struct nvmet_fc_tgt_assoc *assoc)
 }
 
 static bool
-nvmet_fc_assoc_exits(struct nvmet_fc_tgtport *tgtport, u64 association_id)
+nvmet_fc_assoc_exists(struct nvmet_fc_tgtport *tgtport, u64 association_id)
 {
        struct nvmet_fc_tgt_assoc *a;
+       bool found = false;
 
+       rcu_read_lock();
        list_for_each_entry_rcu(a, &tgtport->assoc_list, a_list) {
-               if (association_id == a->association_id)
-                       return true;
+               if (association_id == a->association_id) {
+                       found = true;
+                       break;
+               }
        }
+       rcu_read_unlock();
 
-       return false;
+       return found;
 }
 
 static struct nvmet_fc_tgt_assoc *
@@ -1164,13 +1169,11 @@ nvmet_fc_alloc_target_assoc(struct nvmet_fc_tgtport *tgtport, void *hosthandle)
                ran = ran << BYTES_FOR_QID_SHIFT;
 
                spin_lock_irqsave(&tgtport->lock, flags);
-               rcu_read_lock();
-               if (!nvmet_fc_assoc_exits(tgtport, ran)) {
+               if (!nvmet_fc_assoc_exists(tgtport, ran)) {
                        assoc->association_id = ran;
                        list_add_tail_rcu(&assoc->a_list, &tgtport->assoc_list);
                        done = true;
                }
-               rcu_read_unlock();
                spin_unlock_irqrestore(&tgtport->lock, flags);
        } while (!done);