Remove i810 vma stuff (fixes bug)

This commit is contained in:
Jeff Hartmann 2000-04-22 21:03:38 +00:00
parent 819711ede5
commit 597850549c
5 changed files with 19 additions and 104 deletions

View file

@ -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(&current->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(&current->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;
}
}
}

View file

@ -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{

View file

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

View file

@ -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(&current->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(&current->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;
}
}
}

View file

@ -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{