]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/pagemap_util: Ensure proper cache lock management on free
authorJonathan Cavitt <jonathan.cavitt@intel.com>
Mon, 16 Mar 2026 15:15:56 +0000 (15:15 +0000)
committerThomas Hellström <thomas.hellstrom@linux.intel.com>
Tue, 17 Mar 2026 14:39:07 +0000 (15:39 +0100)
For the sake of consistency, ensure that the cache lock is always
unlocked after drm_pagemap_cache_fini. Spinlocks typically disable
preemption and if the code-path missing the unlock is hit, preemption
will remain disabled even if the lock is subsequently freed.

Fixes static analysis issue.

v2:
- Use requested code flow (Maarten)

v3:
- Clear cache->dpagemap (Matt Brost, Maarten)

v4:
- Reword commit message (Thomas)

Fixes: 77f14f2f2d73f ("drm/pagemap: Add a drm_pagemap cache and shrinker")
Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Thomas Hellstrom <thomas.hellstrom@linux.intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Link: https://patch.msgid.link/20260316151555.7553-2-jonathan.cavitt@intel.com
drivers/gpu/drm/drm_pagemap_util.c

index 14ddb948a32e9dd97be8d02080398558e58caee1..6111d90a38e24586fbcb06f8182e9025339b26b0 100644 (file)
@@ -65,18 +65,14 @@ static void drm_pagemap_cache_fini(void *arg)
        drm_dbg(cache->shrinker->drm, "Destroying dpagemap cache.\n");
        spin_lock(&cache->lock);
        dpagemap = cache->dpagemap;
-       if (!dpagemap) {
-               spin_unlock(&cache->lock);
-               goto out;
-       }
+       cache->dpagemap = NULL;
+       if (dpagemap && !drm_pagemap_shrinker_cancel(dpagemap))
+               dpagemap = NULL;
+       spin_unlock(&cache->lock);
 
-       if (drm_pagemap_shrinker_cancel(dpagemap)) {
-               cache->dpagemap = NULL;
-               spin_unlock(&cache->lock);
+       if (dpagemap)
                drm_pagemap_destroy(dpagemap, false);
-       }
 
-out:
        mutex_destroy(&cache->lookup_mutex);
        kfree(cache);
 }