From 30ea49ab98001eedd54fd4f57ae080331861cad7 Mon Sep 17 00:00:00 2001 From: Hariram Purushothaman Date: Tue, 2 Feb 2016 16:18:06 -0800 Subject: [PATCH] msm: camera: Do node close with lock before reducing open index Do session/stream node destroy with lock before reducing opn_idx to avoid conflicts while closing node and mutex getting destroyed while other node still holds it, Also trigger the stream delete to backend for nodes which are only created by HAL. CRs-Fixed: 971839 Change-Id: Iefc1132e5790d8f7ba025ee140e536a2b3ca21c0 Signed-off-by: Hariram Purushothaman --- .../platform/msm/camera_v2/camera/camera.c | 18 +++++++++--------- drivers/media/platform/msm/camera_v2/msm.c | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/camera/camera.c b/drivers/media/platform/msm/camera_v2/camera/camera.c index 4454e89682e5..fabd7ddc870b 100644 --- a/drivers/media/platform/msm/camera_v2/camera/camera.c +++ b/drivers/media/platform/msm/camera_v2/camera/camera.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -41,6 +41,7 @@ struct camera_v4l2_private { unsigned int stream_id; unsigned int is_vb2_valid; /*0 if no vb2 buffers on stream, else 1*/ struct vb2_queue vb2_q; + bool stream_created; }; static void camera_pack_event(struct file *filep, int evt_id, @@ -416,6 +417,7 @@ static int camera_v4l2_s_parm(struct file *filep, void *fh, /* use stream_id as stream index */ parm->parm.capture.extendedmode = sp->stream_id; + sp->stream_created = true; return rc; @@ -664,18 +666,21 @@ static int camera_v4l2_close(struct file *filep) if (WARN_ON(!session)) return -EIO; + mutex_lock(&session->close_lock); opn_idx = atomic_read(&pvdev->opened); - pr_debug("%s: close stream_id=%d\n", __func__, sp->stream_id); mask = (1 << sp->stream_id); opn_idx &= ~mask; atomic_set(&pvdev->opened, opn_idx); - if (atomic_read(&pvdev->opened) == 0) { - mutex_lock(&session->close_lock); + if (sp->stream_created == true) { + pr_debug("%s: close stream_id=%d\n", __func__, sp->stream_id); camera_pack_event(filep, MSM_CAMERA_SET_PARM, MSM_CAMERA_PRIV_DEL_STREAM, -1, &event); msm_post_event(&event, MSM_POST_EVT_TIMEOUT); + sp->stream_created = false; + } + if (atomic_read(&pvdev->opened) == 0) { camera_pack_event(filep, MSM_CAMERA_DEL_SESSION, 0, -1, &event); msm_post_event(&event, MSM_POST_EVT_TIMEOUT); @@ -688,11 +693,6 @@ static int camera_v4l2_close(struct file *filep) msm_destroy_session(pvdev->vdev->num); pm_relax(&pvdev->vdev->dev); } else { - mutex_lock(&session->close_lock); - camera_pack_event(filep, MSM_CAMERA_SET_PARM, - MSM_CAMERA_PRIV_DEL_STREAM, -1, &event); - msm_post_event(&event, MSM_POST_EVT_TIMEOUT); - msm_delete_command_ack_q(pvdev->vdev->num, sp->stream_id); diff --git a/drivers/media/platform/msm/camera_v2/msm.c b/drivers/media/platform/msm/camera_v2/msm.c index 03cc05a811ca..97190a9dc964 100644 --- a/drivers/media/platform/msm/camera_v2/msm.c +++ b/drivers/media/platform/msm/camera_v2/msm.c @@ -396,8 +396,8 @@ int msm_create_session(unsigned int session_id, struct video_device *vdev) session = msm_queue_find(msm_session_q, struct msm_session, list, __msm_queue_find_session, &session_id); if (session) { - pr_err("%s : Session not found Line %d\n", - __func__, __LINE__); + pr_err("%s: Session exist session_id=%d\n", + __func__, session_id); return -EINVAL; }