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

Commit e1a17caa authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: mdss: add proper locking for buffer lists"

parents c22e2d9e e18508a8
Loading
Loading
Loading
Loading
+44 −9
Original line number Diff line number Diff line
@@ -1072,7 +1072,12 @@ static int mdss_mdp_overlay_set(struct msm_fb_data_type *mfd,
	return ret;
}

struct mdss_mdp_data *mdss_mdp_overlay_buf_alloc(struct msm_fb_data_type *mfd,
/*
 * it's caller responsibility to acquire mdp5_data->list_lock while calling
 * this function
 */
static
struct mdss_mdp_data *__mdp_overlay_buf_alloc(struct msm_fb_data_type *mfd,
		struct mdss_mdp_pipe *pipe)
{
	struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
@@ -1090,24 +1095,40 @@ struct mdss_mdp_data *mdss_mdp_overlay_buf_alloc(struct msm_fb_data_type *mfd,
		}

		list_add(&buf->chunk_list, &mdp5_data->bufs_chunks);
		for (i = 0; i < BUF_POOL_SIZE; i++)
		for (i = 0; i < BUF_POOL_SIZE; i++) {
			buf->state = MDP_BUF_STATE_UNUSED;
			list_add(&buf[i].buf_list, &mdp5_data->bufs_pool);
		}
	}

	buf = list_first_entry(&mdp5_data->bufs_pool,
			struct mdss_mdp_data, buf_list);
	list_move_tail(&buf->buf_list, &mdp5_data->bufs_used);
	BUG_ON(buf->state != MDP_BUF_STATE_UNUSED);
	buf->state = MDP_BUF_STATE_READY;
	buf->last_alloc = local_clock();
	buf->last_pipe = pipe;

	list_move_tail(&buf->buf_list, &mdp5_data->bufs_used);
	list_add_tail(&buf->pipe_list, &pipe->buf_queue);
	buf->state = MDP_BUF_STATE_READY;

	pr_debug("buffer alloc: %p\n", buf);

	return buf;
}

struct mdss_mdp_data *mdss_mdp_overlay_buf_alloc(struct msm_fb_data_type *mfd,
		struct mdss_mdp_pipe *pipe)
{
	struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
	struct mdss_mdp_data *buf;

	mutex_lock(&mdp5_data->list_lock);
	buf = __mdp_overlay_buf_alloc(mfd, pipe);
	mutex_unlock(&mdp5_data->list_lock);

	return buf;
}

static void mdss_mdp_overlay_buf_deinit(struct msm_fb_data_type *mfd)
{
	struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
@@ -1126,7 +1147,11 @@ static void mdss_mdp_overlay_buf_deinit(struct msm_fb_data_type *mfd)
	}
}

void mdss_mdp_overlay_buf_free(struct msm_fb_data_type *mfd,
/*
 * it's caller responsibility to acquire mdp5_data->list_lock while calling
 * this function
 */
static void __mdp_overlay_buf_free(struct msm_fb_data_type *mfd,
		struct mdss_mdp_data *buf)
{
	struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
@@ -1144,6 +1169,16 @@ void mdss_mdp_overlay_buf_free(struct msm_fb_data_type *mfd,
	list_move_tail(&buf->buf_list, &mdp5_data->bufs_pool);
}

void mdss_mdp_overlay_buf_free(struct msm_fb_data_type *mfd,
		struct mdss_mdp_data *buf)
{
	struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);

	mutex_lock(&mdp5_data->list_lock);
	__mdp_overlay_buf_free(mfd, buf);
	mutex_unlock(&mdp5_data->list_lock);
}

static inline void __pipe_buf_mark_cleanup(struct msm_fb_data_type *mfd,
		struct mdss_mdp_data *buf)
{
@@ -1166,7 +1201,7 @@ static void __mdss_mdp_overlay_free_list_purge(struct msm_fb_data_type *mfd)
	pr_debug("purging fb%d free list\n", mfd->index);

	list_for_each_entry_safe(buf, t, &mdp5_data->bufs_freelist, buf_list)
		mdss_mdp_overlay_buf_free(mfd, buf);
		__mdp_overlay_buf_free(mfd, buf);
}

static void __overlay_pipe_cleanup(struct msm_fb_data_type *mfd,
@@ -1184,7 +1219,7 @@ static void __overlay_pipe_cleanup(struct msm_fb_data_type *mfd,
		 * soon as session is closed.
		 */
		if (pipe->flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION)
			mdss_mdp_overlay_buf_free(mfd, buf);
			__mdp_overlay_buf_free(mfd, buf);
	}

	mdss_mdp_pipe_destroy(pipe);
@@ -2162,7 +2197,7 @@ static int mdss_mdp_overlay_queue(struct msm_fb_data_type *mfd,
	flags = (pipe->flags & MDP_SECURE_OVERLAY_SESSION);

	mutex_lock(&mdp5_data->list_lock);
	src_data = mdss_mdp_overlay_buf_alloc(mfd, pipe);
	src_data = __mdp_overlay_buf_alloc(mfd, pipe);
	if (!src_data) {
		pr_err("unable to allocate source buffer\n");
		ret = -ENOMEM;
@@ -2170,7 +2205,7 @@ static int mdss_mdp_overlay_queue(struct msm_fb_data_type *mfd,
		ret = mdss_mdp_data_get(src_data, &req->data,
				1, flags);
		if (IS_ERR_VALUE(ret)) {
			mdss_mdp_overlay_buf_free(mfd, src_data);
			__mdp_overlay_buf_free(mfd, src_data);
			pr_err("src_data pmem error\n");
		}
	}