[bug report] drm/ttm: fix re-init of global structures
Christian König
christian.koenig at amd.com
Tue Feb 4 14:27:39 UTC 2020
Am 04.02.20 um 15:24 schrieb Dan Carpenter:
> On Tue, Feb 04, 2020 at 03:03:43PM +0100, Christian König wrote:
>> Am 04.02.20 um 13:57 schrieb Dan Carpenter:
>>> Hello Christian König,
>>>
>>> The patch bd4264112f93: "drm/ttm: fix re-init of global structures"
>>> from Apr 16, 2019, leads to the following static checker warning:
>>>
>>> drivers/gpu/drm/ttm/ttm_bo.c:1610 ttm_bo_global_release()
>>> warn: passing freed memory 'glob'
>>>
>>> drivers/gpu/drm/ttm/ttm_bo.c
>>> 1591 static void ttm_bo_global_kobj_release(struct kobject *kobj)
>>> 1592 {
>>> 1593 struct ttm_bo_global *glob =
>>> 1594 container_of(kobj, struct ttm_bo_global, kobj);
>>> 1595
>>> 1596 __free_page(glob->dummy_read_page);
>>> 1597 }
>>> 1598
>>> 1599 static void ttm_bo_global_release(void)
>>> 1600 {
>>> 1601 struct ttm_bo_global *glob = &ttm_bo_glob;
>>> 1602
>>> 1603 mutex_lock(&ttm_global_mutex);
>>> 1604 if (--ttm_bo_glob_use_count > 0)
>>> 1605 goto out;
>>> 1606
>>> 1607 kobject_del(&glob->kobj);
>>> 1608 kobject_put(&glob->kobj);
>>> 1609 ttm_mem_global_release(&ttm_mem_glob);
>>> 1610 memset(glob, 0, sizeof(*glob));
>>> ^^^^^^^^^^^^^^^^^^^^^^
>>> Depending on the config kobject_release() might call ttm_bo_global_kobj_release()
>>> a few seconds after this memset. Maybe put the memset into
>>> ttm_bo_global_kobj_release()?
>> That's not possible. The object might be re-used directly after we drop the
>> ttm_global_mutex.
>>
> Hm... That sucks. If we reallocate glob->dummy_read_page before the
> ttm_bo_global_kobj_release() gets called then we're toasted.
>
>> How can we wait for the ttm_mem_global_release() to have finished?
>>
> A bunch of these release functions use a completion. But you probably
> don't want a four second delay before we can re-use the struct.
Actually that should be fine.
I mean the function is usually called on module unload, if that really
waits for 4 seconds until it calls ttm_bo_global_kobj_release() then
that would most likely result in a crash anyway because the code segment
is already unloaded.
Regards,
Christian.
>
> regards,
> dan carpenter
More information about the dri-devel
mailing list