From 2af5890e5a1fb5616b5441263e2dc3d55e133eb6 Mon Sep 17 00:00:00 2001 From: John Sheu Date: Wed, 6 Feb 2013 20:03:01 -0300 Subject: [PATCH] --- yaml --- r: 366559 b: refs/heads/master c: 401f6a2729988c7229c3a78bba0d2f73851e3f51 h: refs/heads/master i: 366557: 3d1c9b02796f4baff5d28757e1c9d71dea0aa1cc 366555: 74bd6cefd3ecacaab8c3ded2dfd7dbc93ecdbe7e 366551: 1a3c7fad476764f2581611d047994c6a310b1246 366543: 79d15ddc8485efeaf784a6575f05229ec9944b7a 366527: a6de7ccd237bf9b2ee73eac2ace8aaaa7b43bd8a v: v3 --- [refs] | 2 +- trunk/drivers/media/v4l2-core/v4l2-mem2mem.c | 31 ++++++++++++++++++-- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index cdf19ccd8b86..d96aeafbbd8d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f1a0569be680a1bfb9d624cc4893cba0c6ad4172 +refs/heads/master: 401f6a2729988c7229c3a78bba0d2f73851e3f51 diff --git a/trunk/drivers/media/v4l2-core/v4l2-mem2mem.c b/trunk/drivers/media/v4l2-core/v4l2-mem2mem.c index 27ddb3d15251..66f599fcb829 100644 --- a/trunk/drivers/media/v4l2-core/v4l2-mem2mem.c +++ b/trunk/drivers/media/v4l2-core/v4l2-mem2mem.c @@ -408,10 +408,35 @@ EXPORT_SYMBOL_GPL(v4l2_m2m_streamon); int v4l2_m2m_streamoff(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, enum v4l2_buf_type type) { - struct vb2_queue *vq; + struct v4l2_m2m_dev *m2m_dev; + struct v4l2_m2m_queue_ctx *q_ctx; + unsigned long flags_job, flags; + int ret; - vq = v4l2_m2m_get_vq(m2m_ctx, type); - return vb2_streamoff(vq, type); + q_ctx = get_queue_ctx(m2m_ctx, type); + ret = vb2_streamoff(&q_ctx->q, type); + if (ret) + return ret; + + m2m_dev = m2m_ctx->m2m_dev; + spin_lock_irqsave(&m2m_dev->job_spinlock, flags_job); + /* We should not be scheduled anymore, since we're dropping a queue. */ + INIT_LIST_HEAD(&m2m_ctx->queue); + m2m_ctx->job_flags = 0; + + spin_lock_irqsave(&q_ctx->rdy_spinlock, flags); + /* Drop queue, since streamoff returns device to the same state as after + * calling reqbufs. */ + INIT_LIST_HEAD(&q_ctx->rdy_queue); + spin_unlock_irqrestore(&q_ctx->rdy_spinlock, flags); + + if (m2m_dev->curr_ctx == m2m_ctx) { + m2m_dev->curr_ctx = NULL; + wake_up(&m2m_ctx->finished); + } + spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job); + + return 0; } EXPORT_SYMBOL_GPL(v4l2_m2m_streamoff);