Commit bd426411 authored by Christian König's avatar Christian König Committed by Alex Deucher

drm/ttm: fix re-init of global structures

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: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarKarol Herbst <kherbst@redhat.com>
Tested-by: default avatarKarol Herbst <kherbst@redhat.com>
CC: stable@vger.kernel.org # 5.0.x
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 00fd14ff
...@@ -49,9 +49,8 @@ static void ttm_bo_global_kobj_release(struct kobject *kobj); ...@@ -49,9 +49,8 @@ static void ttm_bo_global_kobj_release(struct kobject *kobj);
* ttm_global_mutex - protecting the global BO state * ttm_global_mutex - protecting the global BO state
*/ */
DEFINE_MUTEX(ttm_global_mutex); DEFINE_MUTEX(ttm_global_mutex);
struct ttm_bo_global ttm_bo_glob = { unsigned ttm_bo_glob_use_count;
.use_count = 0 struct ttm_bo_global ttm_bo_glob;
};
static struct attribute ttm_bo_count = { static struct attribute ttm_bo_count = {
.name = "bo_count", .name = "bo_count",
...@@ -1531,12 +1530,13 @@ static void ttm_bo_global_release(void) ...@@ -1531,12 +1530,13 @@ static void ttm_bo_global_release(void)
struct ttm_bo_global *glob = &ttm_bo_glob; struct ttm_bo_global *glob = &ttm_bo_glob;
mutex_lock(&ttm_global_mutex); mutex_lock(&ttm_global_mutex);
if (--glob->use_count > 0) if (--ttm_bo_glob_use_count > 0)
goto out; goto out;
kobject_del(&glob->kobj); kobject_del(&glob->kobj);
kobject_put(&glob->kobj); kobject_put(&glob->kobj);
ttm_mem_global_release(&ttm_mem_glob); ttm_mem_global_release(&ttm_mem_glob);
memset(glob, 0, sizeof(*glob));
out: out:
mutex_unlock(&ttm_global_mutex); mutex_unlock(&ttm_global_mutex);
} }
...@@ -1548,7 +1548,7 @@ static int ttm_bo_global_init(void) ...@@ -1548,7 +1548,7 @@ static int ttm_bo_global_init(void)
unsigned i; unsigned i;
mutex_lock(&ttm_global_mutex); mutex_lock(&ttm_global_mutex);
if (++glob->use_count > 1) if (++ttm_bo_glob_use_count > 1)
goto out; goto out;
ret = ttm_mem_global_init(&ttm_mem_glob); ret = ttm_mem_global_init(&ttm_mem_glob);
......
...@@ -461,8 +461,8 @@ int ttm_mem_global_init(struct ttm_mem_global *glob) ...@@ -461,8 +461,8 @@ int ttm_mem_global_init(struct ttm_mem_global *glob)
void ttm_mem_global_release(struct ttm_mem_global *glob) void ttm_mem_global_release(struct ttm_mem_global *glob)
{ {
unsigned int i;
struct ttm_mem_zone *zone; struct ttm_mem_zone *zone;
unsigned int i;
/* let the page allocator first stop the shrink work. */ /* let the page allocator first stop the shrink work. */
ttm_page_alloc_fini(); ttm_page_alloc_fini();
...@@ -475,9 +475,10 @@ void ttm_mem_global_release(struct ttm_mem_global *glob) ...@@ -475,9 +475,10 @@ void ttm_mem_global_release(struct ttm_mem_global *glob)
zone = glob->zones[i]; zone = glob->zones[i];
kobject_del(&zone->kobj); kobject_del(&zone->kobj);
kobject_put(&zone->kobj); kobject_put(&zone->kobj);
} }
kobject_del(&glob->kobj); kobject_del(&glob->kobj);
kobject_put(&glob->kobj); kobject_put(&glob->kobj);
memset(glob, 0, sizeof(*glob));
} }
static void ttm_check_swapping(struct ttm_mem_global *glob) static void ttm_check_swapping(struct ttm_mem_global *glob)
......
...@@ -420,7 +420,6 @@ extern struct ttm_bo_global { ...@@ -420,7 +420,6 @@ extern struct ttm_bo_global {
/** /**
* Protected by ttm_global_mutex. * Protected by ttm_global_mutex.
*/ */
unsigned int use_count;
struct list_head device_list; struct list_head device_list;
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment