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>
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);
.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
.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,
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)
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);
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);
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);