Merge "msm: camera: Avoid deadlock for vb2 operations using separate lock"
This commit is contained in:
commit
1f01c0ba90
2 changed files with 17 additions and 7 deletions
|
@ -434,6 +434,7 @@ static int msm_fd_open(struct file *file)
|
||||||
ctx->vb2_q.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
|
ctx->vb2_q.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
|
||||||
ctx->vb2_q.io_modes = VB2_USERPTR;
|
ctx->vb2_q.io_modes = VB2_USERPTR;
|
||||||
ctx->vb2_q.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
|
ctx->vb2_q.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
|
||||||
|
mutex_init(&ctx->lock);
|
||||||
ret = vb2_queue_init(&ctx->vb2_q);
|
ret = vb2_queue_init(&ctx->vb2_q);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(device->dev, "Error queue init\n");
|
dev_err(device->dev, "Error queue init\n");
|
||||||
|
@ -484,7 +485,9 @@ static int msm_fd_release(struct file *file)
|
||||||
msm_cpp_vbif_register_error_handler((void *)ctx,
|
msm_cpp_vbif_register_error_handler((void *)ctx,
|
||||||
VBIF_CLIENT_FD, NULL);
|
VBIF_CLIENT_FD, NULL);
|
||||||
|
|
||||||
|
mutex_lock(&ctx->lock);
|
||||||
vb2_queue_release(&ctx->vb2_q);
|
vb2_queue_release(&ctx->vb2_q);
|
||||||
|
mutex_unlock(&ctx->lock);
|
||||||
|
|
||||||
vfree(ctx->stats);
|
vfree(ctx->stats);
|
||||||
|
|
||||||
|
@ -514,7 +517,9 @@ static unsigned int msm_fd_poll(struct file *file,
|
||||||
struct fd_ctx *ctx = msm_fd_ctx_from_fh(file->private_data);
|
struct fd_ctx *ctx = msm_fd_ctx_from_fh(file->private_data);
|
||||||
unsigned int ret;
|
unsigned int ret;
|
||||||
|
|
||||||
|
mutex_lock(&ctx->lock);
|
||||||
ret = vb2_poll(&ctx->vb2_q, file, wait);
|
ret = vb2_poll(&ctx->vb2_q, file, wait);
|
||||||
|
mutex_unlock(&ctx->lock);
|
||||||
|
|
||||||
if (atomic_read(&ctx->subscribed_for_event)) {
|
if (atomic_read(&ctx->subscribed_for_event)) {
|
||||||
poll_wait(file, &ctx->fh.wait, wait);
|
poll_wait(file, &ctx->fh.wait, wait);
|
||||||
|
@ -752,9 +757,9 @@ static int msm_fd_reqbufs(struct file *file,
|
||||||
int ret;
|
int ret;
|
||||||
struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh);
|
struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh);
|
||||||
|
|
||||||
mutex_lock(&ctx->fd_device->recovery_lock);
|
mutex_lock(&ctx->lock);
|
||||||
ret = vb2_reqbufs(&ctx->vb2_q, req);
|
ret = vb2_reqbufs(&ctx->vb2_q, req);
|
||||||
mutex_unlock(&ctx->fd_device->recovery_lock);
|
mutex_unlock(&ctx->lock);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -770,9 +775,9 @@ static int msm_fd_qbuf(struct file *file, void *fh,
|
||||||
int ret;
|
int ret;
|
||||||
struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh);
|
struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh);
|
||||||
|
|
||||||
mutex_lock(&ctx->fd_device->recovery_lock);
|
mutex_lock(&ctx->lock);
|
||||||
ret = vb2_qbuf(&ctx->vb2_q, pb);
|
ret = vb2_qbuf(&ctx->vb2_q, pb);
|
||||||
mutex_unlock(&ctx->fd_device->recovery_lock);
|
mutex_unlock(&ctx->lock);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -789,9 +794,9 @@ static int msm_fd_dqbuf(struct file *file,
|
||||||
int ret;
|
int ret;
|
||||||
struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh);
|
struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh);
|
||||||
|
|
||||||
mutex_lock(&ctx->fd_device->recovery_lock);
|
mutex_lock(&ctx->lock);
|
||||||
ret = vb2_dqbuf(&ctx->vb2_q, pb, file->f_flags & O_NONBLOCK);
|
ret = vb2_dqbuf(&ctx->vb2_q, pb, file->f_flags & O_NONBLOCK);
|
||||||
mutex_unlock(&ctx->fd_device->recovery_lock);
|
mutex_unlock(&ctx->lock);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -807,7 +812,9 @@ static int msm_fd_streamon(struct file *file,
|
||||||
struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh);
|
struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
mutex_lock(&ctx->lock);
|
||||||
ret = vb2_streamon(&ctx->vb2_q, buf_type);
|
ret = vb2_streamon(&ctx->vb2_q, buf_type);
|
||||||
|
mutex_unlock(&ctx->lock);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
dev_err(ctx->fd_device->dev, "Stream on fails\n");
|
dev_err(ctx->fd_device->dev, "Stream on fails\n");
|
||||||
|
|
||||||
|
@ -826,7 +833,9 @@ static int msm_fd_streamoff(struct file *file,
|
||||||
struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh);
|
struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
mutex_lock(&ctx->lock);
|
||||||
ret = vb2_streamoff(&ctx->vb2_q, buf_type);
|
ret = vb2_streamoff(&ctx->vb2_q, buf_type);
|
||||||
|
mutex_unlock(&ctx->lock);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
dev_err(ctx->fd_device->dev, "Stream off fails\n");
|
dev_err(ctx->fd_device->dev, "Stream off fails\n");
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
@ -174,6 +174,7 @@ struct fd_ctx {
|
||||||
struct msm_fd_mem_pool mem_pool;
|
struct msm_fd_mem_pool mem_pool;
|
||||||
struct msm_fd_stats *stats;
|
struct msm_fd_stats *stats;
|
||||||
struct msm_fd_buf_handle work_buf;
|
struct msm_fd_buf_handle work_buf;
|
||||||
|
struct mutex lock;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Reference in a new issue