Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3786bda9 authored by Peter Liu's avatar Peter Liu
Browse files

msm: camera: isp: avoid spin lock recursion on same CPU



When CPU do spin lock irq save, it will disable irq/preemption.
If the same CPU do spin lock without disabling irq,
then irq context can trigger spin lock irq save
which will hang CPU since the irq/preemption is disabled.

Avoid the issue to use spin lock irq save consistantly.

Change-Id: I38bf80be58744dabf7c2554b50b686b1e304fc4c
Signed-off-by: default avatarPeter Liu <pingchie@codeaurora.org>
parent dfc594f4
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -209,6 +209,7 @@ static void msm_isp_unprepare_v4l2_buf(
	struct buffer_cmd *buf_pending = NULL;
	struct msm_isp_bufq *bufq = NULL;
	int iommu_hdl;
	unsigned long flags;

	if (!buf_mgr || !buf_info) {
		pr_err("%s: NULL ptr %p %p\n", __func__,
@@ -234,7 +235,7 @@ static void msm_isp_unprepare_v4l2_buf(
		cam_smmu_put_phy_addr(iommu_hdl, mapped_info->buf_fd);

		/*protect buffer_q list access*/
		spin_lock(&bufq->bufq_lock);
		spin_lock_irqsave(&bufq->bufq_lock, flags);
		list_for_each_entry(buf_pending, &buf_mgr->buffer_q, list) {
			if (!buf_pending)
				break;
@@ -245,7 +246,7 @@ static void msm_isp_unprepare_v4l2_buf(
				break;
			}
		}
		spin_unlock(&bufq->bufq_lock);
		spin_unlock_irqrestore(&bufq->bufq_lock, flags);
	}
	return;
}
@@ -806,6 +807,7 @@ static int msm_isp_flush_buf(struct msm_isp_buf_mgr *buf_mgr,
	int rc = -1, i;
	struct msm_isp_bufq *bufq = NULL;
	struct msm_isp_buffer *buf_info = NULL;
	unsigned long flags;

	bufq = msm_isp_get_bufq(buf_mgr, bufq_handle);
	if (!bufq) {
@@ -813,8 +815,7 @@ static int msm_isp_flush_buf(struct msm_isp_buf_mgr *buf_mgr,
		return rc;
	}

	spin_lock(&bufq->bufq_lock);

	spin_lock_irqsave(&bufq->bufq_lock, flags);
	for (i = 0; i < bufq->num_bufs; i++) {
		buf_info = msm_isp_get_buf_ptr(buf_mgr, bufq_handle, i);
		if (!buf_info) {
@@ -845,7 +846,7 @@ static int msm_isp_flush_buf(struct msm_isp_buf_mgr *buf_mgr,
				kfree(buf_info);
		 }
	}
	spin_unlock(&bufq->bufq_lock);
	spin_unlock_irqrestore(&bufq->bufq_lock, flags);
	return 0;
}