[PATCH 1/2] drm/ttm: fix re-init of global structures
Karol Herbst
kherbst at redhat.com
Tue Apr 16 11:34:00 UTC 2019
On Tue, Apr 16, 2019 at 12:53 PM Christian König
<ckoenig.leichtzumerken at gmail.com> wrote:
>
> When a driver unloads without unloading TTM we don't correctly
> clear the global structures leading to errors on re-init.
>
> Next step should probably be to remove the global structures and
> kobjs all together, but this is tricky since we need to maintain
> backward compatibility.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> ---
> drivers/gpu/drm/ttm/ttm_bo.c | 10 +++++-----
> drivers/gpu/drm/ttm/ttm_memory.c | 5 +++--
> include/drm/ttm/ttm_bo_driver.h | 1 -
> 3 files changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
> index 41d07faa2eae..2845fceb2fbd 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> @@ -49,9 +49,8 @@ static void ttm_bo_global_kobj_release(struct kobject *kobj);
> * ttm_global_mutex - protecting the global BO state
> */
> DEFINE_MUTEX(ttm_global_mutex);
> -struct ttm_bo_global ttm_bo_glob = {
> - .use_count = 0
> -};
> +unsigned ttm_bo_glob_use_count;
> +struct ttm_bo_global ttm_bo_glob;
>
> static struct attribute ttm_bo_count = {
> .name = "bo_count",
> @@ -1531,12 +1530,13 @@ static void ttm_bo_global_release(void)
> struct ttm_bo_global *glob = &ttm_bo_glob;
>
> mutex_lock(&ttm_global_mutex);
> - if (--glob->use_count > 0)
> + if (--ttm_bo_glob_use_count > 0)
> goto out;
>
> kobject_del(&glob->kobj);
> kobject_put(&glob->kobj);
> ttm_mem_global_release(&ttm_mem_glob);
> + memset(glob, 0, sizeof(*glob));
> out:
> mutex_unlock(&ttm_global_mutex);
> }
> @@ -1548,7 +1548,7 @@ static int ttm_bo_global_init(void)
> unsigned i;
>
> mutex_lock(&ttm_global_mutex);
> - if (++glob->use_count > 1)
> + if (++ttm_bo_glob_use_count > 1)
> goto out;
>
> ret = ttm_mem_global_init(&ttm_mem_glob);
> diff --git a/drivers/gpu/drm/ttm/ttm_memory.c b/drivers/gpu/drm/ttm/ttm_memory.c
> index 699fed9e08ee..8617958b7ae6 100644
> --- a/drivers/gpu/drm/ttm/ttm_memory.c
> +++ b/drivers/gpu/drm/ttm/ttm_memory.c
> @@ -461,8 +461,8 @@ int ttm_mem_global_init(struct ttm_mem_global *glob)
>
> void ttm_mem_global_release(struct ttm_mem_global *glob)
> {
> - unsigned int i;
> struct ttm_mem_zone *zone;
> + unsigned int i;
comment below
>
> /* let the page allocator first stop the shrink work. */
> ttm_page_alloc_fini();
> @@ -475,9 +475,10 @@ void ttm_mem_global_release(struct ttm_mem_global *glob)
> zone = glob->zones[i];
> kobject_del(&zone->kobj);
> kobject_put(&zone->kobj);
> - }
> + }
comment below
> kobject_del(&glob->kobj);
> kobject_put(&glob->kobj);
> + memset(glob, 0, sizeof(*glob));
> }
>
> static void ttm_check_swapping(struct ttm_mem_global *glob)
> diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
> index 3db265bf2d4e..c008346c2401 100644
> --- a/include/drm/ttm/ttm_bo_driver.h
> +++ b/include/drm/ttm/ttm_bo_driver.h
> @@ -420,7 +420,6 @@ extern struct ttm_bo_global {
> /**
> * Protected by ttm_global_mutex.
> */
> - unsigned int use_count;
> struct list_head device_list;
>
> /**
> --
> 2.17.1
>
tested on 5.0.7 and it fixes the crash I've encountered, so:
Tested-by: Karol Herbst <kherbst at redhat.com>
Personally I think we should split formatting and other unrelated
changes out of a patch for stable, but those are still fine changes,
anyway:
Reviewed-by: Karol Herbst <kherbst at redhat.com>
Thanks!
More information about the dri-devel
mailing list