V4L/DVB (9722): cx18: Convert per stream queue spinlocks into mutexes
authorAndy Walls <awalls@radix.net>
Sun, 16 Nov 2008 23:18:05 +0000 (20:18 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 30 Dec 2008 11:38:08 +0000 (09:38 -0200)
Convert the per stream queue spinlocks into mutexes.  All queue
manipulation happens via the work queue or system calls into the driver, and
not in an interrupt context.  This reduces the amout of time the cx18 driver
keeps interrupts disabled.

Signed-off-by: Andy Walls <awalls@radix.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/cx18/cx18-driver.h
drivers/media/video/cx18/cx18-queue.c
drivers/media/video/cx18/cx18-streams.c

index f8929eb72ad0345a756d158e40f68fe24e0266fc..041fa660a7c249c6221d26d40a9678b21438f76d 100644 (file)
@@ -271,7 +271,7 @@ struct cx18_stream {
        unsigned mdl_offset;
 
        u32 id;
-       spinlock_t qlock;       /* locks access to the queues */
+       struct mutex qlock;     /* locks access to the queues */
        unsigned long s_flags;  /* status flags, see above */
        int dma;                /* can be PCI_DMA_TODEVICE,
                                   PCI_DMA_FROMDEVICE or
index c5a81aed61bbb51dcc489cc48d069757ab6cd5d4..5a38394036314621886cc1eaa0ea4ee5f7639fd5 100644 (file)
@@ -44,34 +44,31 @@ void cx18_queue_init(struct cx18_queue *q)
 void cx18_enqueue(struct cx18_stream *s, struct cx18_buffer *buf,
                struct cx18_queue *q)
 {
-       unsigned long flags = 0;
-
        /* clear the buffer if it is going to be enqueued to the free queue */
        if (q == &s->q_free) {
                buf->bytesused = 0;
                buf->readpos = 0;
                buf->b_flags = 0;
        }
-       spin_lock_irqsave(&s->qlock, flags);
+       mutex_lock(&s->qlock);
        list_add_tail(&buf->list, &q->list);
        atomic_inc(&q->buffers);
        q->bytesused += buf->bytesused - buf->readpos;
-       spin_unlock_irqrestore(&s->qlock, flags);
+       mutex_unlock(&s->qlock);
 }
 
 struct cx18_buffer *cx18_dequeue(struct cx18_stream *s, struct cx18_queue *q)
 {
        struct cx18_buffer *buf = NULL;
-       unsigned long flags = 0;
 
-       spin_lock_irqsave(&s->qlock, flags);
+       mutex_lock(&s->qlock);
        if (!list_empty(&q->list)) {
                buf = list_entry(q->list.next, struct cx18_buffer, list);
                list_del_init(q->list.next);
                atomic_dec(&q->buffers);
                q->bytesused -= buf->bytesused - buf->readpos;
        }
-       spin_unlock_irqrestore(&s->qlock, flags);
+       mutex_unlock(&s->qlock);
        return buf;
 }
 
@@ -80,9 +77,8 @@ struct cx18_buffer *cx18_queue_get_buf(struct cx18_stream *s, u32 id,
 {
        struct cx18 *cx = s->cx;
        struct list_head *p;
-       unsigned long flags = 0;
 
-       spin_lock_irqsave(&s->qlock, flags);
+       mutex_lock(&s->qlock);
        list_for_each(p, &s->q_free.list) {
                struct cx18_buffer *buf =
                        list_entry(p, struct cx18_buffer, list);
@@ -102,10 +98,10 @@ struct cx18_buffer *cx18_queue_get_buf(struct cx18_stream *s, u32 id,
                        list_move_tail(&buf->list, &s->q_full.list);
                }
 
-               spin_unlock_irqrestore(&s->qlock, flags);
+               mutex_unlock(&s->qlock);
                return buf;
        }
-       spin_unlock_irqrestore(&s->qlock, flags);
+       mutex_unlock(&s->qlock);
        CX18_ERR("Cannot find buffer %d for stream %s\n", id, s->name);
        return NULL;
 }
@@ -113,13 +109,12 @@ struct cx18_buffer *cx18_queue_get_buf(struct cx18_stream *s, u32 id,
 /* Move all buffers of a queue to q_free, while flushing the buffers */
 static void cx18_queue_flush(struct cx18_stream *s, struct cx18_queue *q)
 {
-       unsigned long flags;
        struct cx18_buffer *buf;
 
        if (q == &s->q_free)
                return;
 
-       spin_lock_irqsave(&s->qlock, flags);
+       mutex_lock(&s->qlock);
        while (!list_empty(&q->list)) {
                buf = list_entry(q->list.next, struct cx18_buffer, list);
                list_move_tail(q->list.next, &s->q_free.list);
@@ -127,7 +122,7 @@ static void cx18_queue_flush(struct cx18_stream *s, struct cx18_queue *q)
                atomic_inc(&s->q_free.buffers);
        }
        cx18_queue_init(q);
-       spin_unlock_irqrestore(&s->qlock, flags);
+       mutex_unlock(&s->qlock);
 }
 
 void cx18_flush_queues(struct cx18_stream *s)
index e6d808f7cc8f830c5f48979a08088bc78ad537cc..e218e4d0ebf4ec62d6add2fb345437255ce138be 100644 (file)
@@ -132,7 +132,7 @@ static void cx18_stream_init(struct cx18 *cx, int type)
                s->buffers = 63;
                s->buf_size = (max_size / s->buffers) & ~0xfff;
        }
-       spin_lock_init(&s->qlock);
+       mutex_init(&s->qlock);
        init_waitqueue_head(&s->waitq);
        s->id = -1;
        cx18_queue_init(&s->q_free);