[PATCH 4/6] drm: gem: convert to new unified vma manager
Use the new vma manager instead of the old hashtable. Also convert all drivers to use the new convenience helpers. This drops all the (map_list.hash.key << PAGE_SHIFT) non-sense. Locking and access-management is exactly the same as before with an additional lock inside of the vma-manager, which strictly wouldn't be needed for gem. Signed-off-by: David Herrmann --- drivers/gpu/drm/drm_gem.c | 89 +- drivers/gpu/drm/drm_gem_cma_helper.c | 9 +-- drivers/gpu/drm/exynos/exynos_drm_gem.c| 7 ++- drivers/gpu/drm/gma500/gem.c | 8 +-- drivers/gpu/drm/i915/i915_gem.c| 9 +-- drivers/gpu/drm/omapdrm/omap_gem.c | 11 ++-- drivers/gpu/drm/omapdrm/omap_gem_helpers.c | 49 +--- drivers/gpu/drm/udl/udl_gem.c | 6 +- include/drm/drmP.h | 7 +-- include/drm/drm_vma_manager.h | 1 - include/uapi/drm/drm.h | 2 +- 11 files changed, 47 insertions(+), 151 deletions(-) diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index 88f0322..e1d0f67 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -37,6 +37,7 @@ #include #include #include +#include /** @file drm_gem.c * @@ -102,14 +103,9 @@ drm_gem_init(struct drm_device *dev) } dev->mm_private = mm; - - if (drm_ht_create(>offset_hash, 12)) { - kfree(mm); - return -ENOMEM; - } - - drm_mm_init(>offset_manager, DRM_FILE_PAGE_OFFSET_START, - DRM_FILE_PAGE_OFFSET_SIZE); + drm_vma_offset_manager_init(>vma_manager, + DRM_FILE_PAGE_OFFSET_START, + DRM_FILE_PAGE_OFFSET_SIZE); return 0; } @@ -119,8 +115,7 @@ drm_gem_destroy(struct drm_device *dev) { struct drm_gem_mm *mm = dev->mm_private; - drm_mm_takedown(>offset_manager); - drm_ht_remove(>offset_hash); + drm_vma_offset_manager_destroy(>vma_manager); kfree(mm); dev->mm_private = NULL; } @@ -306,12 +301,8 @@ drm_gem_free_mmap_offset(struct drm_gem_object *obj) { struct drm_device *dev = obj->dev; struct drm_gem_mm *mm = dev->mm_private; - struct drm_map_list *list = >map_list; - drm_ht_remove_item(>offset_hash, >hash); - drm_mm_put_block(list->file_offset_node); - kfree(list->map); - list->map = NULL; + drm_vma_offset_remove(>vma_manager, >vma_node); } EXPORT_SYMBOL(drm_gem_free_mmap_offset); @@ -331,54 +322,9 @@ drm_gem_create_mmap_offset(struct drm_gem_object *obj) { struct drm_device *dev = obj->dev; struct drm_gem_mm *mm = dev->mm_private; - struct drm_map_list *list; - struct drm_local_map *map; - int ret; - - /* Set the object up for mmap'ing */ - list = >map_list; - list->map = kzalloc(sizeof(struct drm_map_list), GFP_KERNEL); - if (!list->map) - return -ENOMEM; - - map = list->map; - map->type = _DRM_GEM; - map->size = obj->size; - map->handle = obj; - - /* Get a DRM GEM mmap offset allocated... */ - list->file_offset_node = drm_mm_search_free(>offset_manager, - obj->size / PAGE_SIZE, 0, false); - - if (!list->file_offset_node) { - DRM_ERROR("failed to allocate offset for bo %d\n", obj->name); - ret = -ENOSPC; - goto out_free_list; - } - list->file_offset_node = drm_mm_get_block(list->file_offset_node, - obj->size / PAGE_SIZE, 0); - if (!list->file_offset_node) { - ret = -ENOMEM; - goto out_free_list; - } - - list->hash.key = list->file_offset_node->start; - ret = drm_ht_insert_item(>offset_hash, >hash); - if (ret) { - DRM_ERROR("failed to add to map hash\n"); - goto out_free_mm; - } - - return 0; - -out_free_mm: - drm_mm_put_block(list->file_offset_node); -out_free_list: - kfree(list->map); - list->map = NULL; - - return ret; + return drm_vma_offset_add(>vma_manager, >vma_node, + obj->size / PAGE_SIZE); } EXPORT_SYMBOL(drm_gem_create_mmap_offset); @@ -660,9 +606,8 @@ int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma) struct drm_file *priv = filp->private_data; struct drm_device *dev = priv->minor->dev; struct drm_gem_mm *mm = dev->mm_private; - struct drm_local_map *map = NULL; struct drm_gem_object *obj; - struct drm_hash_item *hash; + struct drm_vma_offset_node *node; int ret = 0; if (drm_device_is_unplugged(dev)) @@ -670,25 +615,19 @@ int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma) mutex_lock(>struct_mutex); - if (drm_ht_find_item(>offset_hash,
[PATCH 4/6] drm: gem: convert to new unified vma manager
Use the new vma manager instead of the old hashtable. Also convert all drivers to use the new convenience helpers. This drops all the (map_list.hash.key PAGE_SHIFT) non-sense. Locking and access-management is exactly the same as before with an additional lock inside of the vma-manager, which strictly wouldn't be needed for gem. Signed-off-by: David Herrmann dh.herrm...@gmail.com --- drivers/gpu/drm/drm_gem.c | 89 +- drivers/gpu/drm/drm_gem_cma_helper.c | 9 +-- drivers/gpu/drm/exynos/exynos_drm_gem.c| 7 ++- drivers/gpu/drm/gma500/gem.c | 8 +-- drivers/gpu/drm/i915/i915_gem.c| 9 +-- drivers/gpu/drm/omapdrm/omap_gem.c | 11 ++-- drivers/gpu/drm/omapdrm/omap_gem_helpers.c | 49 +--- drivers/gpu/drm/udl/udl_gem.c | 6 +- include/drm/drmP.h | 7 +-- include/drm/drm_vma_manager.h | 1 - include/uapi/drm/drm.h | 2 +- 11 files changed, 47 insertions(+), 151 deletions(-) diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index 88f0322..e1d0f67 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -37,6 +37,7 @@ #include linux/shmem_fs.h #include linux/dma-buf.h #include drm/drmP.h +#include drm/drm_vma_manager.h /** @file drm_gem.c * @@ -102,14 +103,9 @@ drm_gem_init(struct drm_device *dev) } dev-mm_private = mm; - - if (drm_ht_create(mm-offset_hash, 12)) { - kfree(mm); - return -ENOMEM; - } - - drm_mm_init(mm-offset_manager, DRM_FILE_PAGE_OFFSET_START, - DRM_FILE_PAGE_OFFSET_SIZE); + drm_vma_offset_manager_init(mm-vma_manager, + DRM_FILE_PAGE_OFFSET_START, + DRM_FILE_PAGE_OFFSET_SIZE); return 0; } @@ -119,8 +115,7 @@ drm_gem_destroy(struct drm_device *dev) { struct drm_gem_mm *mm = dev-mm_private; - drm_mm_takedown(mm-offset_manager); - drm_ht_remove(mm-offset_hash); + drm_vma_offset_manager_destroy(mm-vma_manager); kfree(mm); dev-mm_private = NULL; } @@ -306,12 +301,8 @@ drm_gem_free_mmap_offset(struct drm_gem_object *obj) { struct drm_device *dev = obj-dev; struct drm_gem_mm *mm = dev-mm_private; - struct drm_map_list *list = obj-map_list; - drm_ht_remove_item(mm-offset_hash, list-hash); - drm_mm_put_block(list-file_offset_node); - kfree(list-map); - list-map = NULL; + drm_vma_offset_remove(mm-vma_manager, obj-vma_node); } EXPORT_SYMBOL(drm_gem_free_mmap_offset); @@ -331,54 +322,9 @@ drm_gem_create_mmap_offset(struct drm_gem_object *obj) { struct drm_device *dev = obj-dev; struct drm_gem_mm *mm = dev-mm_private; - struct drm_map_list *list; - struct drm_local_map *map; - int ret; - - /* Set the object up for mmap'ing */ - list = obj-map_list; - list-map = kzalloc(sizeof(struct drm_map_list), GFP_KERNEL); - if (!list-map) - return -ENOMEM; - - map = list-map; - map-type = _DRM_GEM; - map-size = obj-size; - map-handle = obj; - - /* Get a DRM GEM mmap offset allocated... */ - list-file_offset_node = drm_mm_search_free(mm-offset_manager, - obj-size / PAGE_SIZE, 0, false); - - if (!list-file_offset_node) { - DRM_ERROR(failed to allocate offset for bo %d\n, obj-name); - ret = -ENOSPC; - goto out_free_list; - } - list-file_offset_node = drm_mm_get_block(list-file_offset_node, - obj-size / PAGE_SIZE, 0); - if (!list-file_offset_node) { - ret = -ENOMEM; - goto out_free_list; - } - - list-hash.key = list-file_offset_node-start; - ret = drm_ht_insert_item(mm-offset_hash, list-hash); - if (ret) { - DRM_ERROR(failed to add to map hash\n); - goto out_free_mm; - } - - return 0; - -out_free_mm: - drm_mm_put_block(list-file_offset_node); -out_free_list: - kfree(list-map); - list-map = NULL; - - return ret; + return drm_vma_offset_add(mm-vma_manager, obj-vma_node, + obj-size / PAGE_SIZE); } EXPORT_SYMBOL(drm_gem_create_mmap_offset); @@ -660,9 +606,8 @@ int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma) struct drm_file *priv = filp-private_data; struct drm_device *dev = priv-minor-dev; struct drm_gem_mm *mm = dev-mm_private; - struct drm_local_map *map = NULL; struct drm_gem_object *obj; - struct drm_hash_item *hash; + struct drm_vma_offset_node *node; int ret = 0; if (drm_device_is_unplugged(dev)) @@ -670,25 +615,19 @@ int drm_gem_mmap(struct file *filp, struct vm_area_struct