]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
cxl/region: Fix cxl_region leak, cleanup targets at region delete
authorDan Williams <dan.j.williams@intel.com>
Fri, 4 Nov 2022 00:30:30 +0000 (17:30 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 10 Nov 2022 17:17:32 +0000 (18:17 +0100)
commit 0d9e734018d70cecf79e2e4c6082167160a0f13f upstream.

When a region is deleted any targets that have been previously assigned
to that region hold references to it. Trigger those references to
drop by detaching all targets at unregister_region() time.

Otherwise that region object will leak as userspace has lost the ability
to detach targets once region sysfs is torn down.

Cc: <stable@vger.kernel.org>
Fixes: b9686e8c8e39 ("cxl/region: Enable the assignment of endpoint decoders to regions")
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Reviewed-by: Vishal Verma <vishal.l.verma@intel.com>
Link: https://lore.kernel.org/r/166752183055.947915.17681995648556534844.stgit@dwillia2-xfh.jf.intel.com
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/cxl/core/region.c

index 80dd9608324cc3755a9f7ff7af0ff722c8ec4b46..bc3ca659fd47ce383ec269ac2d4bb2b5f2e9fb5b 100644 (file)
@@ -1556,8 +1556,19 @@ static struct cxl_region *to_cxl_region(struct device *dev)
 static void unregister_region(void *dev)
 {
        struct cxl_region *cxlr = to_cxl_region(dev);
+       struct cxl_region_params *p = &cxlr->params;
+       int i;
 
        device_del(dev);
+
+       /*
+        * Now that region sysfs is shutdown, the parameter block is now
+        * read-only, so no need to hold the region rwsem to access the
+        * region parameters.
+        */
+       for (i = 0; i < p->interleave_ways; i++)
+               detach_target(cxlr, i);
+
        cxl_region_iomem_release(cxlr);
        put_device(dev);
 }