aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_sman.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/drm_sman.c')
-rw-r--r--drivers/gpu/drm/drm_sman.c71
1 files changed, 0 insertions, 71 deletions
diff --git a/drivers/gpu/drm/drm_sman.c b/drivers/gpu/drm/drm_sman.c
index 9d03cdc1a914..af4728477a90 100644
--- a/drivers/gpu/drm/drm_sman.c
+++ b/drivers/gpu/drm/drm_sman.c
@@ -48,7 +48,6 @@ struct drm_owner_item {
48void drm_sman_takedown(struct drm_sman * sman) 48void drm_sman_takedown(struct drm_sman * sman)
49{ 49{
50 drm_ht_remove(&sman->user_hash_tab); 50 drm_ht_remove(&sman->user_hash_tab);
51 drm_ht_remove(&sman->owner_hash_tab);
52 kfree(sman->mm); 51 kfree(sman->mm);
53} 52}
54 53
@@ -66,16 +65,10 @@ drm_sman_init(struct drm_sman * sman, unsigned int num_managers,
66 goto out; 65 goto out;
67 } 66 }
68 sman->num_managers = num_managers; 67 sman->num_managers = num_managers;
69 INIT_LIST_HEAD(&sman->owner_items);
70 ret = drm_ht_create(&sman->owner_hash_tab, owner_order);
71 if (ret)
72 goto out1;
73 ret = drm_ht_create(&sman->user_hash_tab, user_order); 68 ret = drm_ht_create(&sman->user_hash_tab, user_order);
74 if (!ret) 69 if (!ret)
75 goto out; 70 goto out;
76 71
77 drm_ht_remove(&sman->owner_hash_tab);
78out1:
79 kfree(sman->mm); 72 kfree(sman->mm);
80out: 73out:
81 return ret; 74 return ret;
@@ -161,44 +154,12 @@ drm_sman_set_manager(struct drm_sman * sman, unsigned int manager,
161} 154}
162EXPORT_SYMBOL(drm_sman_set_manager); 155EXPORT_SYMBOL(drm_sman_set_manager);
163 156
164static struct drm_owner_item *drm_sman_get_owner_item(struct drm_sman * sman,
165 unsigned long owner)
166{
167 int ret;
168 struct drm_hash_item *owner_hash_item;
169 struct drm_owner_item *owner_item;
170
171 ret = drm_ht_find_item(&sman->owner_hash_tab, owner, &owner_hash_item);
172 if (!ret) {
173 return drm_hash_entry(owner_hash_item, struct drm_owner_item,
174 owner_hash);
175 }
176
177 owner_item = kzalloc(sizeof(*owner_item), GFP_KERNEL);
178 if (!owner_item)
179 goto out;
180
181 INIT_LIST_HEAD(&owner_item->mem_blocks);
182 owner_item->owner_hash.key = owner;
183 if (drm_ht_insert_item(&sman->owner_hash_tab, &owner_item->owner_hash))
184 goto out1;
185
186 list_add_tail(&owner_item->sman_list, &sman->owner_items);
187 return owner_item;
188
189out1:
190 kfree(owner_item);
191out:
192 return NULL;
193}
194
195struct drm_memblock_item *drm_sman_alloc(struct drm_sman *sman, unsigned int manager, 157struct drm_memblock_item *drm_sman_alloc(struct drm_sman *sman, unsigned int manager,
196 unsigned long size, unsigned alignment, 158 unsigned long size, unsigned alignment,
197 unsigned long owner) 159 unsigned long owner)
198{ 160{
199 void *tmp; 161 void *tmp;
200 struct drm_sman_mm *sman_mm; 162 struct drm_sman_mm *sman_mm;
201 struct drm_owner_item *owner_item;
202 struct drm_memblock_item *memblock; 163 struct drm_memblock_item *memblock;
203 164
204 BUG_ON(manager >= sman->num_managers); 165 BUG_ON(manager >= sman->num_managers);
@@ -224,16 +185,8 @@ struct drm_memblock_item *drm_sman_alloc(struct drm_sman *sman, unsigned int man
224 (unsigned long)memblock, 32, 0, 0)) 185 (unsigned long)memblock, 32, 0, 0))
225 goto out1; 186 goto out1;
226 187
227 owner_item = drm_sman_get_owner_item(sman, owner);
228 if (!owner_item)
229 goto out2;
230
231 list_add_tail(&memblock->owner_list, &owner_item->mem_blocks);
232
233 return memblock; 188 return memblock;
234 189
235out2:
236 drm_ht_remove_item(&sman->user_hash_tab, &memblock->user_hash);
237out1: 190out1:
238 kfree(memblock); 191 kfree(memblock);
239out: 192out:
@@ -271,35 +224,11 @@ int drm_sman_free_key(struct drm_sman *sman, unsigned int key)
271 224
272EXPORT_SYMBOL(drm_sman_free_key); 225EXPORT_SYMBOL(drm_sman_free_key);
273 226
274static void drm_sman_remove_owner(struct drm_sman *sman,
275 struct drm_owner_item *owner_item)
276{
277 list_del(&owner_item->sman_list);
278 drm_ht_remove_item(&sman->owner_hash_tab, &owner_item->owner_hash);
279 kfree(owner_item);
280}
281
282static void drm_sman_do_owner_cleanup(struct drm_sman *sman,
283 struct drm_owner_item *owner_item)
284{
285 struct drm_memblock_item *entry, *next;
286
287 list_for_each_entry_safe(entry, next, &owner_item->mem_blocks,
288 owner_list) {
289 drm_sman_free(entry);
290 }
291 drm_sman_remove_owner(sman, owner_item);
292}
293
294void drm_sman_cleanup(struct drm_sman *sman) 227void drm_sman_cleanup(struct drm_sman *sman)
295{ 228{
296 struct drm_owner_item *entry, *next;
297 unsigned int i; 229 unsigned int i;
298 struct drm_sman_mm *sman_mm; 230 struct drm_sman_mm *sman_mm;
299 231
300 list_for_each_entry_safe(entry, next, &sman->owner_items, sman_list) {
301 drm_sman_do_owner_cleanup(sman, entry);
302 }
303 if (sman->mm) { 232 if (sman->mm) {
304 for (i = 0; i < sman->num_managers; ++i) { 233 for (i = 0; i < sman->num_managers; ++i) {
305 sman_mm = &sman->mm[i]; 234 sman_mm = &sman->mm[i];