summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorOwain Ainsworth <oga@cvs.openbsd.org>2008-08-17 14:37:32 +0000
committerOwain Ainsworth <oga@cvs.openbsd.org>2008-08-17 14:37:32 +0000
commit12ef535c6c2b88b0aa8490b92574e63baea7a7c0 (patch)
tree98a4a5105a2a7f9fb71be6b7f542068dc3e25c57 /sys
parent49671daad622f12247c077f5e81781a943d999b7 (diff)
Make sure we can't sleep with a spinlock held
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/pci/drm/drm_context.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/sys/dev/pci/drm/drm_context.c b/sys/dev/pci/drm/drm_context.c
index beb363f98ab..d2c5fb4391f 100644
--- a/sys/dev/pci/drm/drm_context.c
+++ b/sys/dev/pci/drm/drm_context.c
@@ -80,15 +80,15 @@ drm_ctxbitmap_next(struct drm_device *dev)
int
drm_ctxbitmap_init(struct drm_device *dev)
{
- int i;
- int temp;
+ atomic_t *bitmap;
+ int i, temp;
+
+ bitmap = drm_calloc(1, PAGE_SIZE, DRM_MEM_CTXBITMAP);
+ if (bitmap == NULL)
+ return (ENOMEM);
DRM_LOCK();
- dev->ctx_bitmap = drm_calloc(1, PAGE_SIZE, DRM_MEM_CTXBITMAP);
- if (dev->ctx_bitmap == NULL) {
- DRM_UNLOCK();
- return ENOMEM;
- }
+ dev->ctx_bitmap = bitmap;
dev->max_context = -1;
DRM_UNLOCK();
@@ -103,9 +103,13 @@ drm_ctxbitmap_init(struct drm_device *dev)
void
drm_ctxbitmap_cleanup(struct drm_device *dev)
{
+ atomic_t *bitmap;
+
DRM_LOCK();
- drm_free(dev->ctx_bitmap, PAGE_SIZE, DRM_MEM_CTXBITMAP);
+ bitmap = dev->ctx_bitmap;
+ dev->ctx_bitmap = NULL;
DRM_UNLOCK();
+ drm_free(bitmap, PAGE_SIZE, DRM_MEM_CTXBITMAP);
}
int