Lines Matching refs:sa_manager

51 static void drm_suballoc_try_free(struct drm_suballoc_manager *sa_manager);
61 void drm_suballoc_manager_init(struct drm_suballoc_manager *sa_manager, in drm_suballoc_manager_init() argument
75 init_waitqueue_head(&sa_manager->wq); in drm_suballoc_manager_init()
76 sa_manager->size = size; in drm_suballoc_manager_init()
77 sa_manager->align = align; in drm_suballoc_manager_init()
78 sa_manager->hole = &sa_manager->olist; in drm_suballoc_manager_init()
79 INIT_LIST_HEAD(&sa_manager->olist); in drm_suballoc_manager_init()
81 INIT_LIST_HEAD(&sa_manager->flist[i]); in drm_suballoc_manager_init()
93 void drm_suballoc_manager_fini(struct drm_suballoc_manager *sa_manager) in drm_suballoc_manager_fini() argument
97 if (!sa_manager->size) in drm_suballoc_manager_fini()
100 if (!list_empty(&sa_manager->olist)) { in drm_suballoc_manager_fini()
101 sa_manager->hole = &sa_manager->olist; in drm_suballoc_manager_fini()
102 drm_suballoc_try_free(sa_manager); in drm_suballoc_manager_fini()
103 if (!list_empty(&sa_manager->olist)) in drm_suballoc_manager_fini()
106 list_for_each_entry_safe(sa, tmp, &sa_manager->olist, olist) { in drm_suballoc_manager_fini()
110 sa_manager->size = 0; in drm_suballoc_manager_fini()
116 struct drm_suballoc_manager *sa_manager = sa->manager; in drm_suballoc_remove_locked() local
118 if (sa_manager->hole == &sa->olist) in drm_suballoc_remove_locked()
119 sa_manager->hole = sa->olist.prev; in drm_suballoc_remove_locked()
127 static void drm_suballoc_try_free(struct drm_suballoc_manager *sa_manager) in drm_suballoc_try_free() argument
131 if (sa_manager->hole->next == &sa_manager->olist) in drm_suballoc_try_free()
134 sa = list_entry(sa_manager->hole->next, struct drm_suballoc, olist); in drm_suballoc_try_free()
135 list_for_each_entry_safe_from(sa, tmp, &sa_manager->olist, olist) { in drm_suballoc_try_free()
143 static size_t drm_suballoc_hole_soffset(struct drm_suballoc_manager *sa_manager) in drm_suballoc_hole_soffset() argument
145 struct list_head *hole = sa_manager->hole; in drm_suballoc_hole_soffset()
147 if (hole != &sa_manager->olist) in drm_suballoc_hole_soffset()
153 static size_t drm_suballoc_hole_eoffset(struct drm_suballoc_manager *sa_manager) in drm_suballoc_hole_eoffset() argument
155 struct list_head *hole = sa_manager->hole; in drm_suballoc_hole_eoffset()
157 if (hole->next != &sa_manager->olist) in drm_suballoc_hole_eoffset()
159 return sa_manager->size; in drm_suballoc_hole_eoffset()
162 static bool drm_suballoc_try_alloc(struct drm_suballoc_manager *sa_manager, in drm_suballoc_try_alloc() argument
168 soffset = drm_suballoc_hole_soffset(sa_manager); in drm_suballoc_try_alloc()
169 eoffset = drm_suballoc_hole_eoffset(sa_manager); in drm_suballoc_try_alloc()
175 sa->manager = sa_manager; in drm_suballoc_try_alloc()
178 list_add(&sa->olist, sa_manager->hole); in drm_suballoc_try_alloc()
180 sa_manager->hole = &sa->olist; in drm_suballoc_try_alloc()
186 static bool __drm_suballoc_event(struct drm_suballoc_manager *sa_manager, in __drm_suballoc_event() argument
193 if (!list_empty(&sa_manager->flist[i])) in __drm_suballoc_event()
196 soffset = drm_suballoc_hole_soffset(sa_manager); in __drm_suballoc_event()
197 eoffset = drm_suballoc_hole_eoffset(sa_manager); in __drm_suballoc_event()
213 static bool drm_suballoc_event(struct drm_suballoc_manager *sa_manager, in drm_suballoc_event() argument
218 spin_lock(&sa_manager->wq.lock); in drm_suballoc_event()
219 ret = __drm_suballoc_event(sa_manager, size, align); in drm_suballoc_event()
220 spin_unlock(&sa_manager->wq.lock); in drm_suballoc_event()
224 static bool drm_suballoc_next_hole(struct drm_suballoc_manager *sa_manager, in drm_suballoc_next_hole() argument
233 if (sa_manager->hole->next == &sa_manager->olist) { in drm_suballoc_next_hole()
235 sa_manager->hole = &sa_manager->olist; in drm_suballoc_next_hole()
239 soffset = drm_suballoc_hole_soffset(sa_manager); in drm_suballoc_next_hole()
241 best = sa_manager->size * 2; in drm_suballoc_next_hole()
250 if (list_empty(&sa_manager->flist[i])) in drm_suballoc_next_hole()
253 sa = list_first_entry(&sa_manager->flist[i], in drm_suballoc_next_hole()
268 tmp += sa_manager->size; in drm_suballoc_next_hole()
281 sa_manager->hole = best_bo->olist.prev; in drm_suballoc_next_hole()
313 drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t size, in drm_suballoc_new() argument
322 if (WARN_ON_ONCE(align > sa_manager->align)) in drm_suballoc_new()
324 if (WARN_ON_ONCE(size > sa_manager->size || !size)) in drm_suballoc_new()
328 align = sa_manager->align; in drm_suballoc_new()
333 sa->manager = sa_manager; in drm_suballoc_new()
338 spin_lock(&sa_manager->wq.lock); in drm_suballoc_new()
344 drm_suballoc_try_free(sa_manager); in drm_suballoc_new()
346 if (drm_suballoc_try_alloc(sa_manager, sa, in drm_suballoc_new()
348 spin_unlock(&sa_manager->wq.lock); in drm_suballoc_new()
353 } while (drm_suballoc_next_hole(sa_manager, fences, tries)); in drm_suballoc_new()
362 spin_unlock(&sa_manager->wq.lock); in drm_suballoc_new()
370 spin_lock(&sa_manager->wq.lock); in drm_suballoc_new()
374 (sa_manager->wq, in drm_suballoc_new()
375 __drm_suballoc_event(sa_manager, size, align)); in drm_suballoc_new()
377 spin_unlock(&sa_manager->wq.lock); in drm_suballoc_new()
378 wait_event(sa_manager->wq, in drm_suballoc_new()
379 drm_suballoc_event(sa_manager, size, align)); in drm_suballoc_new()
381 spin_lock(&sa_manager->wq.lock); in drm_suballoc_new()
385 spin_unlock(&sa_manager->wq.lock); in drm_suballoc_new()
401 struct drm_suballoc_manager *sa_manager; in drm_suballoc_free() local
406 sa_manager = suballoc->manager; in drm_suballoc_free()
408 spin_lock(&sa_manager->wq.lock); in drm_suballoc_free()
414 list_add_tail(&suballoc->flist, &sa_manager->flist[idx]); in drm_suballoc_free()
418 wake_up_all_locked(&sa_manager->wq); in drm_suballoc_free()
419 spin_unlock(&sa_manager->wq.lock); in drm_suballoc_free()
424 void drm_suballoc_dump_debug_info(struct drm_suballoc_manager *sa_manager, in drm_suballoc_dump_debug_info() argument
430 spin_lock(&sa_manager->wq.lock); in drm_suballoc_dump_debug_info()
431 list_for_each_entry(i, &sa_manager->olist, olist) { in drm_suballoc_dump_debug_info()
435 if (&i->olist == sa_manager->hole) in drm_suballoc_dump_debug_info()
451 spin_unlock(&sa_manager->wq.lock); in drm_suballoc_dump_debug_info()