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
2 changed files with 7 additions and 0 deletions
|
@ -381,6 +381,7 @@ struct radeon_bo_list {
|
||||||
* alignment).
|
* alignment).
|
||||||
*/
|
*/
|
||||||
struct radeon_sa_manager {
|
struct radeon_sa_manager {
|
||||||
|
spinlock_t lock;
|
||||||
struct radeon_bo *bo;
|
struct radeon_bo *bo;
|
||||||
struct list_head sa_bo;
|
struct list_head sa_bo;
|
||||||
unsigned size;
|
unsigned size;
|
||||||
|
|
|
@ -37,6 +37,7 @@ int radeon_sa_bo_manager_init(struct radeon_device *rdev,
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
spin_lock_init(&sa_manager->lock);
|
||||||
sa_manager->bo = NULL;
|
sa_manager->bo = NULL;
|
||||||
sa_manager->size = size;
|
sa_manager->size = size;
|
||||||
sa_manager->domain = domain;
|
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(align > RADEON_GPU_PAGE_SIZE);
|
||||||
BUG_ON(size > sa_manager->size);
|
BUG_ON(size > sa_manager->size);
|
||||||
|
spin_lock(&sa_manager->lock);
|
||||||
|
|
||||||
/* no one ? */
|
/* no one ? */
|
||||||
head = sa_manager->sa_bo.prev;
|
head = sa_manager->sa_bo.prev;
|
||||||
|
@ -172,6 +174,7 @@ int radeon_sa_bo_new(struct radeon_device *rdev,
|
||||||
offset += wasted;
|
offset += wasted;
|
||||||
if ((sa_manager->size - offset) < size) {
|
if ((sa_manager->size - offset) < size) {
|
||||||
/* failed to find somethings big enough */
|
/* failed to find somethings big enough */
|
||||||
|
spin_unlock(&sa_manager->lock);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -180,10 +183,13 @@ out:
|
||||||
sa_bo->offset = offset;
|
sa_bo->offset = offset;
|
||||||
sa_bo->size = size;
|
sa_bo->size = size;
|
||||||
list_add(&sa_bo->list, head);
|
list_add(&sa_bo->list, head);
|
||||||
|
spin_unlock(&sa_manager->lock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void radeon_sa_bo_free(struct radeon_device *rdev, struct radeon_sa_bo *sa_bo)
|
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);
|
list_del_init(&sa_bo->list);
|
||||||
|
spin_unlock(&sa_bo->manager->lock);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue