Skip to content

Commit

Permalink
msm: mdss: Don't allocate memory dynamically for small layer buffers
Browse files Browse the repository at this point in the history
There's no reason to dynamically allocate memory for a single, small
struct instance (output_layer) when it can be allocated on the stack.
Additionally, layer_list and validate_info_list are limited by the
maximum number of layers allowed, so they can be replaced by stack
allocations.

Signed-off-by: Sultan Alsawaf <sultan@kerneltoast.com>
  • Loading branch information
kerneltoast committed Aug 21, 2019
1 parent d2690bf commit 87aba57
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 40 deletions.
28 changes: 6 additions & 22 deletions drivers/video/fbdev/msm/mdss_fb.c
Original file line number Diff line number Diff line change
Expand Up @@ -4645,9 +4645,9 @@ static int mdss_fb_atomic_commit_ioctl(struct fb_info *info,
int ret, i = 0, j = 0, rc;
struct mdp_layer_commit commit;
u32 buffer_size, layer_count;
struct mdp_input_layer *layer, *layer_list = NULL;
struct mdp_input_layer *layer, layer_list[MAX_LAYER_COUNT];
struct mdp_input_layer __user *input_layer_list;
struct mdp_output_layer *output_layer = NULL;
struct mdp_output_layer output_layer;
struct mdp_output_layer __user *output_layer_user;
struct mdp_destination_scaler_data __user *ds_data_user;
struct mdp_destination_scaler_data ds_data[2];
Expand All @@ -4661,20 +4661,13 @@ static int mdss_fb_atomic_commit_ioctl(struct fb_info *info,

output_layer_user = commit.commit_v1.output_layer;
if (output_layer_user) {
buffer_size = sizeof(struct mdp_output_layer);
output_layer = kzalloc(buffer_size, GFP_KERNEL);
if (!output_layer) {
pr_err("unable to allocate memory for output layer\n");
return -ENOMEM;
}

ret = copy_from_user(output_layer,
output_layer_user, buffer_size);
ret = copy_from_user(&output_layer, output_layer_user,
sizeof(output_layer));
if (ret) {
pr_err("layer list copy from user failed\n");
goto err;
}
commit.commit_v1.output_layer = output_layer;
commit.commit_v1.output_layer = &output_layer;
}

layer_count = commit.commit_v1.input_layer_cnt;
Expand All @@ -4685,13 +4678,6 @@ static int mdss_fb_atomic_commit_ioctl(struct fb_info *info,
goto err;
} else if (layer_count) {
buffer_size = sizeof(struct mdp_input_layer) * layer_count;
layer_list = kzalloc(buffer_size, GFP_KERNEL);
if (!layer_list) {
pr_err("unable to allocate memory for layers\n");
ret = -ENOMEM;
goto err;
}

ret = copy_from_user(layer_list, input_layer_list, buffer_size);
if (ret) {
pr_err("layer list copy from user failed\n");
Expand Down Expand Up @@ -4767,7 +4753,7 @@ static int mdss_fb_atomic_commit_ioctl(struct fb_info *info,

if (output_layer_user) {
rc = copy_to_user(&output_layer_user->buffer.fence,
&output_layer->buffer.fence,
&output_layer.buffer.fence,
sizeof(int));

if (rc)
Expand All @@ -4780,8 +4766,6 @@ static int mdss_fb_atomic_commit_ioctl(struct fb_info *info,
layer_list[i].scale = NULL;
mdss_mdp_free_layer_pp_info(&layer_list[i]);
}
kfree(layer_list);
kfree(output_layer);

return ret;
}
Expand Down
26 changes: 8 additions & 18 deletions drivers/video/fbdev/msm/mdss_mdp_layer.c
Original file line number Diff line number Diff line change
Expand Up @@ -2364,7 +2364,7 @@ static int __validate_layers(struct msm_fb_data_type *mfd,

struct mdss_mdp_mixer *mixer = NULL;
struct mdp_input_layer *layer, *layer_list;
struct mdss_mdp_validate_info_t *validate_info_list = NULL;
struct mdss_mdp_validate_info_t validate_info_list[MAX_LAYER_COUNT];
bool is_single_layer = false, force_validate;
enum layer_pipe_q pipe_q_type;
enum layer_zorder_used zorder_used[MDSS_MDP_MAX_STAGE] = {0};
Expand All @@ -2380,13 +2380,8 @@ static int __validate_layers(struct msm_fb_data_type *mfd,
goto validate_skip;

layer_list = commit->input_layers;

validate_info_list = kcalloc(layer_count, sizeof(*validate_info_list),
GFP_KERNEL);
if (!validate_info_list) {
ret = -ENOMEM;
goto end;
}
memset(validate_info_list, 0,
sizeof(*validate_info_list) * layer_count);

for (i = 0; i < layer_count; i++) {
if (layer_list[i].dst_rect.x >= left_lm_w)
Expand Down Expand Up @@ -2677,7 +2672,6 @@ static int __validate_layers(struct msm_fb_data_type *mfd,
}
mutex_unlock(&mdp5_data->list_lock);
end:
kfree(validate_info_list);
mutex_unlock(&mdp5_data->ov_lock);

pr_debug("fb%d validated layers =%d\n", mfd->index, i);
Expand Down Expand Up @@ -2713,6 +2707,7 @@ int __is_cwb_requested(uint32_t commit_flags)
int mdss_mdp_layer_pre_commit(struct msm_fb_data_type *mfd,
struct file *file, struct mdp_layer_commit_v1 *commit)
{
struct mdss_mdp_validate_info_t validate_info_list[MAX_LAYER_COUNT];
int ret, i;
int layer_count = commit->input_layer_cnt;
bool validate_failed = false;
Expand All @@ -2721,7 +2716,6 @@ int mdss_mdp_layer_pre_commit(struct msm_fb_data_type *mfd,
struct mdp_input_layer *layer_list;
struct mdss_overlay_private *mdp5_data;
struct mdss_mdp_data *src_data[MDSS_MDP_MAX_SSPP];
struct mdss_mdp_validate_info_t *validate_info_list;
struct mdss_mdp_ctl *sctl = NULL;

mdp5_data = mfd_to_mdp5_data(mfd);
Expand Down Expand Up @@ -2762,10 +2756,8 @@ int mdss_mdp_layer_pre_commit(struct msm_fb_data_type *mfd,
return 0;
}

validate_info_list = kcalloc(layer_count, sizeof(*validate_info_list),
GFP_KERNEL);
if (!validate_info_list)
return -ENOMEM;
memset(validate_info_list, 0,
sizeof(*validate_info_list) * layer_count);

for (i = 0; i < layer_count; i++) {
if (!validate_info_list[i].layer) {
Expand All @@ -2774,7 +2766,7 @@ int mdss_mdp_layer_pre_commit(struct msm_fb_data_type *mfd,
if (IS_ERR_VALUE(ret)) {
pr_err("error updating multirect config. ret=%d i=%d\n",
ret, i);
goto end;
return ret;
}
}
}
Expand All @@ -2792,7 +2784,7 @@ int mdss_mdp_layer_pre_commit(struct msm_fb_data_type *mfd,
ret = __validate_layers(mfd, file, commit);
if (ret) {
pr_err("__validate_layers failed. rc=%d\n", ret);
goto end;
return ret;
}
} else {
/*
Expand Down Expand Up @@ -2862,8 +2854,6 @@ int mdss_mdp_layer_pre_commit(struct msm_fb_data_type *mfd,
mdss_mdp_overlay_buf_free(mfd, src_data[i]);
mutex_unlock(&mdp5_data->list_lock);
}
end:
kfree(validate_info_list);

return ret;
}
Expand Down

0 comments on commit 87aba57

Please sign in to comment.