]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/msm: Replace custom dumb_map_offset with generic helper
authorSwaraj Gaikwad <swarajgaikwad1925@gmail.com>
Mon, 15 Dec 2025 02:28:50 +0000 (02:28 +0000)
committerRob Clark <robin.clark@oss.qualcomm.com>
Sun, 18 Jan 2026 15:35:55 +0000 (07:35 -0800)
The msm driver implements a custom dumb_map_offset callback. This
implementation acquires the msm_gem_lock, but the underlying
drm_gem_create_mmap_offset() function is already thread-safe regarding
the VMA offset manager (it acquires the mgr->vm_lock internally).

Switching to the generic drm_gem_dumb_map_offset() helper provides
several benefits:
1. Removes the unnecessary locking overhead (locking leftovers).
2. Adds a missing check to reject mapping of imported objects, which is
   invalid for dumb buffers.
3. Allows for the removal of the msm_gem_dumb_map_offset() wrapper and
   the msm_gem_mmap_offset() helper function.

The logic from msm_gem_mmap_offset() has been inlined into
msm_ioctl_gem_info() to maintain functionality without the separate
helper.

This addresses the TODO:
"Documentation/gpu/todo.rst: Remove custom dumb_map_offset implementations"

Signed-off-by: Swaraj Gaikwad <swarajgaikwad1925@gmail.com>
Patchwork: https://patchwork.freedesktop.org/patch/694727/
Message-ID: <20251215022850.12358-1-swarajgaikwad1925@gmail.com>
Signed-off-by: Rob Clark <robin.clark@oss.qualcomm.com>
drivers/gpu/drm/msm/msm_drv.c
drivers/gpu/drm/msm/msm_gem.c
drivers/gpu/drm/msm/msm_gem.h

index abee7149a9e87415a3ca9323573bcbd1d6b9bc50..ed2a61c66ac90b76861d545bdc07349a27bef479 100644 (file)
@@ -588,7 +588,9 @@ static int msm_ioctl_gem_info(struct drm_device *dev, void *data,
 
        switch (args->info) {
        case MSM_INFO_GET_OFFSET:
-               args->value = msm_gem_mmap_offset(obj);
+               ret = drm_gem_create_mmap_offset(obj);
+               if (ret == 0)
+                   args->value = drm_vma_node_offset_addr(&obj->vma_node);
                break;
        case MSM_INFO_GET_IOVA:
                ret = msm_ioctl_gem_info_iova(dev, file, obj, &args->value);
@@ -836,7 +838,7 @@ static const struct drm_driver msm_driver = {
        .open               = msm_open,
        .postclose          = msm_postclose,
        .dumb_create        = msm_gem_dumb_create,
-       .dumb_map_offset    = msm_gem_dumb_map_offset,
+       .dumb_map_offset    = drm_gem_dumb_map_offset,
        .gem_prime_import   = msm_gem_prime_import,
        .gem_prime_import_sg_table = msm_gem_prime_import_sg_table,
 #ifdef CONFIG_DEBUG_FS
@@ -859,7 +861,7 @@ static const struct drm_driver msm_kms_driver = {
        .open               = msm_open,
        .postclose          = msm_postclose,
        .dumb_create        = msm_gem_dumb_create,
-       .dumb_map_offset    = msm_gem_dumb_map_offset,
+       .dumb_map_offset    = drm_gem_dumb_map_offset,
        .gem_prime_import_sg_table = msm_gem_prime_import_sg_table,
 #ifdef CONFIG_DEBUG_FS
        .debugfs_init       = msm_debugfs_init,
index 017411a0bf4503f02b04d9aa9177958762e950e4..da74f1413f94390f5d920516c50ab38399c4ff2a 100644 (file)
@@ -375,34 +375,6 @@ out:
        return ret;
 }
 
-/** get mmap offset */
-static uint64_t mmap_offset(struct drm_gem_object *obj)
-{
-       struct drm_device *dev = obj->dev;
-       int ret;
-
-       msm_gem_assert_locked(obj);
-
-       /* Make it mmapable */
-       ret = drm_gem_create_mmap_offset(obj);
-
-       if (ret) {
-               DRM_DEV_ERROR(dev->dev, "could not allocate mmap offset\n");
-               return 0;
-       }
-
-       return drm_vma_node_offset_addr(&obj->vma_node);
-}
-
-uint64_t msm_gem_mmap_offset(struct drm_gem_object *obj)
-{
-       uint64_t offset;
-
-       msm_gem_lock(obj);
-       offset = mmap_offset(obj);
-       msm_gem_unlock(obj);
-       return offset;
-}
 
 static struct drm_gpuva *lookup_vma(struct drm_gem_object *obj,
                                    struct drm_gpuvm *vm)
@@ -730,27 +702,6 @@ int msm_gem_dumb_create(struct drm_file *file, struct drm_device *dev,
                        MSM_BO_SCANOUT | MSM_BO_WC, &args->handle, "dumb");
 }
 
-int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
-               uint32_t handle, uint64_t *offset)
-{
-       struct drm_gem_object *obj;
-       int ret = 0;
-
-       /* GEM does all our handle to object mapping */
-       obj = drm_gem_object_lookup(file, handle);
-       if (obj == NULL) {
-               ret = -ENOENT;
-               goto fail;
-       }
-
-       *offset = msm_gem_mmap_offset(obj);
-
-       drm_gem_object_put(obj);
-
-fail:
-       return ret;
-}
-
 static void *get_vaddr(struct drm_gem_object *obj, unsigned madv)
 {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
index a4cf31853c5008e171c3ad72cde1004c60fe5212..92ada1d69250d505f50d1c57de3ce211e7039f9e 100644 (file)
@@ -262,7 +262,6 @@ struct msm_gem_object {
 void msm_gem_vma_get(struct drm_gem_object *obj);
 void msm_gem_vma_put(struct drm_gem_object *obj);
 
-uint64_t msm_gem_mmap_offset(struct drm_gem_object *obj);
 int msm_gem_prot(struct drm_gem_object *obj);
 int msm_gem_pin_vma_locked(struct drm_gem_object *obj, struct drm_gpuva *vma);
 void msm_gem_unpin_locked(struct drm_gem_object *obj);
@@ -285,8 +284,6 @@ struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj);
 void msm_gem_unpin_pages_locked(struct drm_gem_object *obj);
 int msm_gem_dumb_create(struct drm_file *file, struct drm_device *dev,
                struct drm_mode_create_dumb *args);
-int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
-               uint32_t handle, uint64_t *offset);
 void *msm_gem_get_vaddr_locked(struct drm_gem_object *obj);
 void *msm_gem_get_vaddr(struct drm_gem_object *obj);
 void *msm_gem_get_vaddr_active(struct drm_gem_object *obj);