From 4b98f5a1ae6ec2b4bba85b6fa56cdc41fcfacc05 Mon Sep 17 00:00:00 2001 From: Govindaraj Rajagopal Date: Wed, 14 Aug 2019 11:28:01 +0530 Subject: [PATCH] msm: vidc: optimize buffer tag allocation - Possiblilty of performance hit due to memory alloc/free at frame level. - Reuse same buffer_tag instead of reallocating. Change-Id: Ifb8efc43907feea4d6da5e8a0bf0aeaa47c8e1d7 Signed-off-by: Govindaraj Rajagopal --- msm/vidc/msm_vidc.c | 2 +- msm/vidc/msm_vidc_common.c | 64 ++++++++++++++++++++------------------ msm/vidc/msm_vidc_common.h | 2 +- 3 files changed, 36 insertions(+), 32 deletions(-) diff --git a/msm/vidc/msm_vidc.c b/msm/vidc/msm_vidc.c index a77421da93e8..14f58f89e547 100644 --- a/msm/vidc/msm_vidc.c +++ b/msm/vidc/msm_vidc.c @@ -1776,7 +1776,7 @@ static void msm_vidc_cleanup_instance(struct msm_vidc_inst *inst) dprintk(VIDC_ERR, "Failed to release input_tag buffers\n"); - msm_comm_release_client_data(inst); + msm_comm_release_client_data(inst, true); msm_comm_release_window_data(inst); diff --git a/msm/vidc/msm_vidc_common.c b/msm/vidc/msm_vidc_common.c index f6b984f2dcc4..bf2c52235232 100644 --- a/msm/vidc/msm_vidc_common.c +++ b/msm/vidc/msm_vidc_common.c @@ -2115,7 +2115,8 @@ static void handle_session_flush(enum hal_command_response cmd, void *data) if (flush_type == HAL_FLUSH_ALL) { msm_comm_clear_window_data(inst); - msm_comm_release_client_data(inst); + msm_comm_release_client_data(inst, false); + inst->clk_data.buffer_counter = 0; } dprintk(VIDC_HIGH, @@ -6973,7 +6974,7 @@ bool kref_get_mbuf(struct msm_vidc_inst *inst, struct msm_vidc_buffer *mbuf) struct msm_vidc_client_data *msm_comm_store_client_data( struct msm_vidc_inst *inst, u32 itag) { - struct msm_vidc_client_data *data = NULL; + struct msm_vidc_client_data *data = NULL, *temp = NULL; if (!inst) { dprintk(VIDC_ERR, "%s: invalid params %pK %un", @@ -6982,10 +6983,20 @@ struct msm_vidc_client_data *msm_comm_store_client_data( } mutex_lock(&inst->client_data.lock); - data = kzalloc(sizeof(*data), GFP_KERNEL); + list_for_each_entry(temp, &inst->client_data.list, list) { + if (!temp->id) { + data = temp; + break; + } + } if (!data) { - dprintk(VIDC_ERR, "No memory left to allocate tag data"); - goto exit; + data = kzalloc(sizeof(*data), GFP_KERNEL); + if (!data) { + dprintk(VIDC_ERR, "No memory avilable - tag data"); + goto exit; + } + INIT_LIST_HEAD(&data->list); + list_add_tail(&data->list, &inst->client_data.list); } /** @@ -6995,10 +7006,8 @@ struct msm_vidc_client_data *msm_comm_store_client_data( if (!inst->etb_counter) inst->etb_counter = 1; - INIT_LIST_HEAD(&data->list); data->id = inst->etb_counter++; data->input_tag = itag; - list_add_tail(&data->list, &inst->client_data.list); exit: mutex_unlock(&inst->client_data.lock); @@ -7017,33 +7026,25 @@ void msm_comm_fetch_client_data(struct msm_vidc_inst *inst, bool remove, __func__, inst, otag, otag2); return; } - + /** + * Some interlace clips, both BF & TF is available in single ETB buffer. + * In that case, firmware copies same input_tag value to both input_tag + * and input_tag2 at FBD. + */ + if (!itag2 || itag == itag2) + found_itag2 = true; mutex_lock(&inst->client_data.lock); list_for_each_entry_safe(temp, next, &inst->client_data.list, list) { if (temp->id == itag) { *otag = temp->input_tag; - if (remove) { - list_del(&temp->list); - kfree(temp); - } found_itag = true; - /** - * Some interlace clips, both BF & TP is available in - * single ETB buffer. In that case, firmware copies - * same input_tag value to both input_tag and - * input_tag2 at FBD. - */ - if (!itag2 || itag == itag2) { - found_itag2 = true; - break; - } - } else if (temp->id == itag2) { + if (remove) + temp->id = 0; + } else if (!found_itag2 && temp->id == itag2) { *otag2 = temp->input_tag; found_itag2 = true; - if (remove) { - list_del(&temp->list); - kfree(temp); - } + if (remove) + temp->id = 0; } if (found_itag && found_itag2) break; @@ -7056,7 +7057,7 @@ void msm_comm_fetch_client_data(struct msm_vidc_inst *inst, bool remove, } } -void msm_comm_release_client_data(struct msm_vidc_inst *inst) +void msm_comm_release_client_data(struct msm_vidc_inst *inst, bool remove) { struct msm_vidc_client_data *temp, *next; @@ -7068,8 +7069,11 @@ void msm_comm_release_client_data(struct msm_vidc_inst *inst) mutex_lock(&inst->client_data.lock); list_for_each_entry_safe(temp, next, &inst->client_data.list, list) { - list_del(&temp->list); - kfree(temp); + temp->id = 0; + if (remove) { + list_del(&temp->list); + kfree(temp); + } } mutex_unlock(&inst->client_data.lock); } diff --git a/msm/vidc/msm_vidc_common.h b/msm/vidc/msm_vidc_common.h index e854cd3abf3d..c6e5758b7267 100644 --- a/msm/vidc/msm_vidc_common.h +++ b/msm/vidc/msm_vidc_common.h @@ -315,7 +315,7 @@ struct msm_vidc_client_data *msm_comm_store_client_data( struct msm_vidc_inst *inst, u32 itag); void msm_comm_fetch_client_data(struct msm_vidc_inst *inst, bool remove, u32 itag, u32 itag2, u32 *mdata, u32 *mtarget); -void msm_comm_release_client_data(struct msm_vidc_inst *inst); +void msm_comm_release_client_data(struct msm_vidc_inst *inst, bool remove); int msm_comm_qbufs_batch(struct msm_vidc_inst *inst, struct msm_vidc_buffer *mbuf); int msm_comm_qbuf_decode_batch(struct msm_vidc_inst *inst,