Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a651c55a authored by Christian König's avatar Christian König Committed by Dave Airlie
Browse files

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: default avatarChristian König <deathsimple@vodafone.de>

Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent dd8bea21
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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;
+6 −0
Original line number Diff line number Diff line
@@ -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);
}