From 4f046e4d9e0d3acc8a8b56ef7849d3cf14d899b8 Mon Sep 17 00:00:00 2001 From: "zefa.chen" Date: Wed, 6 Jul 2022 14:58:07 +0800 Subject: [PATCH] media: rockchip: vicap fixed segfault about buffer operations Change-Id: Id2024d9fd3e0b951668dd58a9067e62d617292d3 Signed-off-by: Zefa Chen --- drivers/media/platform/rockchip/cif/capture.c | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index 014fafbcc734..6051b99a3ed5 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -1739,7 +1739,7 @@ static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream, if (dev->hdr.hdr_mode != NO_HDR && stream->id != 0 && (!dev->rdbk_buf[RDBK_L])) return -EINVAL; - if (stream->to_stop_dma) + if (stream->to_stop_dma && stream->dma_en & RKCIF_DMAEN_BY_ISP) goto stop_dma; spin_lock_irqsave(&stream->vbq_lock, flags); @@ -3124,24 +3124,26 @@ void rkcif_buf_queue(struct vb2_buffer *vb) int i; bool is_find_tools_buf = false; - spin_lock_irqsave(&stream->tools_vdev->vbq_lock, flags); - if (tools_vdev && !list_empty(&tools_vdev->src_buf_head)) { - list_for_each_entry(tools_buf, &tools_vdev->src_buf_head, list) { - if (tools_buf->vb == vbuf) { - is_find_tools_buf = true; - break; - } - } - if (is_find_tools_buf) { - if (tools_buf->use_cnt) - tools_buf->use_cnt--; - if (tools_buf->use_cnt) { - spin_unlock_irqrestore(&stream->tools_vdev->vbq_lock, flags); - return; + if (tools_vdev) { + spin_lock_irqsave(&stream->tools_vdev->vbq_lock, flags); + if (!list_empty(&tools_vdev->src_buf_head)) { + list_for_each_entry(tools_buf, &tools_vdev->src_buf_head, list) { + if (tools_buf->vb == vbuf) { + is_find_tools_buf = true; + break; + } + } + if (is_find_tools_buf) { + if (tools_buf->use_cnt) + tools_buf->use_cnt--; + if (tools_buf->use_cnt) { + spin_unlock_irqrestore(&stream->tools_vdev->vbq_lock, flags); + return; + } } } + spin_unlock_irqrestore(&stream->tools_vdev->vbq_lock, flags); } - spin_unlock_irqrestore(&stream->tools_vdev->vbq_lock, flags); memset(cifbuf->buff_addr, 0, sizeof(cifbuf->buff_addr)); /* If mplanes > 1, every c-plane has its own m-plane, @@ -6796,7 +6798,8 @@ static void rkcif_buf_done_prepare(struct rkcif_stream *stream, if (cif_dev->hdr.hdr_mode == NO_HDR || cif_dev->hdr.hdr_mode == HDR_COMPR) { if (stream->cif_fmt_in->field == V4L2_FIELD_INTERLACED) { if (stream->frame_phase == CIF_CSI_FRAME1_READY && active_buf) { - if (stream->tools_vdev->state == RKCIF_STATE_STREAMING) { + if (stream->tools_vdev && + stream->tools_vdev->state == RKCIF_STATE_STREAMING) { spin_lock_irqsave(&stream->tools_vdev->vbq_lock, flags); stream->tools_vdev->tools_work.active_buf = active_buf; stream->tools_vdev->tools_work.frame_idx = active_buf->vb.sequence; @@ -6812,7 +6815,8 @@ static void rkcif_buf_done_prepare(struct rkcif_stream *stream, } } else { if (active_buf) { - if (stream->tools_vdev->state == RKCIF_STATE_STREAMING) { + if (stream->tools_vdev && + stream->tools_vdev->state == RKCIF_STATE_STREAMING) { spin_lock_irqsave(&stream->tools_vdev->vbq_lock, flags); stream->tools_vdev->tools_work.active_buf = active_buf; stream->tools_vdev->tools_work.frame_idx = active_buf->vb.sequence;