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

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

Merge "msm: vidc: Use registeredbuf.lock for buffer synchronization"

parents f47b4920 323835b0
Loading
Loading
Loading
Loading
+12 −9
Original line number Diff line number Diff line
@@ -227,8 +227,10 @@ struct buffer_info *get_registered_buf(struct msm_vidc_inst *inst,
		goto err_invalid_input;
	}

	WARN(!mutex_is_locked(&inst->registeredbufs.lock),
		"Registered buf lock is not acquired for %s", __func__);

	*plane = 0;
	mutex_lock(&inst->registeredbufs.lock);
	list_for_each_entry(temp, &inst->registeredbufs.list, list) {
		for (i = 0; i < min(temp->num_planes, VIDEO_MAX_PLANES); i++) {
			bool fd_matches = fd == temp->fd[i];
@@ -252,7 +254,7 @@ struct buffer_info *get_registered_buf(struct msm_vidc_inst *inst,
		if (ret)
			break;
	}
	mutex_unlock(&inst->registeredbufs.lock);

err_invalid_input:
	return ret;
}
@@ -459,7 +461,7 @@ int map_and_register_buf(struct msm_vidc_inst *inst, struct v4l2_buffer *b)
			!b->m.planes[i].length) {
			continue;
		}
		mutex_lock(&inst->sync_lock);
		mutex_lock(&inst->registeredbufs.lock);
		temp = get_registered_buf(inst, b, i, &plane);
		if (temp && !is_dynamic_output_buffer_mode(b, inst)) {
			dprintk(VIDC_DBG,
@@ -478,7 +480,6 @@ int map_and_register_buf(struct msm_vidc_inst *inst, struct v4l2_buffer *b)
			*/
			dprintk(VIDC_DBG, "[MAP] Buffer already prepared\n");
			temp->inactive = false;
			mutex_lock(&inst->registeredbufs.lock);
			list_for_each_entry(iterator,
				&inst->registeredbufs.list, list) {
				if (iterator == temp) {
@@ -490,9 +491,8 @@ int map_and_register_buf(struct msm_vidc_inst *inst, struct v4l2_buffer *b)
					break;
				}
			}
			mutex_unlock(&inst->registeredbufs.lock);
		}
		mutex_unlock(&inst->sync_lock);
		mutex_unlock(&inst->registeredbufs.lock);
		if (rc < 0)
			goto exit;

@@ -556,7 +556,8 @@ int unmap_and_deregister_buf(struct msm_vidc_inst *inst,
		return -EINVAL;
	}

	mutex_lock(&inst->registeredbufs.lock);
	WARN(!mutex_is_locked(&inst->registeredbufs.lock),
		"Registered buf lock is not acquired for %s", __func__);

	/*
	* Make sure the buffer to be unmapped and deleted
@@ -617,7 +618,6 @@ int unmap_and_deregister_buf(struct msm_vidc_inst *inst,
		dprintk(VIDC_DBG, "[UNMAP] NOT-FREED binfo: %p\n", temp);
	}
exit:
	mutex_unlock(&inst->registeredbufs.lock);
	return 0;
}

@@ -841,8 +841,9 @@ int msm_vidc_qbuf(void *instance, struct v4l2_buffer *b)
			b->m.planes[i].m.userptr = 0;
			continue;
		}

		mutex_lock(&inst->registeredbufs.lock);
		binfo = get_registered_buf(inst, b, i, &plane);
		mutex_unlock(&inst->registeredbufs.lock);
		if (!binfo) {
			dprintk(VIDC_ERR,
				"This buffer is not registered: %d, %d, %d\n",
@@ -953,7 +954,9 @@ int msm_vidc_dqbuf(void *instance, struct v4l2_buffer *b)

		dprintk(VIDC_DBG, "[DEQUEUED]: fd[0] = %d\n",
			buffer_info->fd[0]);
		mutex_lock(&inst->registeredbufs.lock);
		rc = unmap_and_deregister_buf(inst, buffer_info);
		mutex_unlock(&inst->registeredbufs.lock);
	} else
		rc = output_buffer_cache_invalidate(inst, buffer_info);

+1 −4
Original line number Diff line number Diff line
@@ -828,8 +828,6 @@ static void handle_event_change(enum hal_command_response cmd, void *data)
				"RELEASE REFERENCE EVENT FROM F/W - fd = %d offset = %d\n",
				ptr[0], ptr[1]);

		mutex_lock(&inst->sync_lock);

		/* Decrement buffer reference count*/
		mutex_lock(&inst->registeredbufs.lock);
		list_for_each_entry(temp, &inst->registeredbufs.list,
@@ -839,7 +837,6 @@ static void handle_event_change(enum hal_command_response cmd, void *data)
				break;
			}
		}
		mutex_unlock(&inst->registeredbufs.lock);

		/*
		 * Release buffer and remove from list
@@ -848,7 +845,7 @@ static void handle_event_change(enum hal_command_response cmd, void *data)
		if (unmap_and_deregister_buf(inst, binfo))
			dprintk(VIDC_ERR,
					"%s: buffer unmap failed\n", __func__);
		mutex_unlock(&inst->sync_lock);
		mutex_unlock(&inst->registeredbufs.lock);

		/*send event to client*/
		v4l2_event_queue_fh(&inst->event_handler, &buf_event);