aboutsummaryrefslogtreecommitdiffstats
path: root/include/drm
diff options
context:
space:
mode:
Diffstat (limited to 'include/drm')
-rw-r--r--include/drm/drmP.h28
-rw-r--r--include/drm/drm_pciids.h2
2 files changed, 21 insertions, 9 deletions
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index bb5c41893c00..274eaaa15c36 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -612,7 +612,7 @@ struct drm_gem_object {
612 struct kref refcount; 612 struct kref refcount;
613 613
614 /** Handle count of this object. Each handle also holds a reference */ 614 /** Handle count of this object. Each handle also holds a reference */
615 struct kref handlecount; 615 atomic_t handle_count; /* number of handles on this object */
616 616
617 /** Related drm device */ 617 /** Related drm device */
618 struct drm_device *dev; 618 struct drm_device *dev;
@@ -1151,6 +1151,7 @@ extern int drm_release(struct inode *inode, struct file *filp);
1151extern int drm_mmap(struct file *filp, struct vm_area_struct *vma); 1151extern int drm_mmap(struct file *filp, struct vm_area_struct *vma);
1152extern int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma); 1152extern int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma);
1153extern void drm_vm_open_locked(struct vm_area_struct *vma); 1153extern void drm_vm_open_locked(struct vm_area_struct *vma);
1154extern void drm_vm_close_locked(struct vm_area_struct *vma);
1154extern unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait); 1155extern unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait);
1155 1156
1156 /* Memory management support (drm_memory.h) */ 1157 /* Memory management support (drm_memory.h) */
@@ -1411,12 +1412,11 @@ int drm_gem_init(struct drm_device *dev);
1411void drm_gem_destroy(struct drm_device *dev); 1412void drm_gem_destroy(struct drm_device *dev);
1412void drm_gem_object_release(struct drm_gem_object *obj); 1413void drm_gem_object_release(struct drm_gem_object *obj);
1413void drm_gem_object_free(struct kref *kref); 1414void drm_gem_object_free(struct kref *kref);
1414void drm_gem_object_free_unlocked(struct kref *kref);
1415struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev, 1415struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev,
1416 size_t size); 1416 size_t size);
1417int drm_gem_object_init(struct drm_device *dev, 1417int drm_gem_object_init(struct drm_device *dev,
1418 struct drm_gem_object *obj, size_t size); 1418 struct drm_gem_object *obj, size_t size);
1419void drm_gem_object_handle_free(struct kref *kref); 1419void drm_gem_object_handle_free(struct drm_gem_object *obj);
1420void drm_gem_vm_open(struct vm_area_struct *vma); 1420void drm_gem_vm_open(struct vm_area_struct *vma);
1421void drm_gem_vm_close(struct vm_area_struct *vma); 1421void drm_gem_vm_close(struct vm_area_struct *vma);
1422int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma); 1422int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
@@ -1439,8 +1439,12 @@ drm_gem_object_unreference(struct drm_gem_object *obj)
1439static inline void 1439static inline void
1440drm_gem_object_unreference_unlocked(struct drm_gem_object *obj) 1440drm_gem_object_unreference_unlocked(struct drm_gem_object *obj)
1441{ 1441{
1442 if (obj != NULL) 1442 if (obj != NULL) {
1443 kref_put(&obj->refcount, drm_gem_object_free_unlocked); 1443 struct drm_device *dev = obj->dev;
1444 mutex_lock(&dev->struct_mutex);
1445 kref_put(&obj->refcount, drm_gem_object_free);
1446 mutex_unlock(&dev->struct_mutex);
1447 }
1444} 1448}
1445 1449
1446int drm_gem_handle_create(struct drm_file *file_priv, 1450int drm_gem_handle_create(struct drm_file *file_priv,
@@ -1451,7 +1455,7 @@ static inline void
1451drm_gem_object_handle_reference(struct drm_gem_object *obj) 1455drm_gem_object_handle_reference(struct drm_gem_object *obj)
1452{ 1456{
1453 drm_gem_object_reference(obj); 1457 drm_gem_object_reference(obj);
1454 kref_get(&obj->handlecount); 1458 atomic_inc(&obj->handle_count);
1455} 1459}
1456 1460
1457static inline void 1461static inline void
@@ -1460,12 +1464,15 @@ drm_gem_object_handle_unreference(struct drm_gem_object *obj)
1460 if (obj == NULL) 1464 if (obj == NULL)
1461 return; 1465 return;
1462 1466
1467 if (atomic_read(&obj->handle_count) == 0)
1468 return;
1463 /* 1469 /*
1464 * Must bump handle count first as this may be the last 1470 * Must bump handle count first as this may be the last
1465 * ref, in which case the object would disappear before we 1471 * ref, in which case the object would disappear before we
1466 * checked for a name 1472 * checked for a name
1467 */ 1473 */
1468 kref_put(&obj->handlecount, drm_gem_object_handle_free); 1474 if (atomic_dec_and_test(&obj->handle_count))
1475 drm_gem_object_handle_free(obj);
1469 drm_gem_object_unreference(obj); 1476 drm_gem_object_unreference(obj);
1470} 1477}
1471 1478
@@ -1475,12 +1482,17 @@ drm_gem_object_handle_unreference_unlocked(struct drm_gem_object *obj)
1475 if (obj == NULL) 1482 if (obj == NULL)
1476 return; 1483 return;
1477 1484
1485 if (atomic_read(&obj->handle_count) == 0)
1486 return;
1487
1478 /* 1488 /*
1479 * Must bump handle count first as this may be the last 1489 * Must bump handle count first as this may be the last
1480 * ref, in which case the object would disappear before we 1490 * ref, in which case the object would disappear before we
1481 * checked for a name 1491 * checked for a name
1482 */ 1492 */
1483 kref_put(&obj->handlecount, drm_gem_object_handle_free); 1493
1494 if (atomic_dec_and_test(&obj->handle_count))
1495 drm_gem_object_handle_free(obj);
1484 drm_gem_object_unreference_unlocked(obj); 1496 drm_gem_object_unreference_unlocked(obj);
1485} 1497}
1486 1498
diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h
index 3a9940ef728b..883c1d439899 100644
--- a/include/drm/drm_pciids.h
+++ b/include/drm/drm_pciids.h
@@ -85,7 +85,6 @@
85 {0x1002, 0x5460, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \ 85 {0x1002, 0x5460, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \
86 {0x1002, 0x5462, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \ 86 {0x1002, 0x5462, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \
87 {0x1002, 0x5464, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \ 87 {0x1002, 0x5464, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \
88 {0x1002, 0x5657, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \
89 {0x1002, 0x5548, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R423|RADEON_NEW_MEMMAP}, \ 88 {0x1002, 0x5548, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R423|RADEON_NEW_MEMMAP}, \
90 {0x1002, 0x5549, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R423|RADEON_NEW_MEMMAP}, \ 89 {0x1002, 0x5549, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R423|RADEON_NEW_MEMMAP}, \
91 {0x1002, 0x554A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R423|RADEON_NEW_MEMMAP}, \ 90 {0x1002, 0x554A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R423|RADEON_NEW_MEMMAP}, \
@@ -103,6 +102,7 @@
103 {0x1002, 0x564F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 102 {0x1002, 0x564F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
104 {0x1002, 0x5652, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 103 {0x1002, 0x5652, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
105 {0x1002, 0x5653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ 104 {0x1002, 0x5653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
105 {0x1002, 0x5657, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \
106 {0x1002, 0x5834, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP}, \ 106 {0x1002, 0x5834, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP}, \
107 {0x1002, 0x5835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP|RADEON_IS_MOBILITY}, \ 107 {0x1002, 0x5835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP|RADEON_IS_MOBILITY}, \
108 {0x1002, 0x5954, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS480|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ 108 {0x1002, 0x5954, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS480|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \