From 0e125c3e6d2fafd6c2460e1859c29b9ece8b5eed Mon Sep 17 00:00:00 2001 From: Marcin Chrzanowski Date: Sat, 26 May 2018 21:01:28 +0200 Subject: Fix synchronization --- surface.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'surface.c') diff --git a/surface.c b/surface.c index a54ca6f..688223a 100644 --- a/surface.c +++ b/surface.c @@ -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: -- cgit v1.2.3