Lines Matching refs:sa_manager

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