diff options
author | Christian König <deathsimple@vodafone.de> | 2012-05-09 09:34:50 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-05-09 12:22:32 -0400 |
commit | a651c55a0b489a9d5900354d487ebe34d84eec2c (patch) | |
tree | 19d39be46771f2b261197e6f0e01075390f3b645 | |
parent | dd8bea2111ab80ecb640183d00c383e03554509d (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.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_sa.c | 6 |
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 | */ |
383 | struct radeon_sa_manager { | 383 | struct 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 | ||
186 | void radeon_sa_bo_free(struct radeon_device *rdev, struct radeon_sa_bo *sa_bo) | 190 | void 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 | } |