Lines Matching +full:container +full:- +full:rules

1 // SPDX-License-Identifier: MIT
3 * Copyright (C) 2012-2014 Canonical Ltd (Maarten Lankhorst)
8 * Copyright (c) 2006-2009 VMware, Inc., Palo Alto, CA., USA
25 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
33 * Authors: Thomas Hellstrom <thellstrom-at-vmware-dot-com>
36 #include <linux/dma-resv.h>
37 #include <linux/dma-fence-array.h>
47 * The reservation object provides a mechanism to manage a container of
52 * locked write-side updates.
76 tmp = (long)rcu_dereference_check(list->table[index], in dma_resv_list_entry()
91 RCU_INIT_POINTER(list->table[index], (struct dma_fence *)tmp); in dma_resv_list_set()
111 list->max_fences = (size - offsetof(typeof(*list), table)) / in dma_resv_list_alloc()
112 sizeof(*list->table); in dma_resv_list_alloc()
125 for (i = 0; i < list->num_fences; ++i) { in dma_resv_list_free()
135 * dma_resv_init - initialize a reservation object
140 ww_mutex_init(&obj->lock, &reservation_ww_class); in dma_resv_init()
142 RCU_INIT_POINTER(obj->fences, NULL); in dma_resv_init()
147 * dma_resv_fini - destroys a reservation object
156 dma_resv_list_free(rcu_dereference_protected(obj->fences, true)); in dma_resv_fini()
157 ww_mutex_destroy(&obj->lock); in dma_resv_fini()
161 /* Dereference the fences while ensuring RCU rules */
164 return rcu_dereference_check(obj->fences, dma_resv_held(obj)); in dma_resv_fences_list()
168 * dma_resv_reserve_fences - Reserve space to add fences to a dma_resv object.
175 * Note that the preallocated slots need to be re-reserved if @obj is unlocked
180 * Zero for success, or -errno
190 if (old && old->max_fences) { in dma_resv_reserve_fences()
191 if ((old->num_fences + num_fences) <= old->max_fences) in dma_resv_reserve_fences()
193 max = max(old->num_fences + num_fences, old->max_fences * 2); in dma_resv_reserve_fences()
200 return -ENOMEM; in dma_resv_reserve_fences()
208 for (i = 0, j = 0, k = max; i < (old ? old->num_fences : 0); ++i) { in dma_resv_reserve_fences()
214 RCU_INIT_POINTER(new->table[--k], fence); in dma_resv_reserve_fences()
218 new->num_fences = j; in dma_resv_reserve_fences()
228 rcu_assign_pointer(obj->fences, new); in dma_resv_reserve_fences()
237 fence = rcu_dereference_protected(new->table[i], in dma_resv_reserve_fences()
249 * dma_resv_reset_max_fences - reset fences for debugging
252 * Reset the number of pre-reserved fence slots to test that drivers do
264 fences->max_fences = fences->num_fences; in dma_resv_reset_max_fences()
270 * dma_resv_add_fence - Add a fence to the dma_resv obj
297 count = fobj->num_fences; in dma_resv_add_fence()
303 if ((old->context == fence->context && old_usage >= usage && in dma_resv_add_fence()
312 BUG_ON(fobj->num_fences >= fobj->max_fences); in dma_resv_add_fence()
317 smp_store_mb(fobj->num_fences, count); in dma_resv_add_fence()
322 * dma_resv_replace_fences - replace fences in the dma_resv obj
345 for (i = 0; list && i < list->num_fences; ++i) { in dma_resv_replace_fences()
349 if (old->context != context) in dma_resv_replace_fences()
361 cursor->index = 0; in dma_resv_iter_restart_unlocked()
362 cursor->num_fences = 0; in dma_resv_iter_restart_unlocked()
363 cursor->fences = dma_resv_fences_list(cursor->obj); in dma_resv_iter_restart_unlocked()
364 if (cursor->fences) in dma_resv_iter_restart_unlocked()
365 cursor->num_fences = cursor->fences->num_fences; in dma_resv_iter_restart_unlocked()
366 cursor->is_restarted = true; in dma_resv_iter_restart_unlocked()
372 if (!cursor->fences) in dma_resv_iter_walk_unlocked()
377 dma_fence_put(cursor->fence); in dma_resv_iter_walk_unlocked()
379 if (cursor->index >= cursor->num_fences) { in dma_resv_iter_walk_unlocked()
380 cursor->fence = NULL; in dma_resv_iter_walk_unlocked()
385 dma_resv_list_entry(cursor->fences, cursor->index++, in dma_resv_iter_walk_unlocked()
386 cursor->obj, &cursor->fence, in dma_resv_iter_walk_unlocked()
387 &cursor->fence_usage); in dma_resv_iter_walk_unlocked()
388 cursor->fence = dma_fence_get_rcu(cursor->fence); in dma_resv_iter_walk_unlocked()
389 if (!cursor->fence) { in dma_resv_iter_walk_unlocked()
394 if (!dma_fence_is_signaled(cursor->fence) && in dma_resv_iter_walk_unlocked()
395 cursor->usage >= cursor->fence_usage) in dma_resv_iter_walk_unlocked()
401 * dma_resv_iter_first_unlocked - first fence in an unlocked dma_resv obj.
418 } while (dma_resv_fences_list(cursor->obj) != cursor->fences); in dma_resv_iter_first_unlocked()
421 return cursor->fence; in dma_resv_iter_first_unlocked()
426 * dma_resv_iter_next_unlocked - next fence in an unlocked dma_resv obj.
440 cursor->is_restarted = false; in dma_resv_iter_next_unlocked()
441 restart = dma_resv_fences_list(cursor->obj) != cursor->fences; in dma_resv_iter_next_unlocked()
447 } while (dma_resv_fences_list(cursor->obj) != cursor->fences); in dma_resv_iter_next_unlocked()
450 return cursor->fence; in dma_resv_iter_next_unlocked()
455 * dma_resv_iter_first - first fence from a locked dma_resv object
467 dma_resv_assert_held(cursor->obj); in dma_resv_iter_first()
469 cursor->index = 0; in dma_resv_iter_first()
470 cursor->fences = dma_resv_fences_list(cursor->obj); in dma_resv_iter_first()
473 cursor->is_restarted = true; in dma_resv_iter_first()
479 * dma_resv_iter_next - next fence from a locked dma_resv object
489 dma_resv_assert_held(cursor->obj); in dma_resv_iter_next()
491 cursor->is_restarted = false; in dma_resv_iter_next()
494 if (!cursor->fences || in dma_resv_iter_next()
495 cursor->index >= cursor->fences->num_fences) in dma_resv_iter_next()
498 dma_resv_list_entry(cursor->fences, cursor->index++, in dma_resv_iter_next()
499 cursor->obj, &fence, &cursor->fence_usage); in dma_resv_iter_next()
500 } while (cursor->fence_usage > cursor->usage); in dma_resv_iter_next()
507 * dma_resv_copy_fences - Copy all fences from src to dst.
511 * Copy all fences from src to dst. dst-lock must be held.
532 return -ENOMEM; in dma_resv_copy_fences()
534 list->num_fences = 0; in dma_resv_copy_fences()
538 dma_resv_list_set(list, list->num_fences++, f, in dma_resv_copy_fences()
543 list = rcu_replace_pointer(dst->fences, list, dma_resv_held(dst)); in dma_resv_copy_fences()
550 * dma_resv_get_fences - Get an object's fences
559 * Returns either zero or -ENOMEM.
578 dma_fence_put((*fences)[--(*num_fences)]); in dma_resv_get_fences()
582 /* Eventually re-allocate the array */ in dma_resv_get_fences()
591 return -ENOMEM; in dma_resv_get_fences()
605 * dma_resv_get_singleton - Get a single fence for all the fences
611 * Returns either 0 for success or -ENOMEM.
646 while (count--) in dma_resv_get_singleton()
649 return -ENOMEM; in dma_resv_get_singleton()
652 *fence = &array->base; in dma_resv_get_singleton()
658 * dma_resv_wait_timeout - Wait on reservation's objects fences
667 * Returns -ERESTARTSYS if interrupted, 0 if the wait timed out, or
693 * dma_resv_set_deadline - Set a deadline on reservation's objects fences
716 * dma_resv_test_signaled - Test if a reservation object's fences have been
744 * dma_resv_describe - Dump description of the resv object into seq_file
775 return -ENOMEM; in dma_resv_lockdep()
783 if (ret == -EDEADLK) in dma_resv_lockdep()