mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2026-05-07 06:28:04 +02:00
Remove i810 vma stuff (fixes bug)
This commit is contained in:
parent
819711ede5
commit
597850549c
5 changed files with 19 additions and 104 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue