]> www.infradead.org Git - users/willy/pagecache.git/commitdiff
cxl/core: Use guard() to drop goto pattern of cxl_dpa_alloc()
authorLi Ming <ming.li@zohomail.com>
Fri, 21 Feb 2025 01:24:51 +0000 (09:24 +0800)
committerDave Jiang <dave.jiang@intel.com>
Fri, 14 Mar 2025 21:45:04 +0000 (14:45 -0700)
In cxl_dpa_alloc(), some checking and operations need to be protected by
a rwsem called cxl_dpa_rwsem, so there is a goto pattern in
cxl_dpa_alloc() to release the rwsem. The goto pattern can be optimized
by using guard() to hold the rwsem.

Creating a new function called __cxl_dpa_alloc() to include all checking
and operations needed to be protected by cxl_dpa_rwsem. Using
guard(rwsem_write()) to hold cxl_dpa_rwsem at the beginning of the new
function.

Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Reviewed-by: Alison Schofield <alison.schofield@intel.com>
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Reviewed-by: Ira Weiny <ira.weiny@intel.com>
Acked-by: Davidlohr Bueso <dave@stgolabs.net>
Signed-off-by: Li Ming <ming.li@zohomail.com>
Link: https://patch.msgid.link/20250221012453.126366-6-ming.li@zohomail.com
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
drivers/cxl/core/hdm.c

index 874a791f829242e687ea706214188a14621616ef..1edbf787347199401200224ae45b8d05dadbb5ad 100644 (file)
@@ -442,29 +442,25 @@ int cxl_dpa_set_mode(struct cxl_endpoint_decoder *cxled,
        return 0;
 }
 
-int cxl_dpa_alloc(struct cxl_endpoint_decoder *cxled, unsigned long long size)
+static int __cxl_dpa_alloc(struct cxl_endpoint_decoder *cxled, unsigned long long size)
 {
        struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
        resource_size_t free_ram_start, free_pmem_start;
-       struct cxl_port *port = cxled_to_port(cxled);
        struct cxl_dev_state *cxlds = cxlmd->cxlds;
        struct device *dev = &cxled->cxld.dev;
        resource_size_t start, avail, skip;
        struct resource *p, *last;
-       int rc;
 
-       down_write(&cxl_dpa_rwsem);
+       guard(rwsem_write)(&cxl_dpa_rwsem);
        if (cxled->cxld.region) {
                dev_dbg(dev, "decoder attached to %s\n",
                        dev_name(&cxled->cxld.region->dev));
-               rc = -EBUSY;
-               goto out;
+               return -EBUSY;
        }
 
        if (cxled->cxld.flags & CXL_DECODER_F_ENABLE) {
                dev_dbg(dev, "decoder enabled\n");
-               rc = -EBUSY;
-               goto out;
+               return -EBUSY;
        }
 
        for (p = cxlds->ram_res.child, last = NULL; p; p = p->sibling)
@@ -504,21 +500,24 @@ int cxl_dpa_alloc(struct cxl_endpoint_decoder *cxled, unsigned long long size)
                skip = skip_end - skip_start + 1;
        } else {
                dev_dbg(dev, "mode not set\n");
-               rc = -EINVAL;
-               goto out;
+               return -EINVAL;
        }
 
        if (size > avail) {
                dev_dbg(dev, "%pa exceeds available %s capacity: %pa\n", &size,
                        cxl_decoder_mode_name(cxled->mode), &avail);
-               rc = -ENOSPC;
-               goto out;
+               return -ENOSPC;
        }
 
-       rc = __cxl_dpa_reserve(cxled, start, size, skip);
-out:
-       up_write(&cxl_dpa_rwsem);
+       return __cxl_dpa_reserve(cxled, start, size, skip);
+}
+
+int cxl_dpa_alloc(struct cxl_endpoint_decoder *cxled, unsigned long long size)
+{
+       struct cxl_port *port = cxled_to_port(cxled);
+       int rc;
 
+       rc = __cxl_dpa_alloc(cxled, size);
        if (rc)
                return rc;