diff options
author | Huang Chaofan <chaofan.huang@nxp.com> | 2018-11-29 11:31:24 +0800 |
---|---|---|
committer | Bryan O'Donoghue <bryan.odonoghue@linaro.org> | 2019-01-25 16:14:21 +0000 |
commit | 61590bd9f4d863427f97ab9567f99ec38578ac7c (patch) | |
tree | 70f06e1755bbbc7f38f07600e027d8ea46e24767 | |
parent | fda71e84d14f6c0552097b97cc4147674ce87da6 (diff) |
MLK-20489 VPU: Add record for kalloc size and correct the judge for
record queue release
Add record for kalloc size and correct the judge for record queue
release
Signed-off-by: Huang Chaofan <chaofan.huang@nxp.com>
-rw-r--r-- | drivers/mxc/vpu-decoder-b0/vpu_b0.c | 22 | ||||
-rw-r--r-- | drivers/mxc/vpu-decoder-b0/vpu_b0.h | 2 | ||||
-rw-r--r-- | drivers/mxc/vpu-decoder-b0/vpu_debug_log.c | 4 |
3 files changed, 24 insertions, 4 deletions
diff --git a/drivers/mxc/vpu-decoder-b0/vpu_b0.c b/drivers/mxc/vpu-decoder-b0/vpu_b0.c index c515b39325e1..ec10bdce0d8e 100644 --- a/drivers/mxc/vpu-decoder-b0/vpu_b0.c +++ b/drivers/mxc/vpu-decoder-b0/vpu_b0.c @@ -1214,6 +1214,7 @@ static int add_scode(struct vpu_ctx *ctx, u_int32 uStrBufIdx, VPU_PADDING_SCODE_ vpu_dbg(LVL_ERR, "error: eos buffer alloc fail\n"); return -1; } + atomic64_add(SCODE_SIZE, &ctx->statistic.total_alloc_size); plbuffer = (uint32_t *)buffer; if (wptr - start < ctx->stream_buffer.dma_size) pbbuffer = (uint8_t *)(ctx->stream_buffer.dma_virt + wptr - start); @@ -1345,6 +1346,7 @@ static int add_scode(struct vpu_ctx *ctx, u_int32 uStrBufIdx, VPU_PADDING_SCODE_ dev->shared_mem.pSharedInterface->pStreamBuffDesc[ctx->str_index][uStrBufIdx] = (VPU_REG_BASE + DEC_MFD_XREG_SLV_BASE + MFD_MCX + MFD_MCX_OFF * ctx->str_index); kfree(buffer); + atomic64_sub(SCODE_SIZE, &ctx->statistic.total_alloc_size); vpu_dbg(LVL_INFO, "%s() done type (%d) MCX address virt=%p, phy=0x%x, index=%d\n", __func__, eScodeType, pStrBufDesc, dev->shared_mem.pSharedInterface->pStreamBuffDesc[ctx->str_index][uStrBufIdx], ctx->str_index); return pad_bytes; @@ -1859,8 +1861,10 @@ static void vpu_api_event_handler(struct vpu_ctx *ctx, u_int32 uStrIdx, u_int32 MediaIPFW_Video_PitchInfo *pStreamPitchInfo = &pSharedInterface->StreamPitchInfo[uStrIdx]; unsigned int num = pSharedInterface->SeqInfoTabDesc.uNumSizeDescriptors; - if (ctx->pSeqinfo == NULL) + if (ctx->pSeqinfo == NULL) { ctx->pSeqinfo = kzalloc(sizeof(MediaIPFW_Video_SeqInfo), GFP_KERNEL); + atomic64_add(sizeof(MediaIPFW_Video_SeqInfo), &ctx->statistic.total_alloc_size); + } else vpu_dbg(LVL_INFO, "pSeqinfo is not NULL, need not to realloc\n"); memcpy(ctx->pSeqinfo, &pSeqInfo[ctx->str_index], sizeof(MediaIPFW_Video_SeqInfo)); @@ -2276,6 +2280,8 @@ static int release_hang_instance(struct vpu_dev *dev) if (dev->ctx[i]) { remove_instance_file(dev->ctx[i]); destroy_log_info_queue(dev->ctx[i]); + if (atomic64_read(&dev->ctx[i]->statistic.total_alloc_size) != 0) + vpu_dbg(LVL_ERR, "error: memory leak for vpu kalloc buffer\n"); kfree(dev->ctx[i]); dev->ctx[i] = NULL; } @@ -2913,6 +2919,8 @@ static int create_instance_file(struct vpu_ctx *ctx) create_instance_buffer_file(ctx); create_instance_dbglog_file(ctx); create_instance_flow_file(ctx); + atomic64_set(&ctx->statistic.total_dma_size, 0); + atomic64_set(&ctx->statistic.total_alloc_size, 0); return 0; } @@ -3027,12 +3035,14 @@ static int v4l2_open(struct file *filp) ctx->b_dis_reorder = false; ctx->start_code_bypass = false; ctx->hang_status = false; + create_instance_file(ctx); ctx->pSeqinfo = kzalloc(sizeof(MediaIPFW_Video_SeqInfo), GFP_KERNEL); if (!ctx->pSeqinfo) { vpu_dbg(LVL_ERR, "error: pSeqinfo alloc fail\n"); ret = -ENOMEM; goto err_alloc_seq; } + atomic64_add(sizeof(MediaIPFW_Video_SeqInfo), &ctx->statistic.total_alloc_size); init_queue_data(ctx); init_log_info_queue(ctx); create_log_info_queue(ctx, vpu_log_depth); @@ -3055,7 +3065,6 @@ static int v4l2_open(struct file *filp) dev->fw_is_ready = true; } mutex_unlock(&dev->dev_mutex); - create_instance_file(ctx); rpc_set_stream_cfg_value(dev->shared_mem.pSharedInterface, ctx->str_index); ret = alloc_vpu_buffer(ctx); if (ret) @@ -3069,8 +3078,10 @@ err_alloc_buffer: init_dma_buffer(&ctx->stream_buffer); init_dma_buffer(&ctx->udata_buffer); err_firmware_load: + destroy_log_info_queue(ctx); kfree(ctx->pSeqinfo); ctx->pSeqinfo = NULL; + atomic64_sub(sizeof(MediaIPFW_Video_SeqInfo), &ctx->statistic.total_alloc_size); release_queue_data(ctx); err_alloc_seq: kfifo_free(&ctx->msg_fifo); @@ -3082,6 +3093,8 @@ err_alloc_wq: v4l2_fh_exit(&ctx->fh); clear_bit(ctx->str_index, &dev->instance_mask); err_find_index: + if (atomic64_read(&ctx->statistic.total_alloc_size) != 0) + vpu_dbg(LVL_ERR, "error: memory leak for vpu kalloc buffer\n"); kfree(ctx); pm_runtime_put_sync(dev->generic_dev); @@ -3123,10 +3136,11 @@ static int v4l2_release(struct file *filp) free_dma_buffer(ctx, &ctx->stream_buffer); free_dma_buffer(ctx, &ctx->udata_buffer); if (atomic64_read(&ctx->statistic.total_dma_size) != 0) - vpu_dbg(LVL_ERR, "error: memory leak for vpu buffer\n"); + vpu_dbg(LVL_ERR, "error: memory leak for vpu dma alloc buffer\n"); if (ctx->pSeqinfo) { kfree(ctx->pSeqinfo); ctx->pSeqinfo = NULL; + atomic64_sub(sizeof(MediaIPFW_Video_SeqInfo), &ctx->statistic.total_alloc_size); } mutex_lock(&ctx->instance_mutex); ctx->ctx_released = true; @@ -3141,6 +3155,8 @@ static int v4l2_release(struct file *filp) if (!ctx->hang_status) { // judge the path is hang or not, if hang, don't clear remove_instance_file(ctx); destroy_log_info_queue(ctx); + if (atomic64_read(&ctx->statistic.total_alloc_size) != 0) + vpu_dbg(LVL_ERR, "error: memory leak for vpu kalloc buffer\n"); clear_bit(ctx->str_index, &dev->instance_mask); dev->ctx[ctx->str_index] = NULL; kfree(ctx); diff --git a/drivers/mxc/vpu-decoder-b0/vpu_b0.h b/drivers/mxc/vpu-decoder-b0/vpu_b0.h index b6c66b35c370..c75ea77abcbc 100644 --- a/drivers/mxc/vpu-decoder-b0/vpu_b0.h +++ b/drivers/mxc/vpu-decoder-b0/vpu_b0.h @@ -231,6 +231,7 @@ struct vpu_statistic { struct timespec ts_cmd; struct timespec ts_event; atomic64_t total_dma_size; + atomic64_t total_alloc_size; }; struct dma_buffer { @@ -244,6 +245,7 @@ struct vpu_ctx { struct v4l2_fh fh; struct vpu_statistic statistic; + atomic64_t total_alloc_size; struct device_attribute dev_attr_instance_command; char command_name[64]; struct device_attribute dev_attr_instance_event; diff --git a/drivers/mxc/vpu-decoder-b0/vpu_debug_log.c b/drivers/mxc/vpu-decoder-b0/vpu_debug_log.c index d26562fa4ba3..766b824ee655 100644 --- a/drivers/mxc/vpu-decoder-b0/vpu_debug_log.c +++ b/drivers/mxc/vpu-decoder-b0/vpu_debug_log.c @@ -44,6 +44,7 @@ int create_log_info_queue(struct vpu_ctx *ctx, u_int32 vpu_log_depth) if (!vpu_info) continue; + atomic64_add(sizeof(*vpu_info), &ctx->statistic.total_alloc_size); list_add_tail(&vpu_info->list, &ctx->log_q); } @@ -64,9 +65,10 @@ int destroy_log_info_queue(struct vpu_ctx *ctx) goto exit; } list_for_each_entry_safe(vpu_info, temp_info, &ctx->log_q, list) - if (!vpu_info) { + if (vpu_info) { list_del_init(&vpu_info->list); kfree(vpu_info); + atomic64_sub(sizeof(*vpu_info), &ctx->statistic.total_alloc_size); } exit: |