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); |