]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
media: mediatek: vcodec: Only free buffer VA that is not NULL
authorFei Shao <fshao@chromium.org>
Thu, 21 Dec 2023 09:17:46 +0000 (09:17 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 11 Jul 2024 10:50:58 +0000 (12:50 +0200)
[ Upstream commit eb005c801ec70ff4307727bd3bd6e8280169ef32 ]

In the MediaTek vcodec driver, while mtk_vcodec_mem_free() is mostly
called only when the buffer to free exists, there are some instances
that didn't do the check and triggered warnings in practice.

We believe those checks were forgotten unintentionally. Add the checks
back to fix the warnings.

Signed-off-by: Fei Shao <fshao@chromium.org>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
Signed-off-by: Sebastian Fricke <sebastian.fricke@collabora.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_av1_req_lat_if.c
drivers/media/platform/mediatek/vcodec/encoder/venc/venc_h264_if.c

index 2b6a5adbc41994c1bff87fe5ff1bb14b8a5bb587..b0e2e59f61b5d76be2c6364c018522a38943cd62 100644 (file)
@@ -1023,18 +1023,26 @@ static void vdec_av1_slice_free_working_buffer(struct vdec_av1_slice_instance *i
        int i;
 
        for (i = 0; i < ARRAY_SIZE(instance->mv); i++)
-               mtk_vcodec_mem_free(ctx, &instance->mv[i]);
+               if (instance->mv[i].va)
+                       mtk_vcodec_mem_free(ctx, &instance->mv[i]);
 
        for (i = 0; i < ARRAY_SIZE(instance->seg); i++)
-               mtk_vcodec_mem_free(ctx, &instance->seg[i]);
+               if (instance->seg[i].va)
+                       mtk_vcodec_mem_free(ctx, &instance->seg[i]);
 
        for (i = 0; i < ARRAY_SIZE(instance->cdf); i++)
-               mtk_vcodec_mem_free(ctx, &instance->cdf[i]);
+               if (instance->cdf[i].va)
+                       mtk_vcodec_mem_free(ctx, &instance->cdf[i]);
+
 
-       mtk_vcodec_mem_free(ctx, &instance->tile);
-       mtk_vcodec_mem_free(ctx, &instance->cdf_temp);
-       mtk_vcodec_mem_free(ctx, &instance->cdf_table);
-       mtk_vcodec_mem_free(ctx, &instance->iq_table);
+       if (instance->tile.va)
+               mtk_vcodec_mem_free(ctx, &instance->tile);
+       if (instance->cdf_temp.va)
+               mtk_vcodec_mem_free(ctx, &instance->cdf_temp);
+       if (instance->cdf_table.va)
+               mtk_vcodec_mem_free(ctx, &instance->cdf_table);
+       if (instance->iq_table.va)
+               mtk_vcodec_mem_free(ctx, &instance->iq_table);
 
        instance->level = AV1_RES_NONE;
 }
index a68dac72c4e426d6b3f7d64b0199ea1bebb67f17..f8145998fcaf7823a56db483530f4de364499fdb 100644 (file)
@@ -301,11 +301,12 @@ static void h264_enc_free_work_buf(struct venc_h264_inst *inst)
         * other buffers need to be freed by AP.
         */
        for (i = 0; i < VENC_H264_VPU_WORK_BUF_MAX; i++) {
-               if (i != VENC_H264_VPU_WORK_BUF_SKIP_FRAME)
+               if (i != VENC_H264_VPU_WORK_BUF_SKIP_FRAME && inst->work_bufs[i].va)
                        mtk_vcodec_mem_free(inst->ctx, &inst->work_bufs[i]);
        }
 
-       mtk_vcodec_mem_free(inst->ctx, &inst->pps_buf);
+       if (inst->pps_buf.va)
+               mtk_vcodec_mem_free(inst->ctx, &inst->pps_buf);
 }
 
 static int h264_enc_alloc_work_buf(struct venc_h264_inst *inst, bool is_34bit)