From 89eba5eb77bbf92ffed6686c951cc35f4027e71f Mon Sep 17 00:00:00 2001 From: Ralf Baechle Date: Thu, 27 Jul 2000 23:20:03 +0000 Subject: Merge with Linux 2.4.0-test5-pre5. --- drivers/char/drm/i810_dma.c | 17 +++++++++++++---- drivers/char/drm/i810_drv.c | 14 ++++++++++---- drivers/char/drm/mga_drv.c | 14 ++++++++++---- drivers/char/drm/r128_drv.c | 14 ++++++++++---- drivers/char/drm/vm.c | 15 ++++++++++++--- 5 files changed, 55 insertions(+), 19 deletions(-) (limited to 'drivers/char/drm') diff --git a/drivers/char/drm/i810_dma.c b/drivers/char/drm/i810_dma.c index 901be5593..2882ca09c 100644 --- a/drivers/char/drm/i810_dma.c +++ b/drivers/char/drm/i810_dma.c @@ -35,6 +35,8 @@ #include "i810_drv.h" #include /* For task queue support */ +#include +#include /* in case we don't have a 2.3.99-pre6 kernel or later: */ #ifndef VM_DONTCOPY @@ -157,15 +159,22 @@ static struct file_operations i810_buffer_fops = { int i810_mmap_buffers(struct file *filp, struct vm_area_struct *vma) { drm_file_t *priv = filp->private_data; - drm_device_t *dev = priv->dev; - drm_i810_private_t *dev_priv = dev->dev_private; - drm_buf_t *buf = dev_priv->mmap_buffer; - drm_i810_buf_priv_t *buf_priv = buf->dev_private; + drm_device_t *dev; + drm_i810_private_t *dev_priv; + drm_buf_t *buf; + drm_i810_buf_priv_t *buf_priv; + + lock_kernel(); + dev = priv->dev; + dev_priv = dev->dev_private; + buf = dev_priv->mmap_buffer; + buf_priv = buf->dev_private; vma->vm_flags |= (VM_IO | VM_DONTCOPY); vma->vm_file = filp; buf_priv->currently_mapped = I810_BUF_MAPPED; + unlock_kernel(); if (remap_page_range(vma->vm_start, VM_OFFSET(vma), diff --git a/drivers/char/drm/i810_drv.c b/drivers/char/drm/i810_drv.c index d8c49a57d..f212f2bf2 100644 --- a/drivers/char/drm/i810_drv.c +++ b/drivers/char/drm/i810_drv.c @@ -35,6 +35,8 @@ #endif #include "drmP.h" #include "i810_drv.h" +#include +#include EXPORT_SYMBOL(i810_init); @@ -484,9 +486,11 @@ int i810_open(struct inode *inode, struct file *filp) int i810_release(struct inode *inode, struct file *filp) { drm_file_t *priv = filp->private_data; - drm_device_t *dev = priv->dev; + drm_device_t *dev; int retcode = 0; + lock_kernel(); + dev = priv->dev; DRM_DEBUG("pid = %d, device = 0x%x, open_count = %d\n", current->pid, dev->device, dev->open_count); @@ -557,12 +561,14 @@ int i810_release(struct inode *inode, struct file *filp) atomic_read(&dev->ioctl_count), dev->blocked); spin_unlock(&dev->count_lock); + unlock_kernel(); return -EBUSY; } spin_unlock(&dev->count_lock); - return i810_takedown(dev); - } - spin_unlock(&dev->count_lock); + retcode = i810_takedown(dev); + } else + spin_unlock(&dev->count_lock); + unlock_kernel(); return retcode; } diff --git a/drivers/char/drm/mga_drv.c b/drivers/char/drm/mga_drv.c index 30c8880fb..a3072c39e 100644 --- a/drivers/char/drm/mga_drv.c +++ b/drivers/char/drm/mga_drv.c @@ -36,6 +36,8 @@ #endif #include "drmP.h" #include "mga_drv.h" +#include +#include EXPORT_SYMBOL(mga_init); EXPORT_SYMBOL(mga_cleanup); @@ -498,9 +500,11 @@ int mga_open(struct inode *inode, struct file *filp) int mga_release(struct inode *inode, struct file *filp) { drm_file_t *priv = filp->private_data; - drm_device_t *dev = priv->dev; + drm_device_t *dev; int retcode = 0; + lock_kernel(); + dev = priv->dev; DRM_DEBUG("pid = %d, device = 0x%x, open_count = %d\n", current->pid, dev->device, dev->open_count); @@ -571,12 +575,14 @@ int mga_release(struct inode *inode, struct file *filp) atomic_read(&dev->ioctl_count), dev->blocked); spin_unlock(&dev->count_lock); + unlock_kernel(); return -EBUSY; } spin_unlock(&dev->count_lock); - return mga_takedown(dev); - } - spin_unlock(&dev->count_lock); + retcode = mga_takedown(dev); + } else + spin_unlock(&dev->count_lock); + unlock_kernel(); return retcode; } diff --git a/drivers/char/drm/r128_drv.c b/drivers/char/drm/r128_drv.c index e78d0231f..3e3ace345 100644 --- a/drivers/char/drm/r128_drv.c +++ b/drivers/char/drm/r128_drv.c @@ -35,6 +35,8 @@ #endif #include "drmP.h" #include "r128_drv.h" +#include +#include EXPORT_SYMBOL(r128_init); EXPORT_SYMBOL(r128_cleanup); @@ -474,9 +476,11 @@ int r128_open(struct inode *inode, struct file *filp) int r128_release(struct inode *inode, struct file *filp) { drm_file_t *priv = filp->private_data; - drm_device_t *dev = priv->dev; + drm_device_t *dev; int retcode = 0; + lock_kernel(); + dev = priv->dev; DRM_DEBUG("open_count = %d\n", dev->open_count); if (!(retcode = drm_release(inode, filp))) { MOD_DEC_USE_COUNT; @@ -488,13 +492,15 @@ int r128_release(struct inode *inode, struct file *filp) atomic_read(&dev->ioctl_count), dev->blocked); spin_unlock(&dev->count_lock); + unlock_kernel(); return -EBUSY; } spin_unlock(&dev->count_lock); - return r128_takedown(dev); - } - spin_unlock(&dev->count_lock); + retcode = r128_takedown(dev); + } else + spin_unlock(&dev->count_lock); } + unlock_kernel(); return retcode; } diff --git a/drivers/char/drm/vm.c b/drivers/char/drm/vm.c index 9dfd0d2b0..8469097a7 100644 --- a/drivers/char/drm/vm.c +++ b/drivers/char/drm/vm.c @@ -31,6 +31,8 @@ #define __NO_VERSION__ #include "drmP.h" +#include +#include struct vm_operations_struct drm_vm_ops = { nopage: drm_vm_nopage, @@ -193,15 +195,22 @@ void drm_vm_close(struct vm_area_struct *vma) int drm_mmap_dma(struct file *filp, struct vm_area_struct *vma) { drm_file_t *priv = filp->private_data; - drm_device_t *dev = priv->dev; - drm_device_dma_t *dma = dev->dma; + drm_device_t *dev; + drm_device_dma_t *dma; unsigned long length = vma->vm_end - vma->vm_start; + lock_kernel(); + dev = priv->dev; + dma = dev->dma; DRM_DEBUG("start = 0x%lx, end = 0x%lx, offset = 0x%lx\n", vma->vm_start, vma->vm_end, VM_OFFSET(vma)); /* Length must match exact page count */ - if ((length >> PAGE_SHIFT) != dma->page_count) return -EINVAL; + if ((length >> PAGE_SHIFT) != dma->page_count) { + unlock_kernel(); + return -EINVAL; + } + unlock_kernel(); vma->vm_ops = &drm_vm_dma_ops; vma->vm_flags |= VM_LOCKED | VM_SHM; /* Don't swap */ -- cgit v1.2.3