diff options
| -rw-r--r-- | drivers/media/platform/msm/camera_v2/isp/msm_isp.c | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp.c index 23f936258660..22eb86f4f875 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp.c @@ -53,7 +53,6 @@ MODULE_DEVICE_TABLE(of, msm_vfe_dt_match); #define MAX_OVERFLOW_COUNTERS 29 #define OVERFLOW_LENGTH 1024 #define OVERFLOW_BUFFER_LENGTH 64 -static char stat_line[OVERFLOW_LENGTH]; struct msm_isp_statistics stats; struct msm_isp_ub_info ub_info; @@ -113,19 +112,30 @@ static int vfe_debugfs_statistics_open(struct inode *inode, struct file *file) return 0; } -static ssize_t vfe_debugfs_statistics_read(struct file *t_file, char *t_char, - size_t t_size_t, loff_t *t_loff_t) +static ssize_t vfe_debugfs_statistics_read(struct file *t_file, + char __user *t_char, size_t t_size_t, loff_t *t_loff_t) { int i; + size_t rc; uint64_t *ptr; char buffer[OVERFLOW_BUFFER_LENGTH] = {0}; + char *stat_line; struct vfe_device *vfe_dev = (struct vfe_device *) t_file->private_data; - struct msm_isp_statistics *stats = vfe_dev->stats; + struct msm_isp_statistics *stats; - memset(stat_line, 0, sizeof(stat_line)); + stat_line = kzalloc(OVERFLOW_LENGTH, GFP_KERNEL); + if (!stat_line) + return -ENOMEM; + spin_lock(&vfe_dev->common_data->common_dev_data_lock); + stats = vfe_dev->stats; msm_isp_util_get_bandwidth_stats(vfe_dev, stats); + spin_unlock(&vfe_dev->common_data->common_dev_data_lock); ptr = (uint64_t *)(stats); + if (MAX_OVERFLOW_COUNTERS > OVERFLOW_LENGTH) { + kfree(stat_line); + return -EINVAL; + } for (i = 0; i < MAX_OVERFLOW_COUNTERS; i++) { strlcat(stat_line, stats_str[i], sizeof(stat_line)); strlcat(stat_line, " ", sizeof(stat_line)); @@ -133,8 +143,10 @@ static ssize_t vfe_debugfs_statistics_read(struct file *t_file, char *t_char, strlcat(stat_line, buffer, sizeof(stat_line)); strlcat(stat_line, "\r\n", sizeof(stat_line)); } - return simple_read_from_buffer(t_char, t_size_t, + rc = simple_read_from_buffer(t_char, t_size_t, t_loff_t, stat_line, strlen(stat_line)); + kfree(stat_line); + return rc; } static ssize_t vfe_debugfs_statistics_write(struct file *t_file, @@ -142,8 +154,12 @@ static ssize_t vfe_debugfs_statistics_write(struct file *t_file, { struct vfe_device *vfe_dev = (struct vfe_device *) t_file->private_data; - struct msm_isp_statistics *stats = vfe_dev->stats; + struct msm_isp_statistics *stats; + + spin_lock(&vfe_dev->common_data->common_dev_data_lock); + stats = vfe_dev->stats; memset(stats, 0, sizeof(struct msm_isp_statistics)); + spin_unlock(&vfe_dev->common_data->common_dev_data_lock); return sizeof(struct msm_isp_statistics); } |
