Simplify debugfs token parsing by noticing there is no need to pre- validate the string. We can let the main strsep driven loop skip delimiters and check for the maximum supported number of arguments as it goes through the string.
Signed-off-by: Tvrtko Ursulin <tvrtko.ursu...@igalia.com> --- .../amd/display/amdgpu_dm/amdgpu_dm_debugfs.c | 87 +++++-------------- 1 file changed, 24 insertions(+), 63 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c index a2d6e298489f..c18c4df6126f 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c @@ -73,68 +73,29 @@ static const char *const mst_progress_status[] = { * parameters that could be parsed. * */ -static int parse_write_buffer_into_params(char *wr_buf, - unsigned int wr_buf_size, +static int parse_write_buffer_into_params(char *buf, long *param, unsigned int max_param_num, unsigned int *param_nums) { - const char delimiter[3] = {' ', '\n', '\0'}; - unsigned int wr_buf_count = 0; - unsigned int param_index = 0; - char *wr_buf_ptr = NULL; - char *sub_str = NULL; - int r; + char *token, *tmp = buf; + unsigned int i = 0; - *param_nums = 0; + while ((token = strsep(&tmp, " \n")) != NULL) { + int ret; - wr_buf_ptr = wr_buf; + if (!strlen(token)) + continue; - /* check number of parameters. isspace could not differ space and \n */ - while ((*wr_buf_ptr != 0xa) && (wr_buf_count < wr_buf_size)) { - /* skip space*/ - while (isspace(*wr_buf_ptr) && (wr_buf_count < wr_buf_size)) { - wr_buf_ptr++; - wr_buf_count++; - } - - if (wr_buf_count == wr_buf_size) - break; - - /* skip non-space*/ - while ((!isspace(*wr_buf_ptr)) && (wr_buf_count < wr_buf_size)) { - wr_buf_ptr++; - wr_buf_count++; - } - - (*param_nums)++; - - if (wr_buf_count == wr_buf_size) + if (i == max_param_num) break; - } - if (*param_nums > max_param_num) - *param_nums = max_param_num; - - wr_buf_ptr = wr_buf; /* reset buf pointer */ - wr_buf_count = 0; /* number of char already checked */ - - while (isspace(*wr_buf_ptr) && (wr_buf_count < wr_buf_size)) { - wr_buf_ptr++; - wr_buf_count++; + ret = kstrtol(token, 16, ¶m[i++]); + if (ret) + return ret; } - while (param_index < *param_nums) { - /* after strsep, wr_buf_ptr will be moved to after space */ - sub_str = strsep(&wr_buf_ptr, delimiter); - - r = kstrtol(sub_str, 16, &(param[param_index])); - - if (r) - DRM_DEBUG_DRIVER("string to int convert error code: %d\n", r); - - param_index++; - } + *param_nums = i; return 0; } @@ -271,7 +232,7 @@ static ssize_t dp_link_settings_write(struct file *f, const char __user *buf, if (IS_ERR(wr_buf)) return PTR_ERR(wr_buf); - if (parse_write_buffer_into_params(wr_buf, wr_buf_size, + if (parse_write_buffer_into_params(wr_buf, param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; @@ -403,7 +364,7 @@ static ssize_t dp_mst_link_setting(struct file *f, const char __user *buf, if (IS_ERR(wr_buf)) return PTR_ERR(wr_buf); - if (parse_write_buffer_into_params(wr_buf, wr_buf_size, + if (parse_write_buffer_into_params(wr_buf, param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; @@ -619,7 +580,7 @@ static ssize_t dp_phy_settings_write(struct file *f, const char __user *buf, if (IS_ERR(wr_buf)) return PTR_ERR(wr_buf); - if (parse_write_buffer_into_params(wr_buf, wr_buf_size, + if (parse_write_buffer_into_params(wr_buf, param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; @@ -767,7 +728,7 @@ static ssize_t dp_phy_test_pattern_debugfs_write(struct file *f, const char __us if (IS_ERR(wr_buf)) return PTR_ERR(wr_buf); - if (parse_write_buffer_into_params(wr_buf, wr_buf_size, + if (parse_write_buffer_into_params(wr_buf, param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; @@ -1196,7 +1157,7 @@ static ssize_t dp_dsc_passthrough_set(struct file *f, const char __user *buf, if (IS_ERR(wr_buf)) return PTR_ERR(wr_buf); - if (parse_write_buffer_into_params(wr_buf, wr_buf_size, + if (parse_write_buffer_into_params(wr_buf, ¶m, max_param_num, ¶m_nums)) { kfree(wr_buf); @@ -1435,7 +1396,7 @@ static ssize_t trigger_hotplug(struct file *f, const char __user *buf, if (IS_ERR(wr_buf)) return PTR_ERR(wr_buf); - if (parse_write_buffer_into_params(wr_buf, wr_buf_size, + if (parse_write_buffer_into_params(wr_buf, param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; @@ -1628,7 +1589,7 @@ static ssize_t dp_dsc_clock_en_write(struct file *f, const char __user *buf, if (IS_ERR(wr_buf)) return PTR_ERR(wr_buf); - if (parse_write_buffer_into_params(wr_buf, wr_buf_size, + if (parse_write_buffer_into_params(wr_buf, param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; @@ -1807,7 +1768,7 @@ static ssize_t dp_dsc_slice_width_write(struct file *f, const char __user *buf, if (IS_ERR(wr_buf)) return PTR_ERR(wr_buf); - if (parse_write_buffer_into_params(wr_buf, wr_buf_size, + if (parse_write_buffer_into_params(wr_buf, param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; @@ -1986,7 +1947,7 @@ static ssize_t dp_dsc_slice_height_write(struct file *f, const char __user *buf, if (IS_ERR(wr_buf)) return PTR_ERR(wr_buf); - if (parse_write_buffer_into_params(wr_buf, wr_buf_size, + if (parse_write_buffer_into_params(wr_buf, param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; @@ -2158,7 +2119,7 @@ static ssize_t dp_dsc_bits_per_pixel_write(struct file *f, const char __user *bu if (IS_ERR(wr_buf)) return PTR_ERR(wr_buf); - if (parse_write_buffer_into_params(wr_buf, wr_buf_size, + if (parse_write_buffer_into_params(wr_buf, param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; @@ -2581,7 +2542,7 @@ static ssize_t dp_max_bpc_write(struct file *f, const char __user *buf, if (IS_ERR(wr_buf)) return PTR_ERR(wr_buf); - if (parse_write_buffer_into_params(wr_buf, wr_buf_size, + if (parse_write_buffer_into_params(wr_buf, param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; @@ -3399,7 +3360,7 @@ static ssize_t edp_ilr_write(struct file *f, const char __user *buf, if (IS_ERR(wr_buf)) return PTR_ERR(wr_buf); - if (parse_write_buffer_into_params(wr_buf, wr_buf_size, + if (parse_write_buffer_into_params(wr_buf, param, max_param_num, ¶m_nums)) { kfree(wr_buf); return -EINVAL; -- 2.48.0