aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2011-10-26 16:28:07 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2011-12-21 18:33:20 -0500
commit763240deb423c477b4d46c23e0b582099d4b8753 (patch)
tree724f804e38eb00a23f6d1e3ca4b50ec89d1e9208 /drivers/gpu
parentaa38e2e01521f88e9b0230c0236d2bd89d0af0ed (diff)
drm/sman: rip out owner tracking
In contrast to kms drivers, sis/via _always_ associated a buffer with a drm fd. So by the time we reach lastclose, all open drm fds are gone and with them their associated objects. So when sis/via call drm_sman_cleanup in their lastclose funcs, that will free 0 objects. The owner tracking now serves no purpose at all, hence rip it ou. We can't kill the corresponding fields in struct drm_memblock_item yet because we hijack these in the new driver private owner tracking. But now that drm_sman.c doesn't touch ->owner_list anymore, we need to kill the list_move hack and properly add the item to the file_priv list. Also leave the list_del(&obj->owner_list) in drm_sman_free for the moment, it will move to the drivers when sman disappears completely. v2: Remove the redundant INIT_LIST_HEAD as noted by Chris Wilson Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/drm_sman.c71
-rw-r--r--drivers/gpu/drm/sis/sis_mm.c2
-rw-r--r--drivers/gpu/drm/via/via_mm.c2
3 files changed, 2 insertions, 73 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];
diff --git a/drivers/gpu/drm/sis/sis_mm.c b/drivers/gpu/drm/sis/sis_mm.c
index a70b1bbff2e6..c76a118812a9 100644
--- a/drivers/gpu/drm/sis/sis_mm.c
+++ b/drivers/gpu/drm/sis/sis_mm.c
@@ -143,7 +143,7 @@ static int sis_drm_alloc(struct drm_device *dev, struct drm_file *file,
143 item = drm_sman_alloc(&dev_priv->sman, pool, mem->size, 0, 0); 143 item = drm_sman_alloc(&dev_priv->sman, pool, mem->size, 0, 0);
144 144
145 if (item) { 145 if (item) {
146 list_move(&item->owner_list, &file_priv->obj_list); 146 list_add(&item->owner_list, &file_priv->obj_list);
147 mem->offset = ((pool == 0) ? 147 mem->offset = ((pool == 0) ?
148 dev_priv->vram_offset : dev_priv->agp_offset) + 148 dev_priv->vram_offset : dev_priv->agp_offset) +
149 (item->mm-> 149 (item->mm->
diff --git a/drivers/gpu/drm/via/via_mm.c b/drivers/gpu/drm/via/via_mm.c
index 19bb77cdeb46..e0110bc27606 100644
--- a/drivers/gpu/drm/via/via_mm.c
+++ b/drivers/gpu/drm/via/via_mm.c
@@ -141,7 +141,7 @@ int via_mem_alloc(struct drm_device *dev, void *data,
141 item = drm_sman_alloc(&dev_priv->sman, mem->type, tmpSize, 0, 0); 141 item = drm_sman_alloc(&dev_priv->sman, mem->type, tmpSize, 0, 0);
142 142
143 if (item) { 143 if (item) {
144 list_move(&item->owner_list, &file_priv->obj_list); 144 list_add(&item->owner_list, &file_priv->obj_list);
145 mem->offset = ((mem->type == VIA_MEM_VIDEO) ? 145 mem->offset = ((mem->type == VIA_MEM_VIDEO) ?
146 dev_priv->vram_offset : dev_priv->agp_offset) + 146 dev_priv->vram_offset : dev_priv->agp_offset) +
147 (item->mm-> 147 (item->mm->