diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2011-10-26 16:28:07 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2011-12-21 18:33:20 -0500 |
commit | 763240deb423c477b4d46c23e0b582099d4b8753 (patch) | |
tree | 724f804e38eb00a23f6d1e3ca4b50ec89d1e9208 /drivers/gpu | |
parent | aa38e2e01521f88e9b0230c0236d2bd89d0af0ed (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.c | 71 | ||||
-rw-r--r-- | drivers/gpu/drm/sis/sis_mm.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/via/via_mm.c | 2 |
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 { | |||
48 | void drm_sman_takedown(struct drm_sman * sman) | 48 | void 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); | ||
78 | out1: | ||
79 | kfree(sman->mm); | 72 | kfree(sman->mm); |
80 | out: | 73 | out: |
81 | return ret; | 74 | return ret; |
@@ -161,44 +154,12 @@ drm_sman_set_manager(struct drm_sman * sman, unsigned int manager, | |||
161 | } | 154 | } |
162 | EXPORT_SYMBOL(drm_sman_set_manager); | 155 | EXPORT_SYMBOL(drm_sman_set_manager); |
163 | 156 | ||
164 | static 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 | |||
189 | out1: | ||
190 | kfree(owner_item); | ||
191 | out: | ||
192 | return NULL; | ||
193 | } | ||
194 | |||
195 | struct drm_memblock_item *drm_sman_alloc(struct drm_sman *sman, unsigned int manager, | 157 | struct 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 | ||
235 | out2: | ||
236 | drm_ht_remove_item(&sman->user_hash_tab, &memblock->user_hash); | ||
237 | out1: | 190 | out1: |
238 | kfree(memblock); | 191 | kfree(memblock); |
239 | out: | 192 | out: |
@@ -271,35 +224,11 @@ int drm_sman_free_key(struct drm_sman *sman, unsigned int key) | |||
271 | 224 | ||
272 | EXPORT_SYMBOL(drm_sman_free_key); | 225 | EXPORT_SYMBOL(drm_sman_free_key); |
273 | 226 | ||
274 | static 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 | |||
282 | static 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 | |||
294 | void drm_sman_cleanup(struct drm_sman *sman) | 227 | void 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-> |