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: Christian König <christian.koenig@amd.com> Reviewed-by: Karol Herbst <kherbst@redhat.com> Tested-by: Karol Herbst <kherbst@redhat.com> CC: stable@vger.kernel.org # 5.0.x Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Родитель
00fd14ff30
Коммит
bd4264112f
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
kobject_del(&glob->kobj);
|
||||
kobject_put(&glob->kobj);
|
||||
memset(glob, 0, sizeof(*glob));
|
||||
}
|
||||
|
||||
static void ttm_check_swapping(struct ttm_mem_global *glob)
|
||||
|
|
|
@ -420,7 +420,6 @@ extern struct ttm_bo_global {
|
|||
/**
|
||||
* Protected by ttm_global_mutex.
|
||||
*/
|
||||
unsigned int use_count;
|
||||
struct list_head device_list;
|
||||
|
||||
/**
|
||||
|
|
Загрузка…
Ссылка в новой задаче