aboutsummaryrefslogtreecommitdiff
path: root/bsd-core
diff options
context:
space:
mode:
authorRobert Noland <rnoland@2hip.net>2008-09-06 18:37:06 -0400
committerRobert Noland <rnoland@2hip.net>2008-09-06 18:37:06 -0400
commit6f2479c67432f764bfc4e248689f1737c1935237 (patch)
treed78b9dc1913cda30088176b534d8295334e25b25 /bsd-core
parent31709aa2be54877c45ca382bf370b41dbaf5c2ec (diff)
[FreeBSD] Ensure that drm_pci_alloc is never called while locks are held.
Diffstat (limited to 'bsd-core')
-rw-r--r--bsd-core/ati_pcigart.c13
-rw-r--r--bsd-core/drm_bufs.c2
-rw-r--r--bsd-core/drm_pci.c13
3 files changed, 20 insertions, 8 deletions
diff --git a/bsd-core/ati_pcigart.c b/bsd-core/ati_pcigart.c
index f8d3f18d..c4453ed5 100644
--- a/bsd-core/ati_pcigart.c
+++ b/bsd-core/ati_pcigart.c
@@ -42,12 +42,17 @@
static int drm_ati_alloc_pcigart_table(struct drm_device *dev,
struct drm_ati_pcigart_info *gart_info)
{
- dev->sg->dmah = drm_pci_alloc(dev, gart_info->table_size,
- PAGE_SIZE,
- gart_info->table_mask);
- if (dev->sg->dmah == NULL)
+ drm_dma_handle_t *dmah;
+
+ DRM_UNLOCK();
+ dmah = drm_pci_alloc(dev, gart_info->table_size, PAGE_SIZE,
+ gart_info->table_mask);
+ DRM_LOCK();
+ if (dmah == NULL)
return ENOMEM;
+ dev->sg->dmah = dmah;
+
return 0;
}
diff --git a/bsd-core/drm_bufs.c b/bsd-core/drm_bufs.c
index 45e01470..94f51386 100644
--- a/bsd-core/drm_bufs.c
+++ b/bsd-core/drm_bufs.c
@@ -595,8 +595,10 @@ static int drm_do_addbufs_pci(struct drm_device *dev, struct drm_buf_desc *reque
page_count = 0;
while (entry->buf_count < count) {
+ DRM_SPINUNLOCK(&dev->dma_lock);
drm_dma_handle_t *dmah = drm_pci_alloc(dev, size, alignment,
0xfffffffful);
+ DRM_SPINLOCK(&dev->dma_lock);
if (dmah == NULL) {
/* Set count correctly so we free the proper amount. */
entry->buf_count = count;
diff --git a/bsd-core/drm_pci.c b/bsd-core/drm_pci.c
index f23b2a5b..16c830ec 100644
--- a/bsd-core/drm_pci.c
+++ b/bsd-core/drm_pci.c
@@ -71,7 +71,14 @@ drm_pci_alloc(struct drm_device *dev, size_t size,
return NULL;
#ifdef __FreeBSD__
- DRM_UNLOCK();
+ /* Make sure we aren't holding locks here */
+ mtx_assert(&dev->dev_lock, MA_NOTOWNED);
+ if (mtx_owned(&dev->dev_lock))
+ DRM_ERROR("called while holding dev_lock\n");
+ mtx_assert(&dev->dma_lock, MA_NOTOWNED);
+ if (mtx_owned(&dev->dma_lock))
+ DRM_ERROR("called while holding dma_lock\n");
+
ret = bus_dma_tag_create(NULL, align, 0, /* tag, align, boundary */
maxaddr, BUS_SPACE_MAXADDR, /* lowaddr, highaddr */
NULL, NULL, /* filtfunc, filtfuncargs */
@@ -80,7 +87,6 @@ drm_pci_alloc(struct drm_device *dev, size_t size,
&dmah->tag);
if (ret != 0) {
free(dmah, M_DRM);
- DRM_LOCK();
return NULL;
}
@@ -89,10 +95,9 @@ drm_pci_alloc(struct drm_device *dev, size_t size,
if (ret != 0) {
bus_dma_tag_destroy(dmah->tag);
free(dmah, M_DRM);
- DRM_LOCK();
return NULL;
}
- DRM_LOCK();
+
ret = bus_dmamap_load(dmah->tag, dmah->map, dmah->vaddr, size,
drm_pci_busdma_callback, dmah, 0);
if (ret != 0) {