diff options
| -rw-r--r-- | drivers/gpu/drm/drm_drv.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_fops.c | 23 | ||||
| -rw-r--r-- | drivers/gpu/drm/i810/i810_dma.c | 44 | ||||
| -rw-r--r-- | drivers/gpu/drm/i810/i810_drv.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i810/i810_drv.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i830/i830_dma.c | 42 | ||||
| -rw-r--r-- | drivers/gpu/drm/i830/i830_drv.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i830/i830_drv.h | 1 | ||||
| -rw-r--r-- | include/drm/drmP.h | 2 |
9 files changed, 75 insertions, 46 deletions
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index d5b349d279f5..90288ec7c284 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c | |||
| @@ -481,9 +481,9 @@ long drm_ioctl(struct file *filp, | |||
| 481 | if (ioctl->flags & DRM_UNLOCKED) | 481 | if (ioctl->flags & DRM_UNLOCKED) |
| 482 | retcode = func(dev, kdata, file_priv); | 482 | retcode = func(dev, kdata, file_priv); |
| 483 | else { | 483 | else { |
| 484 | lock_kernel(); | 484 | mutex_lock(&drm_global_mutex); |
| 485 | retcode = func(dev, kdata, file_priv); | 485 | retcode = func(dev, kdata, file_priv); |
| 486 | unlock_kernel(); | 486 | mutex_unlock(&drm_global_mutex); |
| 487 | } | 487 | } |
| 488 | 488 | ||
| 489 | if (cmd & IOC_OUT) { | 489 | if (cmd & IOC_OUT) { |
diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c index e7aace20981f..2ca8df8b6102 100644 --- a/drivers/gpu/drm/drm_fops.c +++ b/drivers/gpu/drm/drm_fops.c | |||
| @@ -39,6 +39,9 @@ | |||
| 39 | #include <linux/slab.h> | 39 | #include <linux/slab.h> |
| 40 | #include <linux/smp_lock.h> | 40 | #include <linux/smp_lock.h> |
| 41 | 41 | ||
| 42 | /* from BKL pushdown: note that nothing else serializes idr_find() */ | ||
| 43 | DEFINE_MUTEX(drm_global_mutex); | ||
| 44 | |||
| 42 | static int drm_open_helper(struct inode *inode, struct file *filp, | 45 | static int drm_open_helper(struct inode *inode, struct file *filp, |
| 43 | struct drm_device * dev); | 46 | struct drm_device * dev); |
| 44 | 47 | ||
| @@ -175,8 +178,7 @@ int drm_stub_open(struct inode *inode, struct file *filp) | |||
| 175 | 178 | ||
| 176 | DRM_DEBUG("\n"); | 179 | DRM_DEBUG("\n"); |
| 177 | 180 | ||
| 178 | /* BKL pushdown: note that nothing else serializes idr_find() */ | 181 | mutex_lock(&drm_global_mutex); |
| 179 | lock_kernel(); | ||
| 180 | minor = idr_find(&drm_minors_idr, minor_id); | 182 | minor = idr_find(&drm_minors_idr, minor_id); |
| 181 | if (!minor) | 183 | if (!minor) |
| 182 | goto out; | 184 | goto out; |
| @@ -197,7 +199,7 @@ int drm_stub_open(struct inode *inode, struct file *filp) | |||
| 197 | fops_put(old_fops); | 199 | fops_put(old_fops); |
| 198 | 200 | ||
| 199 | out: | 201 | out: |
| 200 | unlock_kernel(); | 202 | mutex_unlock(&drm_global_mutex); |
| 201 | return err; | 203 | return err; |
| 202 | } | 204 | } |
| 203 | 205 | ||
| @@ -472,7 +474,7 @@ int drm_release(struct inode *inode, struct file *filp) | |||
| 472 | struct drm_device *dev = file_priv->minor->dev; | 474 | struct drm_device *dev = file_priv->minor->dev; |
| 473 | int retcode = 0; | 475 | int retcode = 0; |
| 474 | 476 | ||
| 475 | lock_kernel(); | 477 | mutex_lock(&drm_global_mutex); |
| 476 | 478 | ||
| 477 | DRM_DEBUG("open_count = %d\n", dev->open_count); | 479 | DRM_DEBUG("open_count = %d\n", dev->open_count); |
| 478 | 480 | ||
| @@ -573,17 +575,14 @@ int drm_release(struct inode *inode, struct file *filp) | |||
| 573 | if (atomic_read(&dev->ioctl_count)) { | 575 | if (atomic_read(&dev->ioctl_count)) { |
| 574 | DRM_ERROR("Device busy: %d\n", | 576 | DRM_ERROR("Device busy: %d\n", |
| 575 | atomic_read(&dev->ioctl_count)); | 577 | atomic_read(&dev->ioctl_count)); |
| 576 | spin_unlock(&dev->count_lock); | 578 | retcode = -EBUSY; |
| 577 | unlock_kernel(); | 579 | goto out; |
| 578 | return -EBUSY; | ||
| 579 | } | 580 | } |
| 580 | spin_unlock(&dev->count_lock); | 581 | retcode = drm_lastclose(dev); |
| 581 | unlock_kernel(); | ||
| 582 | return drm_lastclose(dev); | ||
| 583 | } | 582 | } |
| 583 | out: | ||
| 584 | spin_unlock(&dev->count_lock); | 584 | spin_unlock(&dev->count_lock); |
| 585 | 585 | mutex_unlock(&drm_global_mutex); | |
| 586 | unlock_kernel(); | ||
| 587 | 586 | ||
| 588 | return retcode; | 587 | return retcode; |
| 589 | } | 588 | } |
diff --git a/drivers/gpu/drm/i810/i810_dma.c b/drivers/gpu/drm/i810/i810_dma.c index 09c86ed89927..0e6c131313d9 100644 --- a/drivers/gpu/drm/i810/i810_dma.c +++ b/drivers/gpu/drm/i810/i810_dma.c | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | #include <linux/interrupt.h> /* For task queue support */ | 37 | #include <linux/interrupt.h> /* For task queue support */ |
| 38 | #include <linux/delay.h> | 38 | #include <linux/delay.h> |
| 39 | #include <linux/slab.h> | 39 | #include <linux/slab.h> |
| 40 | #include <linux/smp_lock.h> | ||
| 40 | #include <linux/pagemap.h> | 41 | #include <linux/pagemap.h> |
| 41 | 42 | ||
| 42 | #define I810_BUF_FREE 2 | 43 | #define I810_BUF_FREE 2 |
| @@ -1240,22 +1241,35 @@ int i810_driver_dma_quiescent(struct drm_device *dev) | |||
| 1240 | return 0; | 1241 | return 0; |
| 1241 | } | 1242 | } |
| 1242 | 1243 | ||
| 1244 | /* | ||
| 1245 | * call the drm_ioctl under the big kernel lock because | ||
| 1246 | * to lock against the i810_mmap_buffers function. | ||
| 1247 | */ | ||
| 1248 | long i810_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
| 1249 | { | ||
| 1250 | int ret; | ||
| 1251 | lock_kernel(); | ||
| 1252 | ret = drm_ioctl(file, cmd, arg); | ||
| 1253 | unlock_kernel(); | ||
| 1254 | return ret; | ||
| 1255 | } | ||
| 1256 | |||
| 1243 | struct drm_ioctl_desc i810_ioctls[] = { | 1257 | struct drm_ioctl_desc i810_ioctls[] = { |
| 1244 | DRM_IOCTL_DEF(DRM_I810_INIT, i810_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), | 1258 | DRM_IOCTL_DEF(DRM_I810_INIT, i810_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY|DRM_UNLOCKED), |
| 1245 | DRM_IOCTL_DEF(DRM_I810_VERTEX, i810_dma_vertex, DRM_AUTH), | 1259 | DRM_IOCTL_DEF(DRM_I810_VERTEX, i810_dma_vertex, DRM_AUTH|DRM_UNLOCKED), |
| 1246 | DRM_IOCTL_DEF(DRM_I810_CLEAR, i810_clear_bufs, DRM_AUTH), | 1260 | DRM_IOCTL_DEF(DRM_I810_CLEAR, i810_clear_bufs, DRM_AUTH|DRM_UNLOCKED), |
| 1247 | DRM_IOCTL_DEF(DRM_I810_FLUSH, i810_flush_ioctl, DRM_AUTH), | 1261 | DRM_IOCTL_DEF(DRM_I810_FLUSH, i810_flush_ioctl, DRM_AUTH|DRM_UNLOCKED), |
| 1248 | DRM_IOCTL_DEF(DRM_I810_GETAGE, i810_getage, DRM_AUTH), | 1262 | DRM_IOCTL_DEF(DRM_I810_GETAGE, i810_getage, DRM_AUTH|DRM_UNLOCKED), |
| 1249 | DRM_IOCTL_DEF(DRM_I810_GETBUF, i810_getbuf, DRM_AUTH), | 1263 | DRM_IOCTL_DEF(DRM_I810_GETBUF, i810_getbuf, DRM_AUTH|DRM_UNLOCKED), |
| 1250 | DRM_IOCTL_DEF(DRM_I810_SWAP, i810_swap_bufs, DRM_AUTH), | 1264 | DRM_IOCTL_DEF(DRM_I810_SWAP, i810_swap_bufs, DRM_AUTH|DRM_UNLOCKED), |
| 1251 | DRM_IOCTL_DEF(DRM_I810_COPY, i810_copybuf, DRM_AUTH), | 1265 | DRM_IOCTL_DEF(DRM_I810_COPY, i810_copybuf, DRM_AUTH|DRM_UNLOCKED), |
| 1252 | DRM_IOCTL_DEF(DRM_I810_DOCOPY, i810_docopy, DRM_AUTH), | 1266 | DRM_IOCTL_DEF(DRM_I810_DOCOPY, i810_docopy, DRM_AUTH|DRM_UNLOCKED), |
| 1253 | DRM_IOCTL_DEF(DRM_I810_OV0INFO, i810_ov0_info, DRM_AUTH), | 1267 | DRM_IOCTL_DEF(DRM_I810_OV0INFO, i810_ov0_info, DRM_AUTH|DRM_UNLOCKED), |
| 1254 | DRM_IOCTL_DEF(DRM_I810_FSTATUS, i810_fstatus, DRM_AUTH), | 1268 | DRM_IOCTL_DEF(DRM_I810_FSTATUS, i810_fstatus, DRM_AUTH|DRM_UNLOCKED), |
| 1255 | DRM_IOCTL_DEF(DRM_I810_OV0FLIP, i810_ov0_flip, DRM_AUTH), | 1269 | DRM_IOCTL_DEF(DRM_I810_OV0FLIP, i810_ov0_flip, DRM_AUTH|DRM_UNLOCKED), |
| 1256 | DRM_IOCTL_DEF(DRM_I810_MC, i810_dma_mc, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), | 1270 | DRM_IOCTL_DEF(DRM_I810_MC, i810_dma_mc, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY|DRM_UNLOCKED), |
| 1257 | DRM_IOCTL_DEF(DRM_I810_RSTATUS, i810_rstatus, DRM_AUTH), | 1271 | DRM_IOCTL_DEF(DRM_I810_RSTATUS, i810_rstatus, DRM_AUTH|DRM_UNLOCKED), |
| 1258 | DRM_IOCTL_DEF(DRM_I810_FLIP, i810_flip_bufs, DRM_AUTH) | 1272 | DRM_IOCTL_DEF(DRM_I810_FLIP, i810_flip_bufs, DRM_AUTH|DRM_UNLOCKED), |
| 1259 | }; | 1273 | }; |
| 1260 | 1274 | ||
| 1261 | int i810_max_ioctl = DRM_ARRAY_SIZE(i810_ioctls); | 1275 | int i810_max_ioctl = DRM_ARRAY_SIZE(i810_ioctls); |
diff --git a/drivers/gpu/drm/i810/i810_drv.c b/drivers/gpu/drm/i810/i810_drv.c index c1e02752e023..b4250b2cac1f 100644 --- a/drivers/gpu/drm/i810/i810_drv.c +++ b/drivers/gpu/drm/i810/i810_drv.c | |||
| @@ -59,7 +59,7 @@ static struct drm_driver driver = { | |||
| 59 | .owner = THIS_MODULE, | 59 | .owner = THIS_MODULE, |
| 60 | .open = drm_open, | 60 | .open = drm_open, |
| 61 | .release = drm_release, | 61 | .release = drm_release, |
| 62 | .unlocked_ioctl = drm_ioctl, | 62 | .unlocked_ioctl = i810_ioctl, |
| 63 | .mmap = drm_mmap, | 63 | .mmap = drm_mmap, |
| 64 | .poll = drm_poll, | 64 | .poll = drm_poll, |
| 65 | .fasync = drm_fasync, | 65 | .fasync = drm_fasync, |
diff --git a/drivers/gpu/drm/i810/i810_drv.h b/drivers/gpu/drm/i810/i810_drv.h index 0743fe90f1e3..c9339f481795 100644 --- a/drivers/gpu/drm/i810/i810_drv.h +++ b/drivers/gpu/drm/i810/i810_drv.h | |||
| @@ -126,6 +126,7 @@ extern void i810_driver_reclaim_buffers_locked(struct drm_device *dev, | |||
| 126 | struct drm_file *file_priv); | 126 | struct drm_file *file_priv); |
| 127 | extern int i810_driver_device_is_agp(struct drm_device *dev); | 127 | extern int i810_driver_device_is_agp(struct drm_device *dev); |
| 128 | 128 | ||
| 129 | extern long i810_ioctl(struct file *file, unsigned int cmd, unsigned long arg); | ||
| 129 | extern struct drm_ioctl_desc i810_ioctls[]; | 130 | extern struct drm_ioctl_desc i810_ioctls[]; |
| 130 | extern int i810_max_ioctl; | 131 | extern int i810_max_ioctl; |
| 131 | 132 | ||
diff --git a/drivers/gpu/drm/i830/i830_dma.c b/drivers/gpu/drm/i830/i830_dma.c index 7ee85ea507ce..5168862c9227 100644 --- a/drivers/gpu/drm/i830/i830_dma.c +++ b/drivers/gpu/drm/i830/i830_dma.c | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include "i830_drm.h" | 36 | #include "i830_drm.h" |
| 37 | #include "i830_drv.h" | 37 | #include "i830_drv.h" |
| 38 | #include <linux/interrupt.h> /* For task queue support */ | 38 | #include <linux/interrupt.h> /* For task queue support */ |
| 39 | #include <linux/smp_lock.h> | ||
| 39 | #include <linux/pagemap.h> | 40 | #include <linux/pagemap.h> |
| 40 | #include <linux/delay.h> | 41 | #include <linux/delay.h> |
| 41 | #include <linux/slab.h> | 42 | #include <linux/slab.h> |
| @@ -1509,21 +1510,34 @@ int i830_driver_dma_quiescent(struct drm_device *dev) | |||
| 1509 | return 0; | 1510 | return 0; |
| 1510 | } | 1511 | } |
| 1511 | 1512 | ||
| 1513 | /* | ||
| 1514 | * call the drm_ioctl under the big kernel lock because | ||
| 1515 | * to lock against the i830_mmap_buffers function. | ||
| 1516 | */ | ||
| 1517 | long i830_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
| 1518 | { | ||
| 1519 | int ret; | ||
| 1520 | lock_kernel(); | ||
| 1521 | ret = drm_ioctl(file, cmd, arg); | ||
| 1522 | unlock_kernel(); | ||
| 1523 | return ret; | ||
| 1524 | } | ||
| 1525 | |||
| 1512 | struct drm_ioctl_desc i830_ioctls[] = { | 1526 | struct drm_ioctl_desc i830_ioctls[] = { |
| 1513 | DRM_IOCTL_DEF(DRM_I830_INIT, i830_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), | 1527 | DRM_IOCTL_DEF(DRM_I830_INIT, i830_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY|DRM_UNLOCKED), |
| 1514 | DRM_IOCTL_DEF(DRM_I830_VERTEX, i830_dma_vertex, DRM_AUTH), | 1528 | DRM_IOCTL_DEF(DRM_I830_VERTEX, i830_dma_vertex, DRM_AUTH|DRM_UNLOCKED), |
| 1515 | DRM_IOCTL_DEF(DRM_I830_CLEAR, i830_clear_bufs, DRM_AUTH), | 1529 | DRM_IOCTL_DEF(DRM_I830_CLEAR, i830_clear_bufs, DRM_AUTH|DRM_UNLOCKED), |
| 1516 | DRM_IOCTL_DEF(DRM_I830_FLUSH, i830_flush_ioctl, DRM_AUTH), | 1530 | DRM_IOCTL_DEF(DRM_I830_FLUSH, i830_flush_ioctl, DRM_AUTH|DRM_UNLOCKED), |
| 1517 | DRM_IOCTL_DEF(DRM_I830_GETAGE, i830_getage, DRM_AUTH), | 1531 | DRM_IOCTL_DEF(DRM_I830_GETAGE, i830_getage, DRM_AUTH|DRM_UNLOCKED), |
| 1518 | DRM_IOCTL_DEF(DRM_I830_GETBUF, i830_getbuf, DRM_AUTH), | 1532 | DRM_IOCTL_DEF(DRM_I830_GETBUF, i830_getbuf, DRM_AUTH|DRM_UNLOCKED), |
| 1519 | DRM_IOCTL_DEF(DRM_I830_SWAP, i830_swap_bufs, DRM_AUTH), | 1533 | DRM_IOCTL_DEF(DRM_I830_SWAP, i830_swap_bufs, DRM_AUTH|DRM_UNLOCKED), |
| 1520 | DRM_IOCTL_DEF(DRM_I830_COPY, i830_copybuf, DRM_AUTH), | 1534 | DRM_IOCTL_DEF(DRM_I830_COPY, i830_copybuf, DRM_AUTH|DRM_UNLOCKED), |
| 1521 | DRM_IOCTL_DEF(DRM_I830_DOCOPY, i830_docopy, DRM_AUTH), | 1535 | DRM_IOCTL_DEF(DRM_I830_DOCOPY, i830_docopy, DRM_AUTH|DRM_UNLOCKED), |
| 1522 | DRM_IOCTL_DEF(DRM_I830_FLIP, i830_flip_bufs, DRM_AUTH), | 1536 | DRM_IOCTL_DEF(DRM_I830_FLIP, i830_flip_bufs, DRM_AUTH|DRM_UNLOCKED), |
| 1523 | DRM_IOCTL_DEF(DRM_I830_IRQ_EMIT, i830_irq_emit, DRM_AUTH), | 1537 | DRM_IOCTL_DEF(DRM_I830_IRQ_EMIT, i830_irq_emit, DRM_AUTH|DRM_UNLOCKED), |
| 1524 | DRM_IOCTL_DEF(DRM_I830_IRQ_WAIT, i830_irq_wait, DRM_AUTH), | 1538 | DRM_IOCTL_DEF(DRM_I830_IRQ_WAIT, i830_irq_wait, DRM_AUTH|DRM_UNLOCKED), |
| 1525 | DRM_IOCTL_DEF(DRM_I830_GETPARAM, i830_getparam, DRM_AUTH), | 1539 | DRM_IOCTL_DEF(DRM_I830_GETPARAM, i830_getparam, DRM_AUTH|DRM_UNLOCKED), |
| 1526 | DRM_IOCTL_DEF(DRM_I830_SETPARAM, i830_setparam, DRM_AUTH) | 1540 | DRM_IOCTL_DEF(DRM_I830_SETPARAM, i830_setparam, DRM_AUTH|DRM_UNLOCKED), |
| 1527 | }; | 1541 | }; |
| 1528 | 1542 | ||
| 1529 | int i830_max_ioctl = DRM_ARRAY_SIZE(i830_ioctls); | 1543 | int i830_max_ioctl = DRM_ARRAY_SIZE(i830_ioctls); |
diff --git a/drivers/gpu/drm/i830/i830_drv.c b/drivers/gpu/drm/i830/i830_drv.c index 44f990bed8f4..a5c66aa82f0c 100644 --- a/drivers/gpu/drm/i830/i830_drv.c +++ b/drivers/gpu/drm/i830/i830_drv.c | |||
| @@ -70,7 +70,7 @@ static struct drm_driver driver = { | |||
| 70 | .owner = THIS_MODULE, | 70 | .owner = THIS_MODULE, |
| 71 | .open = drm_open, | 71 | .open = drm_open, |
| 72 | .release = drm_release, | 72 | .release = drm_release, |
| 73 | .unlocked_ioctl = drm_ioctl, | 73 | .unlocked_ioctl = i830_ioctl, |
| 74 | .mmap = drm_mmap, | 74 | .mmap = drm_mmap, |
| 75 | .poll = drm_poll, | 75 | .poll = drm_poll, |
| 76 | .fasync = drm_fasync, | 76 | .fasync = drm_fasync, |
diff --git a/drivers/gpu/drm/i830/i830_drv.h b/drivers/gpu/drm/i830/i830_drv.h index ecfd25a35da3..0df1c720560b 100644 --- a/drivers/gpu/drm/i830/i830_drv.h +++ b/drivers/gpu/drm/i830/i830_drv.h | |||
| @@ -122,6 +122,7 @@ typedef struct drm_i830_private { | |||
| 122 | 122 | ||
| 123 | } drm_i830_private_t; | 123 | } drm_i830_private_t; |
| 124 | 124 | ||
| 125 | long i830_ioctl(struct file *file, unsigned int cmd, unsigned long arg); | ||
| 125 | extern struct drm_ioctl_desc i830_ioctls[]; | 126 | extern struct drm_ioctl_desc i830_ioctls[]; |
| 126 | extern int i830_max_ioctl; | 127 | extern int i830_max_ioctl; |
| 127 | 128 | ||
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 53017ba0ab7b..e2a4da7d7fab 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h | |||
| @@ -52,7 +52,6 @@ | |||
| 52 | #include <linux/platform_device.h> | 52 | #include <linux/platform_device.h> |
| 53 | #include <linux/pci.h> | 53 | #include <linux/pci.h> |
| 54 | #include <linux/jiffies.h> | 54 | #include <linux/jiffies.h> |
| 55 | #include <linux/smp_lock.h> /* For (un)lock_kernel */ | ||
| 56 | #include <linux/dma-mapping.h> | 55 | #include <linux/dma-mapping.h> |
| 57 | #include <linux/mm.h> | 56 | #include <linux/mm.h> |
| 58 | #include <linux/cdev.h> | 57 | #include <linux/cdev.h> |
| @@ -1152,6 +1151,7 @@ extern long drm_compat_ioctl(struct file *filp, | |||
| 1152 | extern int drm_lastclose(struct drm_device *dev); | 1151 | extern int drm_lastclose(struct drm_device *dev); |
| 1153 | 1152 | ||
| 1154 | /* Device support (drm_fops.h) */ | 1153 | /* Device support (drm_fops.h) */ |
| 1154 | extern struct mutex drm_global_mutex; | ||
| 1155 | extern int drm_open(struct inode *inode, struct file *filp); | 1155 | extern int drm_open(struct inode *inode, struct file *filp); |
| 1156 | extern int drm_stub_open(struct inode *inode, struct file *filp); | 1156 | extern int drm_stub_open(struct inode *inode, struct file *filp); |
| 1157 | extern int drm_fasync(int fd, struct file *filp, int on); | 1157 | extern int drm_fasync(int fd, struct file *filp, int on); |
