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

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
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -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);
+3 −2
Original line number Diff line number Diff line
@@ -461,8 +461,8 @@ out_no_zone:

void ttm_mem_global_release(struct ttm_mem_global *glob)
{
	unsigned int i;
	struct ttm_mem_zone *zone;
	unsigned int i;

	/* let the page allocator first stop the shrink work. */
	ttm_page_alloc_fini();
@@ -478,6 +478,7 @@ void ttm_mem_global_release(struct ttm_mem_global *glob)
	}
	kobject_del(&glob->kobj);
	kobject_put(&glob->kobj);
	memset(glob, 0, sizeof(*glob));
}

static void ttm_check_swapping(struct ttm_mem_global *glob)
+0 −1
Original line number Diff line number Diff line
@@ -420,7 +420,6 @@ extern struct ttm_bo_global {
	/**
	 * Protected by ttm_global_mutex.
	 */
	unsigned int use_count;
	struct list_head device_list;

	/**