From 597850549c6724283e79a9f35ea59b466fee685f Mon Sep 17 00:00:00 2001 From: Jeff Hartmann Date: Sat, 22 Apr 2000 21:03:38 +0000 Subject: [PATCH] Remove i810 vma stuff (fixes bug) --- linux-core/i810_dma.c | 60 ++++++------------------------------------- linux-core/i810_drv.h | 1 + linux/i810_bufs.c | 1 + linux/i810_dma.c | 60 ++++++------------------------------------- linux/i810_drv.h | 1 + 5 files changed, 19 insertions(+), 104 deletions(-) diff --git a/linux-core/i810_dma.c b/linux-core/i810_dma.c index 364374e2..182d3e26 100644 --- a/linux-core/i810_dma.c +++ b/linux-core/i810_dma.c @@ -150,71 +150,23 @@ static struct file_operations i810_buffer_fops = { poll: drm_poll, }; -/* These handle currently mapped */ -void drm_i810_vm_open(struct vm_area_struct *vma) -{ - drm_file_t *priv = vma->vm_file->private_data; - drm_device_t *dev = priv->dev; - drm_buf_t *buf = vma->vm_private_data; - drm_i810_buf_priv_t *buf_priv; - - if(!buf) goto out_vm_open; - buf_priv = buf->dev_private; - if(!buf_priv) goto out_vm_open; - buf_priv->map_count++; - if(buf_priv->map_count == 1) { - buf_priv->currently_mapped = I810_BUF_MAPPED; - } - -out_vm_open: - atomic_inc(&dev->vma_count); - MOD_INC_USE_COUNT; -} - -void drm_i810_vm_close(struct vm_area_struct *vma) -{ - drm_file_t *priv = vma->vm_file->private_data; - drm_device_t *dev = priv->dev; - drm_buf_t *buf = vma->vm_private_data; - drm_i810_buf_priv_t *buf_priv; - - if(!buf) goto out_vm_close; - buf_priv = buf->dev_private; - if(!buf_priv) goto out_vm_close; - buf_priv->map_count--; - if(buf_priv->map_count == 0) { - buf_priv->currently_mapped = I810_BUF_UNMAPPED; - buf_priv->virtual = 0; - } - -out_vm_close: - MOD_DEC_USE_COUNT; - atomic_dec(&dev->vma_count); -} - -struct vm_operations_struct drm_i810_vm_ops = { - nopage: drm_vm_nopage, - open: drm_i810_vm_open, - close: drm_i810_vm_close, -}; - 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; + vma->vm_flags |= (VM_IO | VM_DONTCOPY); - vma->vm_ops = &drm_i810_vm_ops; - vma->vm_private_data = buf; vma->vm_file = filp; + + buf_priv->currently_mapped = I810_BUF_MAPPED; if (remap_page_range(vma->vm_start, VM_OFFSET(vma), vma->vm_end - vma->vm_start, vma->vm_page_prot)) return -EAGAIN; - vma->vm_ops->open(vma); return 0; } @@ -257,6 +209,8 @@ static int i810_unmap_buffer(drm_buf_t *buf) down(¤t->mm->mmap_sem); retcode = do_munmap((unsigned long)buf_priv->virtual, (size_t) buf->total); + buf_priv->currently_mapped = I810_BUF_UNMAPPED; + buf_priv->virtual = 0; up(¤t->mm->mmap_sem); return retcode; @@ -1163,6 +1117,8 @@ void i810_reclaim_buffers(drm_device_t *dev, pid_t pid) if (used == I810_BUF_CLIENT) DRM_DEBUG("reclaimed from client\n"); + if(buf_priv->currently_mapped == I810_BUF_MAPPED) + buf_priv->currently_mapped = I810_BUF_UNMAPPED; } } } diff --git a/linux-core/i810_drv.h b/linux-core/i810_drv.h index 38e8a92b..334cacb2 100644 --- a/linux-core/i810_drv.h +++ b/linux-core/i810_drv.h @@ -39,6 +39,7 @@ typedef struct drm_i810_buf_priv { void *virtual; void *kernel_virtual; int map_count; + struct vm_area_struct *vma; } drm_i810_buf_priv_t; typedef struct _drm_i810_ring_buffer{ diff --git a/linux/i810_bufs.c b/linux/i810_bufs.c index 5215f135..9737ae92 100644 --- a/linux/i810_bufs.c +++ b/linux/i810_bufs.c @@ -120,6 +120,7 @@ int i810_addbufs_agp(struct inode *inode, struct file *filp, unsigned int cmd, buf->dev_private = drm_alloc(sizeof(drm_i810_buf_priv_t), DRM_MEM_BUFS); buf->dev_priv_size = sizeof(drm_i810_buf_priv_t); + memset(buf->dev_private, 0, sizeof(drm_i810_buf_priv_t)); #if DRM_DMA_HISTOGRAM buf->time_queued = 0; diff --git a/linux/i810_dma.c b/linux/i810_dma.c index 364374e2..182d3e26 100644 --- a/linux/i810_dma.c +++ b/linux/i810_dma.c @@ -150,71 +150,23 @@ static struct file_operations i810_buffer_fops = { poll: drm_poll, }; -/* These handle currently mapped */ -void drm_i810_vm_open(struct vm_area_struct *vma) -{ - drm_file_t *priv = vma->vm_file->private_data; - drm_device_t *dev = priv->dev; - drm_buf_t *buf = vma->vm_private_data; - drm_i810_buf_priv_t *buf_priv; - - if(!buf) goto out_vm_open; - buf_priv = buf->dev_private; - if(!buf_priv) goto out_vm_open; - buf_priv->map_count++; - if(buf_priv->map_count == 1) { - buf_priv->currently_mapped = I810_BUF_MAPPED; - } - -out_vm_open: - atomic_inc(&dev->vma_count); - MOD_INC_USE_COUNT; -} - -void drm_i810_vm_close(struct vm_area_struct *vma) -{ - drm_file_t *priv = vma->vm_file->private_data; - drm_device_t *dev = priv->dev; - drm_buf_t *buf = vma->vm_private_data; - drm_i810_buf_priv_t *buf_priv; - - if(!buf) goto out_vm_close; - buf_priv = buf->dev_private; - if(!buf_priv) goto out_vm_close; - buf_priv->map_count--; - if(buf_priv->map_count == 0) { - buf_priv->currently_mapped = I810_BUF_UNMAPPED; - buf_priv->virtual = 0; - } - -out_vm_close: - MOD_DEC_USE_COUNT; - atomic_dec(&dev->vma_count); -} - -struct vm_operations_struct drm_i810_vm_ops = { - nopage: drm_vm_nopage, - open: drm_i810_vm_open, - close: drm_i810_vm_close, -}; - 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; + vma->vm_flags |= (VM_IO | VM_DONTCOPY); - vma->vm_ops = &drm_i810_vm_ops; - vma->vm_private_data = buf; vma->vm_file = filp; + + buf_priv->currently_mapped = I810_BUF_MAPPED; if (remap_page_range(vma->vm_start, VM_OFFSET(vma), vma->vm_end - vma->vm_start, vma->vm_page_prot)) return -EAGAIN; - vma->vm_ops->open(vma); return 0; } @@ -257,6 +209,8 @@ static int i810_unmap_buffer(drm_buf_t *buf) down(¤t->mm->mmap_sem); retcode = do_munmap((unsigned long)buf_priv->virtual, (size_t) buf->total); + buf_priv->currently_mapped = I810_BUF_UNMAPPED; + buf_priv->virtual = 0; up(¤t->mm->mmap_sem); return retcode; @@ -1163,6 +1117,8 @@ void i810_reclaim_buffers(drm_device_t *dev, pid_t pid) if (used == I810_BUF_CLIENT) DRM_DEBUG("reclaimed from client\n"); + if(buf_priv->currently_mapped == I810_BUF_MAPPED) + buf_priv->currently_mapped = I810_BUF_UNMAPPED; } } } diff --git a/linux/i810_drv.h b/linux/i810_drv.h index 38e8a92b..334cacb2 100644 --- a/linux/i810_drv.h +++ b/linux/i810_drv.h @@ -39,6 +39,7 @@ typedef struct drm_i810_buf_priv { void *virtual; void *kernel_virtual; int map_count; + struct vm_area_struct *vma; } drm_i810_buf_priv_t; typedef struct _drm_i810_ring_buffer{