mirror of https://gitee.com/openkylin/linux.git
drm/radeon: add proper locking to the SA v3
Make the suballocator self containing to locking. v2: split the bugfix into a seperate patch. v3: remove some unreleated changes. Sig-off-by: Christian König <deathsimple@vodafone.de> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
dd8bea2111
commit
a651c55a0b
|
@ -381,6 +381,7 @@ struct radeon_bo_list {
|
|||
* alignment).
|
||||
*/
|
||||
struct radeon_sa_manager {
|
||||
spinlock_t lock;
|
||||
struct radeon_bo *bo;
|
||||
struct list_head sa_bo;
|
||||
unsigned size;
|
||||
|
|
|
@ -37,6 +37,7 @@ int radeon_sa_bo_manager_init(struct radeon_device *rdev,
|
|||
{
|
||||
int r;
|
||||
|
||||
spin_lock_init(&sa_manager->lock);
|
||||
sa_manager->bo = NULL;
|
||||
sa_manager->size = size;
|
||||
sa_manager->domain = domain;
|
||||
|
@ -139,6 +140,7 @@ int radeon_sa_bo_new(struct radeon_device *rdev,
|
|||
|
||||
BUG_ON(align > RADEON_GPU_PAGE_SIZE);
|
||||
BUG_ON(size > sa_manager->size);
|
||||
spin_lock(&sa_manager->lock);
|
||||
|
||||
/* no one ? */
|
||||
head = sa_manager->sa_bo.prev;
|
||||
|
@ -172,6 +174,7 @@ int radeon_sa_bo_new(struct radeon_device *rdev,
|
|||
offset += wasted;
|
||||
if ((sa_manager->size - offset) < size) {
|
||||
/* failed to find somethings big enough */
|
||||
spin_unlock(&sa_manager->lock);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -180,10 +183,13 @@ int radeon_sa_bo_new(struct radeon_device *rdev,
|
|||
sa_bo->offset = offset;
|
||||
sa_bo->size = size;
|
||||
list_add(&sa_bo->list, head);
|
||||
spin_unlock(&sa_manager->lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void radeon_sa_bo_free(struct radeon_device *rdev, struct radeon_sa_bo *sa_bo)
|
||||
{
|
||||
spin_lock(&sa_bo->manager->lock);
|
||||
list_del_init(&sa_bo->list);
|
||||
spin_unlock(&sa_bo->manager->lock);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue