Merge "msm: mdss: fix cwb output buffer memory leak"

This commit is contained in:
Linux Build Service Account 2017-01-05 02:09:02 -08:00 committed by Gerrit - the friendly Code Review server
commit 8b24b9db96
3 changed files with 21 additions and 0 deletions

View file

@ -424,6 +424,7 @@ struct mdss_mdp_ctl_intfs_ops {
struct mdss_mdp_cwb {
struct mutex queue_lock;
struct list_head data_queue;
struct list_head cleanup_queue;
int valid;
u32 wb_idx;
struct mdp_output_layer layer;

View file

@ -3565,6 +3565,11 @@ int mdss_mdp_cwb_setup(struct mdss_mdp_ctl *ctl)
goto cwb_setup_fail;
}
/* Add to cleanup list */
mutex_lock(&cwb->queue_lock);
list_add_tail(&cwb_data->next, &mdp5_data->cwb.cleanup_queue);
mutex_unlock(&cwb->queue_lock);
memset(&wb_args, 0, sizeof(wb_args));
wb_args.data = &cwb_data->data;

View file

@ -5873,10 +5873,24 @@ __vsync_retire_get_fence(struct msm_sync_pt_data *sync_pt_data)
static void __cwb_wq_handler(struct work_struct *cwb_work)
{
struct mdss_mdp_cwb *cwb = NULL;
struct mdss_mdp_wb_data *cwb_data = NULL;
cwb = container_of(cwb_work, struct mdss_mdp_cwb, cwb_work);
blocking_notifier_call_chain(&cwb->notifier_head,
MDP_NOTIFY_FRAME_DONE, NULL);
/* free the buffer from cleanup queue */
mutex_lock(&cwb->queue_lock);
cwb_data = list_first_entry_or_null(&cwb->cleanup_queue,
struct mdss_mdp_wb_data, next);
__list_del_entry(&cwb_data->next);
mutex_unlock(&cwb->queue_lock);
if (cwb_data == NULL) {
pr_err("no output buffer for cwb cleanup\n");
return;
}
mdss_mdp_data_free(&cwb_data->data, true, DMA_FROM_DEVICE);
kfree(cwb_data);
}
static int __vsync_set_vsync_handler(struct msm_fb_data_type *mfd)
@ -6107,6 +6121,7 @@ int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd)
mutex_init(&mdp5_data->cwb.queue_lock);
mutex_init(&mdp5_data->cwb.cwb_sync_pt_data.sync_mutex);
INIT_LIST_HEAD(&mdp5_data->cwb.data_queue);
INIT_LIST_HEAD(&mdp5_data->cwb.cleanup_queue);
snprintf(timeline_name, sizeof(timeline_name), "cwb%d", mfd->index);
mdp5_data->cwb.cwb_sync_pt_data.fence_name = "cwb-fence";