> 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. > > Signed-off-by: Daniel Vetter <daniel.vetter@xxxxxxxx> Acked-by: James Simmons <jsimmons@xxxxxxxxxxxxx> > --- > drivers/gpu/drm/drm_sman.c | 71 ------------------------------------------ > drivers/gpu/drm/sis/sis_mm.c | 3 +- > drivers/gpu/drm/via/via_mm.c | 3 +- > include/drm/drm_sman.h | 2 - > 4 files changed, 4 insertions(+), 75 deletions(-) > > diff --git a/drivers/gpu/drm/drm_sman.c b/drivers/gpu/drm/drm_sman.c > index a672fea..37a8844 100644 > --- a/drivers/gpu/drm/drm_sman.c > +++ b/drivers/gpu/drm/drm_sman.c > @@ -47,7 +47,6 @@ struct drm_owner_item { > void drm_sman_takedown(struct drm_sman * sman) > { > drm_ht_remove(&sman->user_hash_tab); > - drm_ht_remove(&sman->owner_hash_tab); > kfree(sman->mm); > } > > @@ -65,16 +64,10 @@ drm_sman_init(struct drm_sman * sman, unsigned int num_managers, > goto out; > } > sman->num_managers = num_managers; > - INIT_LIST_HEAD(&sman->owner_items); > - ret = drm_ht_create(&sman->owner_hash_tab, owner_order); > - if (ret) > - goto out1; > ret = drm_ht_create(&sman->user_hash_tab, user_order); > if (!ret) > goto out; > > - drm_ht_remove(&sman->owner_hash_tab); > -out1: > kfree(sman->mm); > out: > return ret; > @@ -160,44 +153,12 @@ drm_sman_set_manager(struct drm_sman * sman, unsigned int manager, > } > EXPORT_SYMBOL(drm_sman_set_manager); > > -static struct drm_owner_item *drm_sman_get_owner_item(struct drm_sman * sman, > - unsigned long owner) > -{ > - int ret; > - struct drm_hash_item *owner_hash_item; > - struct drm_owner_item *owner_item; > - > - ret = drm_ht_find_item(&sman->owner_hash_tab, owner, &owner_hash_item); > - if (!ret) { > - return drm_hash_entry(owner_hash_item, struct drm_owner_item, > - owner_hash); > - } > - > - owner_item = kzalloc(sizeof(*owner_item), GFP_KERNEL); > - if (!owner_item) > - goto out; > - > - INIT_LIST_HEAD(&owner_item->mem_blocks); > - owner_item->owner_hash.key = owner; > - if (drm_ht_insert_item(&sman->owner_hash_tab, &owner_item->owner_hash)) > - goto out1; > - > - list_add_tail(&owner_item->sman_list, &sman->owner_items); > - return owner_item; > - > -out1: > - kfree(owner_item); > -out: > - return NULL; > -} > - > struct drm_memblock_item *drm_sman_alloc(struct drm_sman *sman, unsigned int manager, > unsigned long size, unsigned alignment, > unsigned long owner) > { > void *tmp; > struct drm_sman_mm *sman_mm; > - struct drm_owner_item *owner_item; > struct drm_memblock_item *memblock; > > BUG_ON(manager >= sman->num_managers); > @@ -223,16 +184,8 @@ struct drm_memblock_item *drm_sman_alloc(struct drm_sman *sman, unsigned int man > (unsigned long)memblock, 32, 0, 0)) > goto out1; > > - owner_item = drm_sman_get_owner_item(sman, owner); > - if (!owner_item) > - goto out2; > - > - list_add_tail(&memblock->owner_list, &owner_item->mem_blocks); > - > return memblock; > > -out2: > - drm_ht_remove_item(&sman->user_hash_tab, &memblock->user_hash); > out1: > kfree(memblock); > out: > @@ -270,35 +223,11 @@ int drm_sman_free_key(struct drm_sman *sman, unsigned int key) > > EXPORT_SYMBOL(drm_sman_free_key); > > -static void drm_sman_remove_owner(struct drm_sman *sman, > - struct drm_owner_item *owner_item) > -{ > - list_del(&owner_item->sman_list); > - drm_ht_remove_item(&sman->owner_hash_tab, &owner_item->owner_hash); > - kfree(owner_item); > -} > - > -static void drm_sman_do_owner_cleanup(struct drm_sman *sman, > - struct drm_owner_item *owner_item) > -{ > - struct drm_memblock_item *entry, *next; > - > - list_for_each_entry_safe(entry, next, &owner_item->mem_blocks, > - owner_list) { > - drm_sman_free(entry); > - } > - drm_sman_remove_owner(sman, owner_item); > -} > - > void drm_sman_cleanup(struct drm_sman *sman) > { > - struct drm_owner_item *entry, *next; > unsigned int i; > struct drm_sman_mm *sman_mm; > > - list_for_each_entry_safe(entry, next, &sman->owner_items, sman_list) { > - drm_sman_do_owner_cleanup(sman, entry); > - } > if (sman->mm) { > for (i = 0; i < sman->num_managers; ++i) { > sman_mm = &sman->mm[i]; > diff --git a/drivers/gpu/drm/sis/sis_mm.c b/drivers/gpu/drm/sis/sis_mm.c > index a70b1bb..dff70da 100644 > --- a/drivers/gpu/drm/sis/sis_mm.c > +++ b/drivers/gpu/drm/sis/sis_mm.c > @@ -143,7 +143,8 @@ static int sis_drm_alloc(struct drm_device *dev, struct drm_file *file, > item = drm_sman_alloc(&dev_priv->sman, pool, mem->size, 0, 0); > > if (item) { > - list_move(&item->owner_list, &file_priv->obj_list); > + INIT_LIST_HEAD(&item->owner_list); > + list_add(&item->owner_list, &file_priv->obj_list); > mem->offset = ((pool == 0) ? > dev_priv->vram_offset : dev_priv->agp_offset) + > (item->mm-> > diff --git a/drivers/gpu/drm/via/via_mm.c b/drivers/gpu/drm/via/via_mm.c > index 19bb77c..ea3d621 100644 > --- a/drivers/gpu/drm/via/via_mm.c > +++ b/drivers/gpu/drm/via/via_mm.c > @@ -141,7 +141,8 @@ int via_mem_alloc(struct drm_device *dev, void *data, > item = drm_sman_alloc(&dev_priv->sman, mem->type, tmpSize, 0, 0); > > if (item) { > - list_move(&item->owner_list, &file_priv->obj_list); > + INIT_LIST_HEAD(&item->owner_list); > + list_add(&item->owner_list, &file_priv->obj_list); > mem->offset = ((mem->type == VIA_MEM_VIDEO) ? > dev_priv->vram_offset : dev_priv->agp_offset) + > (item->mm-> > diff --git a/include/drm/drm_sman.h b/include/drm/drm_sman.h > index d5ed903..34ae5ca 100644 > --- a/include/drm/drm_sman.h > +++ b/include/drm/drm_sman.h > @@ -87,9 +87,7 @@ struct drm_memblock_item { > struct drm_sman { > struct drm_sman_mm *mm; > int num_managers; > - struct drm_open_hash owner_hash_tab; > struct drm_open_hash user_hash_tab; > - struct list_head owner_items; > }; > > /* > -- > 1.7.7.1 > > _______________________________________________ > dri-devel mailing list > dri-devel@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/dri-devel > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel