mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-03 15:47:36 +00:00
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:
parent
00fd14ff30
commit
bd4264112f
3 changed files with 8 additions and 8 deletions
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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();
|
||||||
|
@ -478,6 +478,7 @@ void ttm_mem_global_release(struct ttm_mem_global *glob)
|
||||||
}
|
}
|
||||||
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 {
|
||||||
/**
|
/**
|
||||||
* Protected by ttm_global_mutex.
|
* Protected by ttm_global_mutex.
|
||||||
*/
|
*/
|
||||||
unsigned int use_count;
|
|
||||||
struct list_head device_list;
|
struct list_head device_list;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue