Skip to content

Commit 4907545

Browse files
Dikshita Agarwalgregkh
authored andcommitted
media: iris: Verify internal buffer release on close
commit d2abb1f upstream. Validate all internal buffers queued to firmware are released back to driver on close. This helps ensure buffer lifecycle correctness and aids in debugging any resporce leaks. Cc: stable@vger.kernel.org Fixes: 73702f4 ("media: iris: allocate, initialize and queue internal buffers") Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8550-QRD Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8550-HDK Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8650-QRD Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8650-HDK Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com> Tested-by: Vikash Garodia <quic_vgarodia@quicinc.com> # on sa8775p-ride Signed-off-by: Bryan O'Donoghue <bod@kernel.org> Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent b4cb178 commit 4907545

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

drivers/media/platform/qcom/iris/iris_vidc.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,33 @@ static void iris_session_close(struct iris_inst *inst)
221221
iris_wait_for_session_response(inst, false);
222222
}
223223

224+
static void iris_check_num_queued_internal_buffers(struct iris_inst *inst, u32 plane)
225+
{
226+
const struct iris_platform_data *platform_data = inst->core->iris_platform_data;
227+
struct iris_buffer *buf, *next;
228+
struct iris_buffers *buffers;
229+
const u32 *internal_buf_type;
230+
u32 internal_buffer_count, i;
231+
u32 count = 0;
232+
233+
if (V4L2_TYPE_IS_OUTPUT(plane)) {
234+
internal_buf_type = platform_data->dec_ip_int_buf_tbl;
235+
internal_buffer_count = platform_data->dec_ip_int_buf_tbl_size;
236+
} else {
237+
internal_buf_type = platform_data->dec_op_int_buf_tbl;
238+
internal_buffer_count = platform_data->dec_op_int_buf_tbl_size;
239+
}
240+
241+
for (i = 0; i < internal_buffer_count; i++) {
242+
buffers = &inst->buffers[internal_buf_type[i]];
243+
list_for_each_entry_safe(buf, next, &buffers->list, list)
244+
count++;
245+
if (count)
246+
dev_err(inst->core->dev, "%d buffer of type %d not released",
247+
count, internal_buf_type[i]);
248+
}
249+
}
250+
224251
int iris_close(struct file *filp)
225252
{
226253
struct iris_inst *inst = iris_get_inst(filp, NULL);
@@ -235,6 +262,8 @@ int iris_close(struct file *filp)
235262
iris_v4l2_fh_deinit(inst);
236263
iris_destroy_all_internal_buffers(inst, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
237264
iris_destroy_all_internal_buffers(inst, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
265+
iris_check_num_queued_internal_buffers(inst, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
266+
iris_check_num_queued_internal_buffers(inst, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
238267
iris_remove_session(inst);
239268
mutex_unlock(&inst->lock);
240269
mutex_destroy(&inst->ctx_q_lock);

0 commit comments

Comments
 (0)