[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20100530145240.GA21559@linux-m68k.org>
Date: Sun, 30 May 2010 16:52:40 +0200
From: Richard Zidlicky <rz@...ux-m68k.org>
To: linux-kernel@...r.kernel.org
Subject: schedule inside spin_lock_irqsave?
Hi,
came across following snippet of code (2.6.34:drivers/media/dvb/siano/smscoreapi.c) and
since prepare_to_wait is new for me I am wondering if this is can work?
struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev)
{
struct smscore_buffer_t *cb = NULL;
unsigned long flags;
DEFINE_WAIT(wait);
spin_lock_irqsave(&coredev->bufferslock, flags);
/* This function must return a valid buffer, since the buffer list is
* finite, we check that there is an available buffer, if not, we wait
* until such buffer become available.
*/
prepare_to_wait(&coredev->buffer_mng_waitq, &wait, TASK_INTERRUPTIBLE);
if (list_empty(&coredev->buffers))
schedule();
finish_wait(&coredev->buffer_mng_waitq, &wait);
cb = (struct smscore_buffer_t *) coredev->buffers.next;
list_del(&cb->entry);
spin_unlock_irqrestore(&coredev->bufferslock, flags);
return cb;
}
Regards
Richard
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists