Lines Matching refs:sa_manager

53 static void drm_suballoc_try_free(struct drm_suballoc_manager *sa_manager);
63 void drm_suballoc_manager_init(struct drm_suballoc_manager *sa_manager, in drm_suballoc_manager_init() argument
77 init_waitqueue_head(&sa_manager->wq); in drm_suballoc_manager_init()
78 sa_manager->size = size; in drm_suballoc_manager_init()
79 sa_manager->align = align; in drm_suballoc_manager_init()
80 sa_manager->hole = &sa_manager->olist; in drm_suballoc_manager_init()
81 INIT_LIST_HEAD(&sa_manager->olist); in drm_suballoc_manager_init()
83 INIT_LIST_HEAD(&sa_manager->flist[i]); in drm_suballoc_manager_init()
95 void drm_suballoc_manager_fini(struct drm_suballoc_manager *sa_manager) in drm_suballoc_manager_fini() argument
99 if (!sa_manager->size) in drm_suballoc_manager_fini()
102 if (!list_empty(&sa_manager->olist)) { in drm_suballoc_manager_fini()
103 sa_manager->hole = &sa_manager->olist; in drm_suballoc_manager_fini()
104 drm_suballoc_try_free(sa_manager); in drm_suballoc_manager_fini()
105 if (!list_empty(&sa_manager->olist)) in drm_suballoc_manager_fini()
108 list_for_each_entry_safe(sa, tmp, &sa_manager->olist, olist) { in drm_suballoc_manager_fini()
112 sa_manager->size = 0; in drm_suballoc_manager_fini()
118 struct drm_suballoc_manager *sa_manager = sa->manager; in drm_suballoc_remove_locked() local
120 if (sa_manager->hole == &sa->olist) in drm_suballoc_remove_locked()
121 sa_manager->hole = sa->olist.prev; in drm_suballoc_remove_locked()
129 static void drm_suballoc_try_free(struct drm_suballoc_manager *sa_manager) in drm_suballoc_try_free() argument
133 if (sa_manager->hole->next == &sa_manager->olist) in drm_suballoc_try_free()
136 sa = list_entry(sa_manager->hole->next, struct drm_suballoc, olist); in drm_suballoc_try_free()
137 list_for_each_entry_safe_from(sa, tmp, &sa_manager->olist, olist) { in drm_suballoc_try_free()
145 static size_t drm_suballoc_hole_soffset(struct drm_suballoc_manager *sa_manager) in drm_suballoc_hole_soffset() argument
147 struct list_head *hole = sa_manager->hole; in drm_suballoc_hole_soffset()
149 if (hole != &sa_manager->olist) in drm_suballoc_hole_soffset()
155 static size_t drm_suballoc_hole_eoffset(struct drm_suballoc_manager *sa_manager) in drm_suballoc_hole_eoffset() argument
157 struct list_head *hole = sa_manager->hole; in drm_suballoc_hole_eoffset()
159 if (hole->next != &sa_manager->olist) in drm_suballoc_hole_eoffset()
161 return sa_manager->size; in drm_suballoc_hole_eoffset()
164 static bool drm_suballoc_try_alloc(struct drm_suballoc_manager *sa_manager, in drm_suballoc_try_alloc() argument
170 soffset = drm_suballoc_hole_soffset(sa_manager); in drm_suballoc_try_alloc()
171 eoffset = drm_suballoc_hole_eoffset(sa_manager); in drm_suballoc_try_alloc()
177 sa->manager = sa_manager; in drm_suballoc_try_alloc()
180 list_add(&sa->olist, sa_manager->hole); in drm_suballoc_try_alloc()
182 sa_manager->hole = &sa->olist; in drm_suballoc_try_alloc()
188 static bool __drm_suballoc_event(struct drm_suballoc_manager *sa_manager, in __drm_suballoc_event() argument
195 if (!list_empty(&sa_manager->flist[i])) in __drm_suballoc_event()
198 soffset = drm_suballoc_hole_soffset(sa_manager); in __drm_suballoc_event()
199 eoffset = drm_suballoc_hole_eoffset(sa_manager); in __drm_suballoc_event()
215 static bool drm_suballoc_event(struct drm_suballoc_manager *sa_manager, in drm_suballoc_event() argument
220 spin_lock(&sa_manager->wq.lock); in drm_suballoc_event()
221 ret = __drm_suballoc_event(sa_manager, size, align); in drm_suballoc_event()
222 spin_unlock(&sa_manager->wq.lock); in drm_suballoc_event()
226 static bool drm_suballoc_next_hole(struct drm_suballoc_manager *sa_manager, in drm_suballoc_next_hole() argument
235 if (sa_manager->hole->next == &sa_manager->olist) { in drm_suballoc_next_hole()
237 sa_manager->hole = &sa_manager->olist; in drm_suballoc_next_hole()
241 soffset = drm_suballoc_hole_soffset(sa_manager); in drm_suballoc_next_hole()
243 best = sa_manager->size * 2; in drm_suballoc_next_hole()
252 if (list_empty(&sa_manager->flist[i])) in drm_suballoc_next_hole()
255 sa = list_first_entry(&sa_manager->flist[i], in drm_suballoc_next_hole()
270 tmp += sa_manager->size; in drm_suballoc_next_hole()
283 sa_manager->hole = best_bo->olist.prev; in drm_suballoc_next_hole()
315 drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t size, in drm_suballoc_new() argument
324 if (WARN_ON_ONCE(align > sa_manager->align)) in drm_suballoc_new()
326 if (WARN_ON_ONCE(size > sa_manager->size || !size)) in drm_suballoc_new()
330 align = sa_manager->align; in drm_suballoc_new()
335 sa->manager = sa_manager; in drm_suballoc_new()
340 spin_lock(&sa_manager->wq.lock); in drm_suballoc_new()
346 drm_suballoc_try_free(sa_manager); in drm_suballoc_new()
348 if (drm_suballoc_try_alloc(sa_manager, sa, in drm_suballoc_new()
350 spin_unlock(&sa_manager->wq.lock); in drm_suballoc_new()
355 } while (drm_suballoc_next_hole(sa_manager, fences, tries)); in drm_suballoc_new()
364 spin_unlock(&sa_manager->wq.lock); in drm_suballoc_new()
372 spin_lock(&sa_manager->wq.lock); in drm_suballoc_new()
376 (sa_manager->wq, in drm_suballoc_new()
377 __drm_suballoc_event(sa_manager, size, align)); in drm_suballoc_new()
379 spin_unlock(&sa_manager->wq.lock); in drm_suballoc_new()
380 wait_event(sa_manager->wq, in drm_suballoc_new()
381 drm_suballoc_event(sa_manager, size, align)); in drm_suballoc_new()
383 spin_lock(&sa_manager->wq.lock); in drm_suballoc_new()
387 spin_unlock(&sa_manager->wq.lock); in drm_suballoc_new()
403 struct drm_suballoc_manager *sa_manager; in drm_suballoc_free() local
408 sa_manager = suballoc->manager; in drm_suballoc_free()
410 spin_lock(&sa_manager->wq.lock); in drm_suballoc_free()
416 list_add_tail(&suballoc->flist, &sa_manager->flist[idx]); in drm_suballoc_free()
420 wake_up_all_locked(&sa_manager->wq); in drm_suballoc_free()
421 spin_unlock(&sa_manager->wq.lock); in drm_suballoc_free()
426 void drm_suballoc_dump_debug_info(struct drm_suballoc_manager *sa_manager, in drm_suballoc_dump_debug_info() argument
432 spin_lock(&sa_manager->wq.lock); in drm_suballoc_dump_debug_info()
433 list_for_each_entry(i, &sa_manager->olist, olist) { in drm_suballoc_dump_debug_info()
437 if (&i->olist == sa_manager->hole) in drm_suballoc_dump_debug_info()
453 spin_unlock(&sa_manager->wq.lock); in drm_suballoc_dump_debug_info()