aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian König <deathsimple@vodafone.de>2012-05-09 09:34:50 -0400
committerDave Airlie <airlied@redhat.com>2012-05-09 12:22:32 -0400
commita651c55a0b489a9d5900354d487ebe34d84eec2c (patch)
tree19d39be46771f2b261197e6f0e01075390f3b645
parentdd8bea2111ab80ecb640183d00c383e03554509d (diff)
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>
-rw-r--r--drivers/gpu/drm/radeon/radeon.h1
-rw-r--r--drivers/gpu/drm/radeon/radeon_sa.c6
2 files changed, 7 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 701094b05f47..8a6b1b31bb5e 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -381,6 +381,7 @@ struct radeon_bo_list {
381 * alignment). 381 * alignment).
382 */ 382 */
383struct radeon_sa_manager { 383struct radeon_sa_manager {
384 spinlock_t lock;
384 struct radeon_bo *bo; 385 struct radeon_bo *bo;
385 struct list_head sa_bo; 386 struct list_head sa_bo;
386 unsigned size; 387 unsigned size;
diff --git a/drivers/gpu/drm/radeon/radeon_sa.c b/drivers/gpu/drm/radeon/radeon_sa.c
index 8fbfe69b7bcb..aed0a8c68c84 100644
--- a/drivers/gpu/drm/radeon/radeon_sa.c
+++ b/drivers/gpu/drm/radeon/radeon_sa.c
@@ -37,6 +37,7 @@ int radeon_sa_bo_manager_init(struct radeon_device *rdev,
37{ 37{
38 int r; 38 int r;
39 39
40 spin_lock_init(&sa_manager->lock);
40 sa_manager->bo = NULL; 41 sa_manager->bo = NULL;
41 sa_manager->size = size; 42 sa_manager->size = size;
42 sa_manager->domain = domain; 43 sa_manager->domain = domain;
@@ -139,6 +140,7 @@ int radeon_sa_bo_new(struct radeon_device *rdev,
139 140
140 BUG_ON(align > RADEON_GPU_PAGE_SIZE); 141 BUG_ON(align > RADEON_GPU_PAGE_SIZE);
141 BUG_ON(size > sa_manager->size); 142 BUG_ON(size > sa_manager->size);
143 spin_lock(&sa_manager->lock);
142 144
143 /* no one ? */ 145 /* no one ? */
144 head = sa_manager->sa_bo.prev; 146 head = sa_manager->sa_bo.prev;
@@ -172,6 +174,7 @@ int radeon_sa_bo_new(struct radeon_device *rdev,
172 offset += wasted; 174 offset += wasted;
173 if ((sa_manager->size - offset) < size) { 175 if ((sa_manager->size - offset) < size) {
174 /* failed to find somethings big enough */ 176 /* failed to find somethings big enough */
177 spin_unlock(&sa_manager->lock);
175 return -ENOMEM; 178 return -ENOMEM;
176 } 179 }
177 180
@@ -180,10 +183,13 @@ out:
180 sa_bo->offset = offset; 183 sa_bo->offset = offset;
181 sa_bo->size = size; 184 sa_bo->size = size;
182 list_add(&sa_bo->list, head); 185 list_add(&sa_bo->list, head);
186 spin_unlock(&sa_manager->lock);
183 return 0; 187 return 0;
184} 188}
185 189
186void radeon_sa_bo_free(struct radeon_device *rdev, struct radeon_sa_bo *sa_bo) 190void radeon_sa_bo_free(struct radeon_device *rdev, struct radeon_sa_bo *sa_bo)
187{ 191{
192 spin_lock(&sa_bo->manager->lock);
188 list_del_init(&sa_bo->list); 193 list_del_init(&sa_bo->list);
194 spin_unlock(&sa_bo->manager->lock);
189} 195}