[bug report] drm/ttm: fix re-init of global structures

Christian König christian.koenig at amd.com
Tue Feb 4 14:03:43 UTC 2020


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.

How can we wait for the ttm_mem_global_release() to have finished?

I mean in theory that function should actually be used from a 
module_exit() callback, and we need to make 100% sure that the kobj is 
gone or we are running in a bunch of trouble.

Christian.

>
>    1611  out:
>    1612          mutex_unlock(&ttm_global_mutex);
>    1613  }
>
>
> regards,
> dan carpenter



More information about the dri-devel mailing list