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

Commit 6c4bab1e authored by Seemanta Dutta's avatar Seemanta Dutta
Browse files

msm: bufmgr: Delete buffers only for matching sessions



When closing a session, delete buffers from the buffer manager
list only for those buffers for which the session id matches with
the session being closed.

Change-Id: Ieca1db766ec2879e7228f52f99a0a7883d5c2de3
Signed-off-by: default avatarSeemanta Dutta <seemanta@codeaurora.org>
parent 648cfa62
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -506,6 +506,7 @@ int msm_destroy_session(unsigned int session_id)
{
	struct msm_session *session;
	struct v4l2_subdev *buf_mgr_subdev;
	struct msm_sd_close_ioctl session_info;

	session = msm_queue_find(msm_session_q, struct msm_session,
		list, __msm_queue_find_session, &session_id);
@@ -519,8 +520,10 @@ int msm_destroy_session(unsigned int session_id)
		list, session);
	buf_mgr_subdev = msm_buf_mngr_get_subdev();
	if (buf_mgr_subdev) {
		session_info.session = session_id;
		session_info.stream = 0;
		v4l2_subdev_call(buf_mgr_subdev, core, ioctl,
			MSM_SD_SHUTDOWN, NULL);
			MSM_SD_SHUTDOWN, &session_info);
	} else {
		pr_err("%s: Buff manger device node is NULL\n", __func__);
	}
+14 −7
Original line number Diff line number Diff line
@@ -100,22 +100,29 @@ static int32_t msm_buf_mngr_put_buf(struct msm_buf_mngr_device *buf_mngr_dev,
	return ret;
}

static void msm_buf_mngr_sd_shutdown(struct msm_buf_mngr_device *buf_mngr_dev)
static void msm_buf_mngr_sd_shutdown(struct msm_buf_mngr_device *buf_mngr_dev,
				     struct msm_sd_close_ioctl *session)
{
	unsigned long flags;
	struct msm_get_bufs *bufs, *save;

	BUG_ON(!buf_mngr_dev);
	BUG_ON(!session);

	spin_lock_irqsave(&buf_mngr_dev->buf_q_spinlock, flags);
	if (!list_empty(&buf_mngr_dev->buf_qhead)) {
		list_for_each_entry_safe(bufs,
			save, &buf_mngr_dev->buf_qhead, entry) {
			pr_err("%s: Error delete invalid bufs =%lx, ses_id=%d, str_id=%d, idx=%d\n",
				__func__, (unsigned long)bufs, bufs->session_id,
				bufs->stream_id, bufs->vb2_buf->v4l2_buf.index);
			pr_info("%s: Delete invalid bufs =%lx, session_id=%u, bufs->ses_id=%d, str_id=%d, idx=%d\n",
				__func__, (unsigned long)bufs, session->session,
				bufs->session_id, bufs->stream_id,
				bufs->vb2_buf->v4l2_buf.index);
			if (session->session == bufs->session_id) {
				list_del_init(&bufs->entry);
				kfree(bufs);
			}
		}
	}
	spin_unlock_irqrestore(&buf_mngr_dev->buf_q_spinlock, flags);
}

@@ -175,7 +182,7 @@ static long msm_buf_mngr_subdev_ioctl(struct v4l2_subdev *sd,
		rc = msm_generic_buf_mngr_close(sd, NULL);
		break;
	case MSM_SD_SHUTDOWN:
		msm_buf_mngr_sd_shutdown(buf_mngr_dev);
		msm_buf_mngr_sd_shutdown(buf_mngr_dev, argp);
		break;
	default:
		return -ENOIOCTLCMD;