diff options
author | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2018-05-26 21:01:28 +0200 |
---|---|---|
committer | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2018-05-26 21:01:28 +0200 |
commit | 0e125c3e6d2fafd6c2460e1859c29b9ece8b5eed (patch) | |
tree | 6e531c8c5317f0de19b71fcd7e38dc0235ebf57a /surface.c | |
parent | 911ab1a4ad24fb3c4f6df5c4798a8f2656c09af7 (diff) |
Fix synchronization
Diffstat (limited to 'surface.c')
-rw-r--r-- | surface.c | 20 |
1 files changed, 15 insertions, 5 deletions
@@ -17,7 +17,7 @@ long draw_lines(struct file *filp, unsigned long arg) struct doomdev_surf_ioctl_draw_lines *param; struct doomdev_line *lines; int i; - + surface_data = filp->private_data; param = (struct doomdev_surf_ioctl_draw_lines *) arg; lines = (struct doomdev_line *) param->lines_ptr; @@ -86,6 +86,8 @@ long copy_rects(struct file *filp, unsigned long arg) mutex_unlock(&dst_data->doom_data->cmd_mutex); + fdput(src_fds); + return param->rects_num; } @@ -125,6 +127,8 @@ long draw_columns(struct file *filp, unsigned long arg) mutex_unlock(&surface_data->doom_data->cmd_mutex); + fdput(texture_fds); + return param->columns_num; } @@ -159,9 +163,8 @@ ssize_t surface_read(struct file *filp, char __user *buf, size_t count, count = surface_data->surface_size - *offset; } - mutex_lock(&surface_data->doom_data->ping_mutex); - ping_sync(surface_data->doom_data->iomem); - + mutex_lock(&surface_data->doom_data->cmd_mutex); + ping_sync(surface_data->doom_data); down(&surface_data->doom_data->pong_sem); not_written = copy_to_user(buf, surface_data->surface_cpu + (*offset), @@ -169,7 +172,7 @@ ssize_t surface_read(struct file *filp, char __user *buf, size_t count, *offset += count - not_written; - mutex_unlock(&surface_data->doom_data->ping_mutex); + mutex_unlock(&surface_data->doom_data->cmd_mutex); return count - not_written; } @@ -212,6 +215,11 @@ int surface_release(struct inode *inode, struct file *filp) surface_data = filp->private_data; + mutex_lock(&surface_data->doom_data->ping_mutex); + ping_sync(surface_data->doom_data); + down(&surface_data->doom_data->pong_sem); + mutex_unlock(&surface_data->doom_data->ping_mutex); + free_surface_buffer(surface_data); kfree(surface_data); @@ -346,6 +354,8 @@ int new_surface(struct file *filp, struct doomdev_ioctl_create_surface *params) fd_s.file->f_mode |= FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE; + fdput(fd_s); + return fd; error_fdget: |