video: driver: free children and firmware list memory

To avoid memory leakage, clean children and firmware lists
at session close, error cases, and at the end of each usage.

Change-Id: I1eadbf81da207bd987c50428c0c7cf4967a8885f
Signed-off-by: Akshata Sahukar <asahukar@codeaurora.org>
This commit is contained in:
Akshata Sahukar
2021-04-30 17:08:09 -07:00
parent 401b0010e7
commit ce09f77e44
5 changed files with 41 additions and 5 deletions

View File

@@ -10,11 +10,6 @@
#include "msm_vidc_inst.h"
#include "msm_vidc_internal.h"
enum msm_vidc_ctrl_list_type {
CHILD_LIST = BIT(0),
FW_LIST = BIT(1),
};
int msm_vidc_ctrl_init(struct msm_vidc_inst *inst);
int msm_vidc_ctrl_deinit(struct msm_vidc_inst *inst);
int msm_v4l2_op_s_ctrl(struct v4l2_ctrl *ctrl);

View File

@@ -387,5 +387,7 @@ int msm_vidc_check_session_supported(struct msm_vidc_inst *inst);
int msm_vidc_check_mbps_supported(struct msm_vidc_inst *inst);
int msm_vidc_check_scaling_supported(struct msm_vidc_inst *inst);
const char *buf_name(enum msm_vidc_buffer_type type);
void msm_vidc_free_capabililty_list(struct msm_vidc_inst *inst,
enum msm_vidc_ctrl_list_type list_type);
#endif // _MSM_VIDC_DRIVER_H_

View File

@@ -292,6 +292,11 @@ enum msm_vidc_matrix_coefficients {
MSM_VIDC_MATRIX_COEFF_BT2100 = 14,
};
enum msm_vidc_ctrl_list_type {
CHILD_LIST = BIT(0),
FW_LIST = BIT(1),
};
enum msm_vidc_core_capability_type {
CORE_CAP_NONE = 0,
ENC_CODECS,

View File

@@ -757,6 +757,9 @@ int msm_v4l2_op_s_ctrl(struct v4l2_ctrl *ctrl)
}
exit:
if (rc)
msm_vidc_free_capabililty_list(inst, CHILD_LIST | FW_LIST);
return rc;
}
@@ -1817,6 +1820,9 @@ int msm_vidc_adjust_v4l2_properties(struct msm_vidc_inst *inst)
}
exit:
if (rc)
msm_vidc_free_capabililty_list(inst, CHILD_LIST | FW_LIST);
return rc;
}
@@ -2742,6 +2748,8 @@ int msm_vidc_set_v4l2_properties(struct msm_vidc_inst *inst)
}
exit:
msm_vidc_free_capabililty_list(inst, FW_LIST);
return rc;
}

View File

@@ -2561,6 +2561,31 @@ static void msm_vidc_free_input_cr_list(struct msm_vidc_inst *inst)
INIT_LIST_HEAD(&inst->enc_input_crs);
}
void msm_vidc_free_capabililty_list(struct msm_vidc_inst *inst,
enum msm_vidc_ctrl_list_type list_type)
{
struct msm_vidc_inst_cap_entry *temp = NULL, *next = NULL;
if (list_type & CHILD_LIST) {
list_for_each_entry_safe(temp, next, &inst->children.list, list) {
list_del(&temp->list);
kfree(temp);
}
INIT_LIST_HEAD(&inst->children.list);
}
temp = NULL;
next = NULL;
if (list_type & FW_LIST) {
list_for_each_entry_safe(temp, next, &inst->firmware.list, list) {
list_del(&temp->list);
kfree(temp);
}
INIT_LIST_HEAD(&inst->firmware.list);
}
}
static int msm_vidc_queue_buffer(struct msm_vidc_inst *inst, struct msm_vidc_buffer *buf)
{
struct msm_vidc_buffer *meta;
@@ -4263,6 +4288,7 @@ static void msm_vidc_close_helper(struct kref *kref)
else if (is_encode_session(inst))
msm_venc_inst_deinit(inst);
msm_vidc_free_input_cr_list(inst);
msm_vidc_free_capabililty_list(inst, CHILD_LIST | FW_LIST);
kfree(inst->capabilities);
if (inst->response_workq)
destroy_workqueue(inst->response_workq);