Reduce __pmem_label_update() complexity by modifying locking from
mutex_lock/unlock() with guard()

Link: https://lore.kernel.org/linux-cxl/[email protected]/
Suggested-by: Jonathan Cameron <[email protected]>
Signed-off-by: Neeraj Kumar <[email protected]>
---
 drivers/nvdimm/label.c | 32 +++++++++++++++++---------------
 1 file changed, 17 insertions(+), 15 deletions(-)

diff --git a/drivers/nvdimm/label.c b/drivers/nvdimm/label.c
index 04f4a049599a..e5325e37bccc 100644
--- a/drivers/nvdimm/label.c
+++ b/drivers/nvdimm/label.c
@@ -935,7 +935,7 @@ static int __pmem_label_update(struct nd_region *nd_region,
                return rc;
 
        /* Garbage collect the previous label */
-       mutex_lock(&nd_mapping->lock);
+       guard(mutex)(&nd_mapping->lock);
        list_for_each_entry(label_ent, &nd_mapping->labels, list) {
                if (!label_ent->label)
                        continue;
@@ -947,22 +947,24 @@ static int __pmem_label_update(struct nd_region 
*nd_region,
        /* update index */
        rc = nd_label_write_index(ndd, ndd->ns_next,
                        nd_inc_seq(__le32_to_cpu(nsindex->seq)), 0);
-       if (rc == 0) {
-               list_for_each_entry(label_ent, &nd_mapping->labels, list)
-                       if (!label_ent->label) {
-                               label_ent->label = nd_label;
-                               nd_label = NULL;
-                               break;
-                       }
-               dev_WARN_ONCE(&nspm->nsio.common.dev, nd_label,
-                               "failed to track label: %d\n",
-                               to_slot(ndd, nd_label));
-               if (nd_label)
-                       rc = -ENXIO;
+       if (rc)
+               return rc;
+
+       list_for_each_entry(label_ent, &nd_mapping->labels, list) {
+               if (label_ent->label)
+                       continue;
+
+               label_ent->label = nd_label;
+               nd_label = NULL;
+               break;
        }
-       mutex_unlock(&nd_mapping->lock);
+       dev_WARN_ONCE(&nspm->nsio.common.dev, nd_label,
+                       "failed to track label: %d\n",
+                       to_slot(ndd, nd_label));
+       if (nd_label)
+               return -ENXIO;
 
-       return rc;
+       return 0;
 }
 
 static int init_labels(struct nd_mapping *nd_mapping, int num_labels)

base-commit: 46037455cbb748c5e85071c95f2244e81986eb58
-- 
2.34.1


Reply via email to