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 <hariramp@codeaurora.org>
This commit is contained in:
Hariram Purushothaman 2016-02-02 16:18:06 -08:00 committed by David Keitel
parent ff072849f7
commit 30ea49ab98
2 changed files with 11 additions and 11 deletions

View file

@ -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);

View file

@ -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;
}