vdec: avoid double release same resources [1/1]
authorapollo.ling <apollo.ling@amlogic.com>
Thu, 17 Oct 2019 08:00:16 +0000 (16:00 +0800)
committerApollo Ling <apollo.ling@amlogic.com>
Tue, 29 Oct 2019 02:06:42 +0000 (19:06 -0700)
PD#SWPL-10720

Problem:
Media AutoTest system met kernel crash and RAM DUMP

Solution:
check to avoid double release same resources

Verify:
P215

Change-Id: I58928ad333036aa4e146798f50764a9e201c4ecd
Signed-off-by: apollo.ling <apollo.ling@amlogic.com>
drivers/frame_provider/decoder/utils/vdec_input.c

index d819885a74bc3f1f3e42a5e799ef3b80b493a79e..8550575d259d9b21bb8db9c822d259ddc7fb13a9 100644 (file)
@@ -998,11 +998,26 @@ EXPORT_SYMBOL(vdec_input_next_input_chunk);
 void vdec_input_release_chunk(struct vdec_input_s *input,
                        struct vframe_chunk_s *chunk)
 {
+       struct vframe_chunk_s *p;
+       u32 chunk_valid = 0;
        unsigned long flags;
        struct vframe_block_list_s *block = chunk->block;
        struct vframe_block_list_s *tofreeblock = NULL;
        flags = vdec_input_lock(input);
 
+       list_for_each_entry(p, &input->vframe_chunk_list, list) {
+               if (p == chunk) {
+                       chunk_valid = 1;
+                       break;
+               }
+       }
+       /* 2 threads go here, the other done the deletion,so return*/
+       if (chunk_valid == 0) {
+               vdec_input_unlock(input, flags);
+               pr_err("%s chunk is deleted,so return.\n", __func__);
+               return;
+       }
+
        list_del(&chunk->list);
        input->have_frame_num--;
        ATRACE_COUNTER(MEM_NAME, input->have_frame_num);