[PATCH 04/23] 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. > > Signed-off-by: Daniel Vetter Acked-by: James Simmons > --- > 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); > -}
Re: [PATCH 04/23] 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. > > Signed-off-by: Daniel Vetter Acked-by: James Simmons > --- > 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); > -}
[PATCH 04/23] 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. Signed-off-by: Daniel Vetter --- 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, nex
[PATCH 04/23] 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. Signed-off-by: Daniel Vetter --- 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(e