Lines Matching +full:count +full:- +full:up

28 #include <linux/dma-buf.h>
32 #include <linux/iosys-map.h>
62 * synchronization and migration strategies, implementing that is left up to
63 * the driver, and all that the general API provides should be generic --
65 * Even there, platform-dependent optimizations for reading/writing data with
66 * the CPU mean we'll likely hook those out to driver-specific calls. However,
69 * The goal was to have swap-backed object allocation managed through
72 * - Process limits prevent more than 1024 or so being used at a time by
74 * - Inability to allocate high fds will aggravate the X Server's select()
81 * up at a later date, and as our interface with shmfs for memory allocation.
87 drm_vma_offset_manager_destroy(dev->vma_offset_manager); in drm_gem_init_release()
91 * drm_gem_init - Initialize the GEM device fields
99 mutex_init(&dev->object_name_lock); in drm_gem_init()
100 idr_init_base(&dev->object_name_idr, 1); in drm_gem_init()
106 return -ENOMEM; in drm_gem_init()
109 dev->vma_offset_manager = vma_offset_manager; in drm_gem_init()
118 * drm_gem_object_init_with_mnt - initialize an allocated shmem-backed GEM
147 obj->filp = filp; in drm_gem_object_init_with_mnt()
154 * drm_gem_object_init - initialize an allocated shmem-backed GEM object
170 * drm_gem_private_object_init - initialize an allocated private GEM object
182 BUG_ON((size & (PAGE_SIZE - 1)) != 0); in drm_gem_private_object_init()
184 obj->dev = dev; in drm_gem_private_object_init()
185 obj->filp = NULL; in drm_gem_private_object_init()
187 kref_init(&obj->refcount); in drm_gem_private_object_init()
188 obj->handle_count = 0; in drm_gem_private_object_init()
189 obj->size = size; in drm_gem_private_object_init()
190 mutex_init(&obj->gpuva.lock); in drm_gem_private_object_init()
191 dma_resv_init(&obj->_resv); in drm_gem_private_object_init()
192 if (!obj->resv) in drm_gem_private_object_init()
193 obj->resv = &obj->_resv; in drm_gem_private_object_init()
198 drm_vma_node_reset(&obj->vma_node); in drm_gem_private_object_init()
199 INIT_LIST_HEAD(&obj->lru_node); in drm_gem_private_object_init()
204 * drm_gem_private_object_fini - Finalize a failed drm_gem_object
211 WARN_ON(obj->dma_buf); in drm_gem_private_object_fini()
213 dma_resv_fini(&obj->_resv); in drm_gem_private_object_fini()
214 mutex_destroy(&obj->gpuva.lock); in drm_gem_private_object_fini()
220 struct drm_device *dev = obj->dev; in drm_gem_object_handle_get()
222 drm_WARN_ON(dev, !mutex_is_locked(&dev->object_name_lock)); in drm_gem_object_handle_get()
224 if (obj->handle_count++ == 0) in drm_gem_object_handle_get()
229 * drm_gem_object_handle_get_if_exists_unlocked - acquire reference on user-space handle, if any
241 struct drm_device *dev = obj->dev; in drm_gem_object_handle_get_if_exists_unlocked()
243 guard(mutex)(&dev->object_name_lock); in drm_gem_object_handle_get_if_exists_unlocked()
247 * drivers set up internal framebuffers with GEM objects that in drm_gem_object_handle_get_if_exists_unlocked()
250 if (!obj->handle_count) in drm_gem_object_handle_get_if_exists_unlocked()
259 * drm_gem_object_handle_free - release resources bound to userspace handles
260 * @obj: GEM object to clean up.
270 struct drm_device *dev = obj->dev; in drm_gem_object_handle_free()
273 if (obj->name) { in drm_gem_object_handle_free()
274 idr_remove(&dev->object_name_idr, obj->name); in drm_gem_object_handle_free()
275 obj->name = 0; in drm_gem_object_handle_free()
282 if (obj->dma_buf) { in drm_gem_object_exported_dma_buf_free()
283 dma_buf_put(obj->dma_buf); in drm_gem_object_exported_dma_buf_free()
284 obj->dma_buf = NULL; in drm_gem_object_exported_dma_buf_free()
289 * drm_gem_object_handle_put_unlocked - releases reference on user-space handle
293 * the GEM buffer object and associated dma-buf objects.
297 struct drm_device *dev = obj->dev; in drm_gem_object_handle_put_unlocked()
300 if (drm_WARN_ON(dev, READ_ONCE(obj->handle_count) == 0)) in drm_gem_object_handle_put_unlocked()
304 * Must bump handle count first as this may be the last in drm_gem_object_handle_put_unlocked()
309 mutex_lock(&dev->object_name_lock); in drm_gem_object_handle_put_unlocked()
310 if (--obj->handle_count == 0) { in drm_gem_object_handle_put_unlocked()
315 mutex_unlock(&dev->object_name_lock); in drm_gem_object_handle_put_unlocked()
331 if (drm_WARN_ON(obj->dev, !data)) in drm_gem_object_release_handle()
334 if (obj->funcs->close) in drm_gem_object_release_handle()
335 obj->funcs->close(obj, file_priv); in drm_gem_object_release_handle()
337 mutex_lock(&file_priv->prime.lock); in drm_gem_object_release_handle()
339 drm_prime_remove_buf_handle(&file_priv->prime, id); in drm_gem_object_release_handle()
341 mutex_unlock(&file_priv->prime.lock); in drm_gem_object_release_handle()
343 drm_vma_node_revoke(&obj->vma_node, file_priv); in drm_gem_object_release_handle()
351 * drm_gem_handle_delete - deletes the given file-private handle
352 * @filp: drm file-private structure to use for the handle look up
356 * drm_gem_handle_create(). If this is the last handle also cleans up linked
364 spin_lock(&filp->table_lock); in drm_gem_handle_delete()
367 obj = idr_replace(&filp->object_idr, NULL, handle); in drm_gem_handle_delete()
368 spin_unlock(&filp->table_lock); in drm_gem_handle_delete()
370 return -EINVAL; in drm_gem_handle_delete()
376 spin_lock(&filp->table_lock); in drm_gem_handle_delete()
377 idr_remove(&filp->object_idr, handle); in drm_gem_handle_delete()
378 spin_unlock(&filp->table_lock); in drm_gem_handle_delete()
385 * drm_gem_dumb_map_offset - return the fake mmap offset for a gem object
386 * @file: drm file-private structure containing the gem object
405 return -ENOENT; in drm_gem_dumb_map_offset()
409 ret = -EINVAL; in drm_gem_dumb_map_offset()
417 *offset = drm_vma_node_offset_addr(&obj->vma_node); in drm_gem_dumb_map_offset()
426 * drm_gem_handle_create_tail - internal functions to create a handle
427 * @file_priv: drm file-private structure to register the handle for
433 * when importing an object from either an flink name or a dma-buf.
444 struct drm_device *dev = obj->dev; in drm_gem_handle_create_tail()
448 WARN_ON(!mutex_is_locked(&dev->object_name_lock)); in drm_gem_handle_create_tail()
453 * Get the user-visible handle using idr. Preload and perform in drm_gem_handle_create_tail()
457 spin_lock(&file_priv->table_lock); in drm_gem_handle_create_tail()
459 ret = idr_alloc(&file_priv->object_idr, NULL, 1, 0, GFP_NOWAIT); in drm_gem_handle_create_tail()
461 spin_unlock(&file_priv->table_lock); in drm_gem_handle_create_tail()
464 mutex_unlock(&dev->object_name_lock); in drm_gem_handle_create_tail()
470 ret = drm_vma_node_allow(&obj->vma_node, file_priv); in drm_gem_handle_create_tail()
474 if (obj->funcs->open) { in drm_gem_handle_create_tail()
475 ret = obj->funcs->open(obj, file_priv); in drm_gem_handle_create_tail()
481 spin_lock(&file_priv->table_lock); in drm_gem_handle_create_tail()
482 obj = idr_replace(&file_priv->object_idr, obj, handle); in drm_gem_handle_create_tail()
484 spin_unlock(&file_priv->table_lock); in drm_gem_handle_create_tail()
489 drm_vma_node_revoke(&obj->vma_node, file_priv); in drm_gem_handle_create_tail()
491 spin_lock(&file_priv->table_lock); in drm_gem_handle_create_tail()
492 idr_remove(&file_priv->object_idr, handle); in drm_gem_handle_create_tail()
493 spin_unlock(&file_priv->table_lock); in drm_gem_handle_create_tail()
500 * drm_gem_handle_create - create a gem handle for an object
501 * @file_priv: drm file-private structure to register the handle for
506 * which includes a regular reference count. Callers will likely want to
509 * Since this publishes @obj to userspace it must be fully set up by this point,
516 mutex_lock(&obj->dev->object_name_lock); in drm_gem_handle_create()
524 * drm_gem_free_mmap_offset - release a fake mmap offset for an object
536 struct drm_device *dev = obj->dev; in drm_gem_free_mmap_offset()
538 drm_vma_offset_remove(dev->vma_offset_manager, &obj->vma_node); in drm_gem_free_mmap_offset()
543 * drm_gem_create_mmap_offset_size - create a fake mmap offset for an object
549 * up the object based on the offset and sets up the various memory mapping
562 struct drm_device *dev = obj->dev; in drm_gem_create_mmap_offset_size()
564 return drm_vma_offset_add(dev->vma_offset_manager, &obj->vma_node, in drm_gem_create_mmap_offset_size()
570 * drm_gem_create_mmap_offset - create a fake mmap offset for an object
575 * up the object based on the offset and sets up the various memory mapping
585 return drm_gem_create_mmap_offset_size(obj, obj->size); in drm_gem_create_mmap_offset()
591 * ref count of those folios.
601 * drm_gem_get_pages - helper to allocate backing pages for a GEM object
605 * This reads the page-array of the shmem-backing storage of the given gem
607 * swapped-out, this will allocate/swap-in the required pages. Note that the
608 * whole object is covered by the page-array and pinned in memory.
612 * This uses the GFP-mask set on the shmem-mapping (see mapping_set_gfp_mask()).
613 * If you require other GFP-masks, you have to do those allocations yourself.
615 * Note that you are not allowed to change gfp-zones during runtime. That is,
618 * after drm_gem_object_init() via mapping_set_gfp_mask(). shmem-core takes care
619 * to keep pages in the required zone during swap-in.
633 if (WARN_ON(!obj->filp)) in drm_gem_get_pages()
634 return ERR_PTR(-EINVAL); in drm_gem_get_pages()
637 mapping = obj->filp->f_mapping; in drm_gem_get_pages()
639 /* We already BUG_ON() for non-page-aligned sizes in in drm_gem_get_pages()
643 WARN_ON((obj->size & (PAGE_SIZE - 1)) != 0); in drm_gem_get_pages()
645 npages = obj->size >> PAGE_SHIFT; in drm_gem_get_pages()
649 return ERR_PTR(-ENOMEM); in drm_gem_get_pages()
660 nr = min(npages - i, folio_nr_pages(folio)); in drm_gem_get_pages()
666 * __GFP_DMA32 to be set in mapping_gfp_mask(inode->i_mapping) in drm_gem_get_pages()
694 * drm_gem_put_pages - helper to free backing pages for a GEM object
707 mapping = file_inode(obj->filp)->i_mapping; in drm_gem_put_pages()
710 /* We already BUG_ON() for non-page-aligned sizes in in drm_gem_put_pages()
714 WARN_ON((obj->size & (PAGE_SIZE - 1)) != 0); in drm_gem_put_pages()
716 npages = obj->size >> PAGE_SHIFT; in drm_gem_put_pages()
735 i += folio_nr_pages(folio) - 1; in drm_gem_put_pages()
744 static int objects_lookup(struct drm_file *filp, u32 *handle, int count, in objects_lookup() argument
750 spin_lock(&filp->table_lock); in objects_lookup()
752 for (i = 0; i < count; i++) { in objects_lookup()
754 obj = idr_find(&filp->object_idr, handle[i]); in objects_lookup()
756 ret = -ENOENT; in objects_lookup()
762 spin_unlock(&filp->table_lock); in objects_lookup()
768 * drm_gem_objects_lookup - look up GEM objects from an array of handles
771 * @count: size of handle array
781 * released with drm_gem_object_put(). -ENOENT is returned on a lookup
786 int count, struct drm_gem_object ***objs_out) in drm_gem_objects_lookup() argument
792 if (!count) in drm_gem_objects_lookup()
795 objs = kvmalloc_array(count, sizeof(struct drm_gem_object *), in drm_gem_objects_lookup()
798 return -ENOMEM; in drm_gem_objects_lookup()
802 handles = kvmalloc_array(count, sizeof(u32), GFP_KERNEL); in drm_gem_objects_lookup()
804 ret = -ENOMEM; in drm_gem_objects_lookup()
808 if (copy_from_user(handles, bo_handles, count * sizeof(u32))) { in drm_gem_objects_lookup()
809 ret = -EFAULT; in drm_gem_objects_lookup()
814 ret = objects_lookup(filp, handles, count, objs); in drm_gem_objects_lookup()
823 * drm_gem_object_lookup - look up a GEM object from its handle
827 * If looking up an array of handles, use drm_gem_objects_lookup().
844 * drm_gem_dma_resv_wait - Wait on GEM object's reservation's objects
852 * Returns -ERESTARTSYS if interrupted, 0 if the wait timed out, or
863 DRM_DEBUG("Failed to look up GEM BO %d\n", handle); in drm_gem_dma_resv_wait()
864 return -EINVAL; in drm_gem_dma_resv_wait()
867 ret = dma_resv_wait_timeout(obj->resv, dma_resv_usage_rw(wait_all), in drm_gem_dma_resv_wait()
870 ret = -ETIME; in drm_gem_dma_resv_wait()
888 return -EOPNOTSUPP; in drm_gem_close_ioctl()
890 ret = drm_gem_handle_delete(file_priv, args->handle); in drm_gem_close_ioctl()
904 return -EOPNOTSUPP; in drm_gem_flink_ioctl()
906 obj = drm_gem_object_lookup(file_priv, args->handle); in drm_gem_flink_ioctl()
908 return -ENOENT; in drm_gem_flink_ioctl()
910 mutex_lock(&dev->object_name_lock); in drm_gem_flink_ioctl()
912 if (obj->handle_count == 0) { in drm_gem_flink_ioctl()
913 ret = -ENOENT; in drm_gem_flink_ioctl()
917 if (!obj->name) { in drm_gem_flink_ioctl()
918 ret = idr_alloc(&dev->object_name_idr, obj, 1, 0, GFP_KERNEL); in drm_gem_flink_ioctl()
922 obj->name = ret; in drm_gem_flink_ioctl()
925 args->name = (uint64_t) obj->name; in drm_gem_flink_ioctl()
929 mutex_unlock(&dev->object_name_lock); in drm_gem_flink_ioctl()
944 return -EOPNOTSUPP; in drm_gem_open_ioctl()
946 mutex_lock(&dev->object_name_lock); in drm_gem_open_ioctl()
947 obj = idr_find(&dev->object_name_idr, (int) args->name); in drm_gem_open_ioctl()
951 mutex_unlock(&dev->object_name_lock); in drm_gem_open_ioctl()
952 return -ENOENT; in drm_gem_open_ioctl()
955 /* drm_gem_handle_create_tail unlocks dev->object_name_lock. */ in drm_gem_open_ioctl()
960 args->handle = handle; in drm_gem_open_ioctl()
961 args->size = obj->size; in drm_gem_open_ioctl()
976 return -EOPNOTSUPP; in drm_gem_change_handle_ioctl()
978 obj = drm_gem_object_lookup(file_priv, args->handle); in drm_gem_change_handle_ioctl()
980 return -ENOENT; in drm_gem_change_handle_ioctl()
982 if (args->handle == args->new_handle) in drm_gem_change_handle_ioctl()
985 mutex_lock(&file_priv->prime.lock); in drm_gem_change_handle_ioctl()
987 spin_lock(&file_priv->table_lock); in drm_gem_change_handle_ioctl()
988 ret = idr_alloc(&file_priv->object_idr, obj, in drm_gem_change_handle_ioctl()
989 args->new_handle, args->new_handle + 1, GFP_NOWAIT); in drm_gem_change_handle_ioctl()
990 spin_unlock(&file_priv->table_lock); in drm_gem_change_handle_ioctl()
995 if (obj->dma_buf) { in drm_gem_change_handle_ioctl()
996 ret = drm_prime_add_buf_handle(&file_priv->prime, obj->dma_buf, args->new_handle); in drm_gem_change_handle_ioctl()
998 spin_lock(&file_priv->table_lock); in drm_gem_change_handle_ioctl()
999 idr_remove(&file_priv->object_idr, args->new_handle); in drm_gem_change_handle_ioctl()
1000 spin_unlock(&file_priv->table_lock); in drm_gem_change_handle_ioctl()
1004 drm_prime_remove_buf_handle(&file_priv->prime, args->handle); in drm_gem_change_handle_ioctl()
1009 spin_lock(&file_priv->table_lock); in drm_gem_change_handle_ioctl()
1010 idr_remove(&file_priv->object_idr, args->handle); in drm_gem_change_handle_ioctl()
1011 spin_unlock(&file_priv->table_lock); in drm_gem_change_handle_ioctl()
1014 mutex_unlock(&file_priv->prime.lock); in drm_gem_change_handle_ioctl()
1020 * drm_gem_open - initializes GEM file-private structures at devnode open time
1022 * @file_private: drm file-private structure to set up
1024 * Called at device open time, sets up the structure for handling refcounting
1030 idr_init_base(&file_private->object_idr, 1); in drm_gem_open()
1031 spin_lock_init(&file_private->table_lock); in drm_gem_open()
1035 * drm_gem_release - release file-private GEM resources
1037 * @file_private: drm file-private structure to clean up
1046 idr_for_each(&file_private->object_idr, in drm_gem_release()
1048 idr_destroy(&file_private->object_idr); in drm_gem_release()
1052 * drm_gem_object_release - release GEM buffer object resources
1061 if (obj->filp) in drm_gem_object_release()
1062 fput(obj->filp); in drm_gem_object_release()
1072 * drm_gem_object_free - free a GEM object
1085 if (WARN_ON(!obj->funcs->free)) in drm_gem_object_free()
1088 obj->funcs->free(obj); in drm_gem_object_free()
1093 * drm_gem_vm_open - vma->ops->open implementation for GEM
1101 struct drm_gem_object *obj = vma->vm_private_data; in drm_gem_vm_open()
1108 * drm_gem_vm_close - vma->ops->close implementation for GEM
1116 struct drm_gem_object *obj = vma->vm_private_data; in drm_gem_vm_close()
1123 * drm_gem_mmap_obj - memory map a GEM object
1128 * Set up the VMA to prepare mapping of the GEM object using the GEM object's
1136 * the GEM object is not looked up based on its fake offset. To implement the
1143 * Return 0 or success or -EINVAL if the object size is smaller than the VMA
1152 if (obj_size < vma->vm_end - vma->vm_start) in drm_gem_mmap_obj()
1153 return -EINVAL; in drm_gem_mmap_obj()
1157 * This reference is cleaned up by the corresponding vm_close in drm_gem_mmap_obj()
1163 vma->vm_private_data = obj; in drm_gem_mmap_obj()
1164 vma->vm_ops = obj->funcs->vm_ops; in drm_gem_mmap_obj()
1166 if (obj->funcs->mmap) { in drm_gem_mmap_obj()
1167 ret = obj->funcs->mmap(obj, vma); in drm_gem_mmap_obj()
1170 WARN_ON(!(vma->vm_flags & VM_DONTEXPAND)); in drm_gem_mmap_obj()
1172 if (!vma->vm_ops) { in drm_gem_mmap_obj()
1173 ret = -EINVAL; in drm_gem_mmap_obj()
1178 vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags)); in drm_gem_mmap_obj()
1179 vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot); in drm_gem_mmap_obj()
1191 * drm_gem_mmap - memory map routine for GEM objects
1196 * descriptor will end up here.
1198 * Look up the GEM object based on the offset passed in (vma->vm_pgoff will
1207 struct drm_file *priv = filp->private_data; in drm_gem_mmap()
1208 struct drm_device *dev = priv->minor->dev; in drm_gem_mmap()
1214 return -ENODEV; in drm_gem_mmap()
1216 drm_vma_offset_lock_lookup(dev->vma_offset_manager); in drm_gem_mmap()
1217 node = drm_vma_offset_exact_lookup_locked(dev->vma_offset_manager, in drm_gem_mmap()
1218 vma->vm_pgoff, in drm_gem_mmap()
1223 * When the object is being freed, after it hits 0-refcnt it in drm_gem_mmap()
1226 * mgr->vm_lock. Therefore if we find an object with a 0-refcnt in drm_gem_mmap()
1228 * destroyed and will be freed as soon as we release the lock - in drm_gem_mmap()
1229 * so we have to check for the 0-refcnted object and treat it as in drm_gem_mmap()
1232 if (!kref_get_unless_zero(&obj->refcount)) in drm_gem_mmap()
1235 drm_vma_offset_unlock_lookup(dev->vma_offset_manager); in drm_gem_mmap()
1238 return -EINVAL; in drm_gem_mmap()
1242 return -EACCES; in drm_gem_mmap()
1257 drm_printf_indent(p, indent, "name=%d\n", obj->name); in drm_gem_print_info()
1259 kref_read(&obj->refcount)); in drm_gem_print_info()
1261 drm_vma_node_start(&obj->vma_node)); in drm_gem_print_info()
1262 drm_printf_indent(p, indent, "size=%zu\n", obj->size); in drm_gem_print_info()
1266 if (obj->funcs->print_info) in drm_gem_print_info()
1267 obj->funcs->print_info(p, indent, obj); in drm_gem_print_info()
1274 dma_resv_assert_held(obj->resv); in drm_gem_vmap_locked()
1276 if (!obj->funcs->vmap) in drm_gem_vmap_locked()
1277 return -EOPNOTSUPP; in drm_gem_vmap_locked()
1279 ret = obj->funcs->vmap(obj, map); in drm_gem_vmap_locked()
1283 return -ENOMEM; in drm_gem_vmap_locked()
1291 dma_resv_assert_held(obj->resv); in drm_gem_vunmap_locked()
1296 if (obj->funcs->vunmap) in drm_gem_vunmap_locked()
1297 obj->funcs->vunmap(obj, map); in drm_gem_vunmap_locked()
1306 dma_resv_lock(obj->resv, NULL); in drm_gem_lock()
1312 dma_resv_unlock(obj->resv); in drm_gem_unlock()
1320 dma_resv_lock(obj->resv, NULL); in drm_gem_vmap()
1322 dma_resv_unlock(obj->resv); in drm_gem_vmap()
1330 dma_resv_lock(obj->resv, NULL); in drm_gem_vunmap()
1332 dma_resv_unlock(obj->resv); in drm_gem_vunmap()
1337 * drm_gem_lock_reservations - Sets up the ww context and acquires
1340 * Once you've locked your reservations, you'll want to set up space
1345 * @count: Number of objects in @objs
1350 drm_gem_lock_reservations(struct drm_gem_object **objs, int count, in drm_gem_lock_reservations() argument
1353 int contended = -1; in drm_gem_lock_reservations()
1359 if (contended != -1) { in drm_gem_lock_reservations()
1362 ret = dma_resv_lock_slow_interruptible(obj->resv, in drm_gem_lock_reservations()
1370 for (i = 0; i < count; i++) { in drm_gem_lock_reservations()
1374 ret = dma_resv_lock_interruptible(objs[i]->resv, in drm_gem_lock_reservations()
1380 dma_resv_unlock(objs[j]->resv); in drm_gem_lock_reservations()
1382 if (contended != -1 && contended >= i) in drm_gem_lock_reservations()
1383 dma_resv_unlock(objs[contended]->resv); in drm_gem_lock_reservations()
1385 if (ret == -EDEADLK) { in drm_gem_lock_reservations()
1402 drm_gem_unlock_reservations(struct drm_gem_object **objs, int count, in drm_gem_unlock_reservations() argument
1407 for (i = 0; i < count; i++) in drm_gem_unlock_reservations()
1408 dma_resv_unlock(objs[i]->resv); in drm_gem_unlock_reservations()
1415 * drm_gem_lru_init - initialize a LRU
1423 lru->lock = lock; in drm_gem_lru_init()
1424 lru->count = 0; in drm_gem_lru_init()
1425 INIT_LIST_HEAD(&lru->list); in drm_gem_lru_init()
1432 obj->lru->count -= obj->size >> PAGE_SHIFT; in drm_gem_lru_remove_locked()
1433 WARN_ON(obj->lru->count < 0); in drm_gem_lru_remove_locked()
1434 list_del(&obj->lru_node); in drm_gem_lru_remove_locked()
1435 obj->lru = NULL; in drm_gem_lru_remove_locked()
1439 * drm_gem_lru_remove - remove object from whatever LRU it is in
1448 struct drm_gem_lru *lru = obj->lru; in drm_gem_lru_remove()
1453 mutex_lock(lru->lock); in drm_gem_lru_remove()
1455 mutex_unlock(lru->lock); in drm_gem_lru_remove()
1460 * drm_gem_lru_move_tail_locked - move the object to the tail of the LRU
1470 lockdep_assert_held_once(lru->lock); in drm_gem_lru_move_tail_locked()
1472 if (obj->lru) in drm_gem_lru_move_tail_locked()
1475 lru->count += obj->size >> PAGE_SHIFT; in drm_gem_lru_move_tail_locked()
1476 list_add_tail(&obj->lru_node, &lru->list); in drm_gem_lru_move_tail_locked()
1477 obj->lru = lru; in drm_gem_lru_move_tail_locked()
1482 * drm_gem_lru_move_tail - move the object to the tail of the LRU
1494 mutex_lock(lru->lock); in drm_gem_lru_move_tail()
1496 mutex_unlock(lru->lock); in drm_gem_lru_move_tail()
1501 * drm_gem_lru_scan - helper to implement shrinker.scan_objects
1527 drm_gem_lru_init(&still_in_lru, lru->lock); in drm_gem_lru_scan()
1529 mutex_lock(lru->lock); in drm_gem_lru_scan()
1532 obj = list_first_entry_or_null(&lru->list, typeof(*obj), lru_node); in drm_gem_lru_scan()
1540 * If it's in the process of being freed, gem_object->free() in drm_gem_lru_scan()
1544 if (!kref_get_unless_zero(&obj->refcount)) in drm_gem_lru_scan()
1552 mutex_unlock(lru->lock); in drm_gem_lru_scan()
1562 if (!ww_mutex_trylock(&obj->resv->lock, ticket)) { in drm_gem_lru_scan()
1563 *remaining += obj->size >> PAGE_SHIFT; in drm_gem_lru_scan()
1568 freed += obj->size >> PAGE_SHIFT; in drm_gem_lru_scan()
1575 WARN_ON(obj->lru == &still_in_lru); in drm_gem_lru_scan()
1576 WARN_ON(obj->lru == lru); in drm_gem_lru_scan()
1579 dma_resv_unlock(obj->resv); in drm_gem_lru_scan()
1586 mutex_lock(lru->lock); in drm_gem_lru_scan()
1594 obj->lru = lru; in drm_gem_lru_scan()
1595 list_splice_tail(&still_in_lru.list, &lru->list); in drm_gem_lru_scan()
1596 lru->count += still_in_lru.count; in drm_gem_lru_scan()
1598 mutex_unlock(lru->lock); in drm_gem_lru_scan()
1605 * drm_gem_evict_locked - helper to evict backing pages for a GEM object
1610 dma_resv_assert_held(obj->resv); in drm_gem_evict_locked()
1612 if (!dma_resv_test_signaled(obj->resv, DMA_RESV_USAGE_READ)) in drm_gem_evict_locked()
1613 return -EBUSY; in drm_gem_evict_locked()
1615 if (obj->funcs->evict) in drm_gem_evict_locked()
1616 return obj->funcs->evict(obj); in drm_gem_evict_locked()