* [PATCH] dvb: siano: free spinlock before schedule() @ 2010-07-27 18:42 ` Kulikov Vasiliy 0 siblings, 0 replies; 10+ messages in thread From: Kulikov Vasiliy @ 2010-07-27 18:42 UTC (permalink / raw) To: kernel-janitors Cc: Mauro Carvalho Chehab, Douglas Schilling Landgraf, Jiri Kosina, Roel Kluin, Andrew Morton, linux-media, linux-kernel Calling schedule() holding spinlock with disables irqs is improper. As spinlock protects list coredev->buffers, it can be unlocked untill wakeup. This bug was introduced in a9349315f65cd6a16e8fab1f6cf0fd40f379c4db. Signed-off-by: Kulikov Vasiliy <segooon@gmail.com> --- drivers/media/dvb/siano/smscoreapi.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/media/dvb/siano/smscoreapi.c b/drivers/media/dvb/siano/smscoreapi.c index 7f2c94a..d93468c 100644 --- a/drivers/media/dvb/siano/smscoreapi.c +++ b/drivers/media/dvb/siano/smscoreapi.c @@ -1113,9 +1113,11 @@ struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev) */ prepare_to_wait(&coredev->buffer_mng_waitq, &wait, TASK_INTERRUPTIBLE); - - if (list_empty(&coredev->buffers)) + if (list_empty(&coredev->buffers)) { + spin_unlock_irqrestore(&coredev->bufferslock, flags); schedule(); + spin_lock_irqsave(&coredev->bufferslock, flags); + } finish_wait(&coredev->buffer_mng_waitq, &wait); -- 1.7.0.4 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH] dvb: siano: free spinlock before schedule() @ 2010-07-27 18:42 ` Kulikov Vasiliy 0 siblings, 0 replies; 10+ messages in thread From: Kulikov Vasiliy @ 2010-07-27 18:42 UTC (permalink / raw) To: kernel-janitors Cc: Mauro Carvalho Chehab, Douglas Schilling Landgraf, Jiri Kosina, Roel Kluin, Andrew Morton, linux-media, linux-kernel Calling schedule() holding spinlock with disables irqs is improper. As spinlock protects list coredev->buffers, it can be unlocked untill wakeup. This bug was introduced in a9349315f65cd6a16e8fab1f6cf0fd40f379c4db. Signed-off-by: Kulikov Vasiliy <segooon@gmail.com> --- drivers/media/dvb/siano/smscoreapi.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/media/dvb/siano/smscoreapi.c b/drivers/media/dvb/siano/smscoreapi.c index 7f2c94a..d93468c 100644 --- a/drivers/media/dvb/siano/smscoreapi.c +++ b/drivers/media/dvb/siano/smscoreapi.c @@ -1113,9 +1113,11 @@ struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev) */ prepare_to_wait(&coredev->buffer_mng_waitq, &wait, TASK_INTERRUPTIBLE); - - if (list_empty(&coredev->buffers)) + if (list_empty(&coredev->buffers)) { + spin_unlock_irqrestore(&coredev->bufferslock, flags); schedule(); + spin_lock_irqsave(&coredev->bufferslock, flags); + } finish_wait(&coredev->buffer_mng_waitq, &wait); -- 1.7.0.4 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH] dvb: siano: free spinlock before schedule() 2010-07-27 18:42 ` Kulikov Vasiliy @ 2010-07-27 22:24 ` Jiri Slaby -1 siblings, 0 replies; 10+ messages in thread From: Jiri Slaby @ 2010-07-27 22:24 UTC (permalink / raw) To: Kulikov Vasiliy Cc: kernel-janitors, Mauro Carvalho Chehab, Douglas Schilling Landgraf, Jiri Kosina, Roel Kluin, Andrew Morton, linux-media, linux-kernel, Richard Zidlicky On 07/27/2010 08:42 PM, Kulikov Vasiliy wrote: > Calling schedule() holding spinlock with disables irqs is improper. As > spinlock protects list coredev->buffers, it can be unlocked untill wakeup. > This bug was introduced in a9349315f65cd6a16e8fab1f6cf0fd40f379c4db. > > Signed-off-by: Kulikov Vasiliy <segooon@gmail.com> > --- > drivers/media/dvb/siano/smscoreapi.c | 6 ++++-- > 1 files changed, 4 insertions(+), 2 deletions(-) > > diff --git a/drivers/media/dvb/siano/smscoreapi.c b/drivers/media/dvb/siano/smscoreapi.c > index 7f2c94a..d93468c 100644 > --- a/drivers/media/dvb/siano/smscoreapi.c > +++ b/drivers/media/dvb/siano/smscoreapi.c > @@ -1113,9 +1113,11 @@ struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev) > */ > > prepare_to_wait(&coredev->buffer_mng_waitq, &wait, TASK_INTERRUPTIBLE); > - > - if (list_empty(&coredev->buffers)) > + if (list_empty(&coredev->buffers)) { > + spin_unlock_irqrestore(&coredev->bufferslock, flags); > schedule(); > + spin_lock_irqsave(&coredev->bufferslock, flags); > + } > > finish_wait(&coredev->buffer_mng_waitq, &wait); There is a better fix (which fixes the potential NULL dereference): http://lkml.org/lkml/2010/6/7/175 Richard, could you address the comments there and resend? regards, -- js ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] dvb: siano: free spinlock before schedule() @ 2010-07-27 22:24 ` Jiri Slaby 0 siblings, 0 replies; 10+ messages in thread From: Jiri Slaby @ 2010-07-27 22:24 UTC (permalink / raw) To: Kulikov Vasiliy Cc: kernel-janitors, Mauro Carvalho Chehab, Douglas Schilling Landgraf, Jiri Kosina, Roel Kluin, Andrew Morton, linux-media, linux-kernel, Richard Zidlicky On 07/27/2010 08:42 PM, Kulikov Vasiliy wrote: > Calling schedule() holding spinlock with disables irqs is improper. As > spinlock protects list coredev->buffers, it can be unlocked untill wakeup. > This bug was introduced in a9349315f65cd6a16e8fab1f6cf0fd40f379c4db. > > Signed-off-by: Kulikov Vasiliy <segooon@gmail.com> > --- > drivers/media/dvb/siano/smscoreapi.c | 6 ++++-- > 1 files changed, 4 insertions(+), 2 deletions(-) > > diff --git a/drivers/media/dvb/siano/smscoreapi.c b/drivers/media/dvb/siano/smscoreapi.c > index 7f2c94a..d93468c 100644 > --- a/drivers/media/dvb/siano/smscoreapi.c > +++ b/drivers/media/dvb/siano/smscoreapi.c > @@ -1113,9 +1113,11 @@ struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev) > */ > > prepare_to_wait(&coredev->buffer_mng_waitq, &wait, TASK_INTERRUPTIBLE); > - > - if (list_empty(&coredev->buffers)) > + if (list_empty(&coredev->buffers)) { > + spin_unlock_irqrestore(&coredev->bufferslock, flags); > schedule(); > + spin_lock_irqsave(&coredev->bufferslock, flags); > + } > > finish_wait(&coredev->buffer_mng_waitq, &wait); There is a better fix (which fixes the potential NULL dereference): http://lkml.org/lkml/2010/6/7/175 Richard, could you address the comments there and resend? regards, -- js ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] dvb: siano: free spinlock before schedule() 2010-07-27 22:24 ` Jiri Slaby @ 2010-08-08 16:10 ` Richard Zidlicky -1 siblings, 0 replies; 10+ messages in thread From: Richard Zidlicky @ 2010-08-08 16:10 UTC (permalink / raw) To: Jiri Slaby Cc: Kulikov Vasiliy, kernel-janitors, Mauro Carvalho Chehab, Douglas Schilling Landgraf, Jiri Kosina, Roel Kluin, Andrew Morton, linux-media, linux-kernel On Wed, Jul 28, 2010 at 12:24:39AM +0200, Jiri Slaby wrote: sorry for seeing this so late, was flooded with email lately. > There is a better fix (which fixes the potential NULL dereference): > http://lkml.org/lkml/2010/6/7/175 > Richard, could you address the comments there and resend? I am running this patch since many weeks (after fixing the compile error obviously). Did not implement your beautification suggestion yet, was doing all kinds of experiments with IR and had plenty of unrelated issues. Richard --- linux-2.6.34/drivers/media/dvb/siano/smscoreapi.c.rz 2010-06-03 21:58:11.000000000 +0200 +++ linux-2.6.34/drivers/media/dvb/siano/smscoreapi.c 2010-06-07 14:32:06.000000000 +0200 @@ -1100,31 +1100,26 @@ * * @return pointer to descriptor on success, NULL on error. */ -struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev) + +struct smscore_buffer_t *get_entry(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); - + if (!list_empty(&coredev->buffers)) { cb = (struct smscore_buffer_t *) coredev->buffers.next; list_del(&cb->entry); - + } spin_unlock_irqrestore(&coredev->bufferslock, flags); + return cb; +} + +struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev) +{ + struct smscore_buffer_t *cb = NULL; + + wait_event(coredev->buffer_mng_waitq, (cb = get_entry(coredev))); return cb; } ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] dvb: siano: free spinlock before schedule() @ 2010-08-08 16:10 ` Richard Zidlicky 0 siblings, 0 replies; 10+ messages in thread From: Richard Zidlicky @ 2010-08-08 16:10 UTC (permalink / raw) To: Jiri Slaby Cc: Kulikov Vasiliy, kernel-janitors, Mauro Carvalho Chehab, Douglas Schilling Landgraf, Jiri Kosina, Roel Kluin, Andrew Morton, linux-media, linux-kernel On Wed, Jul 28, 2010 at 12:24:39AM +0200, Jiri Slaby wrote: sorry for seeing this so late, was flooded with email lately. > There is a better fix (which fixes the potential NULL dereference): > http://lkml.org/lkml/2010/6/7/175 > Richard, could you address the comments there and resend? I am running this patch since many weeks (after fixing the compile error obviously). Did not implement your beautification suggestion yet, was doing all kinds of experiments with IR and had plenty of unrelated issues. Richard --- linux-2.6.34/drivers/media/dvb/siano/smscoreapi.c.rz 2010-06-03 21:58:11.000000000 +0200 +++ linux-2.6.34/drivers/media/dvb/siano/smscoreapi.c 2010-06-07 14:32:06.000000000 +0200 @@ -1100,31 +1100,26 @@ * * @return pointer to descriptor on success, NULL on error. */ -struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev) + +struct smscore_buffer_t *get_entry(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); - + if (!list_empty(&coredev->buffers)) { cb = (struct smscore_buffer_t *) coredev->buffers.next; list_del(&cb->entry); - + } spin_unlock_irqrestore(&coredev->bufferslock, flags); + return cb; +} + +struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev) +{ + struct smscore_buffer_t *cb = NULL; + + wait_event(coredev->buffer_mng_waitq, (cb = get_entry(coredev))); return cb; } ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] dvb: siano: free spinlock before schedule() 2010-08-08 16:10 ` Richard Zidlicky @ 2010-08-24 12:52 ` Mauro Carvalho Chehab -1 siblings, 0 replies; 10+ messages in thread From: Mauro Carvalho Chehab @ 2010-08-24 12:52 UTC (permalink / raw) To: Richard Zidlicky Cc: Jiri Slaby, Kulikov Vasiliy, kernel-janitors, Douglas Schilling Landgraf, Jiri Kosina, Roel Kluin, Andrew Morton, linux-media, linux-kernel Em 08-08-2010 13:10, Richard Zidlicky escreveu: > On Wed, Jul 28, 2010 at 12:24:39AM +0200, Jiri Slaby wrote: > > sorry for seeing this so late, was flooded with email lately. > >> There is a better fix (which fixes the potential NULL dereference): >> http://lkml.org/lkml/2010/6/7/175 > >> Richard, could you address the comments there and resend? > > I am running this patch since many weeks (after fixing the compile error obviously). > Did not implement your beautification suggestion yet, was doing all kinds of experiments > with IR and had plenty of unrelated issues. This patch seems a way better than the previous patch. I've rebased it against the current tree (and fixed the identation). The only missing issue on it is the lack of your Signed-off-by. Richard, could you please send it to us? --- drivers/media/dvb/siano/smscoreapi.c | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) --- patchwork.orig/drivers/media/dvb/siano/smscoreapi.c +++ patchwork/drivers/media/dvb/siano/smscoreapi.c @@ -1098,31 +1098,26 @@ EXPORT_SYMBOL_GPL(smscore_onresponse); * * @return pointer to descriptor on success, NULL on error. */ -struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev) + +struct smscore_buffer_t *get_entry(struct smscore_device_t *coredev) { struct smscore_buffer_t *cb = NULL; unsigned long flags; - DEFINE_WAIT(wait); - spin_lock_irqsave(&coredev->bufferslock, flags); + if (!list_empty(&coredev->buffers)) { + cb = (struct smscore_buffer_t *) coredev->buffers.next; + list_del(&cb->entry); + } + spin_unlock_irqrestore(&coredev->bufferslock, flags); + return cb; +} - /* 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); +struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev) +{ + struct smscore_buffer_t *cb = NULL; - spin_unlock_irqrestore(&coredev->bufferslock, flags); + wait_event(coredev->buffer_mng_waitq, (cb = get_entry(coredev))); return cb; } ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] dvb: siano: free spinlock before schedule() @ 2010-08-24 12:52 ` Mauro Carvalho Chehab 0 siblings, 0 replies; 10+ messages in thread From: Mauro Carvalho Chehab @ 2010-08-24 12:52 UTC (permalink / raw) To: Richard Zidlicky Cc: Jiri Slaby, Kulikov Vasiliy, kernel-janitors, Douglas Schilling Landgraf, Jiri Kosina, Roel Kluin, Andrew Morton, linux-media, linux-kernel Em 08-08-2010 13:10, Richard Zidlicky escreveu: > On Wed, Jul 28, 2010 at 12:24:39AM +0200, Jiri Slaby wrote: > > sorry for seeing this so late, was flooded with email lately. > >> There is a better fix (which fixes the potential NULL dereference): >> http://lkml.org/lkml/2010/6/7/175 > >> Richard, could you address the comments there and resend? > > I am running this patch since many weeks (after fixing the compile error obviously). > Did not implement your beautification suggestion yet, was doing all kinds of experiments > with IR and had plenty of unrelated issues. This patch seems a way better than the previous patch. I've rebased it against the current tree (and fixed the identation). The only missing issue on it is the lack of your Signed-off-by. Richard, could you please send it to us? --- drivers/media/dvb/siano/smscoreapi.c | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) --- patchwork.orig/drivers/media/dvb/siano/smscoreapi.c +++ patchwork/drivers/media/dvb/siano/smscoreapi.c @@ -1098,31 +1098,26 @@ EXPORT_SYMBOL_GPL(smscore_onresponse); * * @return pointer to descriptor on success, NULL on error. */ -struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev) + +struct smscore_buffer_t *get_entry(struct smscore_device_t *coredev) { struct smscore_buffer_t *cb = NULL; unsigned long flags; - DEFINE_WAIT(wait); - spin_lock_irqsave(&coredev->bufferslock, flags); + if (!list_empty(&coredev->buffers)) { + cb = (struct smscore_buffer_t *) coredev->buffers.next; + list_del(&cb->entry); + } + spin_unlock_irqrestore(&coredev->bufferslock, flags); + return cb; +} - /* 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); +struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev) +{ + struct smscore_buffer_t *cb = NULL; - spin_unlock_irqrestore(&coredev->bufferslock, flags); + wait_event(coredev->buffer_mng_waitq, (cb = get_entry(coredev))); return cb; } ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] dvb: siano: free spinlock before schedule() 2010-08-24 12:52 ` Mauro Carvalho Chehab @ 2010-08-24 15:43 ` Richard Zidlicky -1 siblings, 0 replies; 10+ messages in thread From: Richard Zidlicky @ 2010-08-24 15:43 UTC (permalink / raw) To: Mauro Carvalho Chehab Cc: Jiri Slaby, Kulikov Vasiliy, kernel-janitors, Douglas Schilling Landgraf, Jiri Kosina, Roel Kluin, Andrew Morton, linux-media, linux-kernel On Tue, Aug 24, 2010 at 09:52:36AM -0300, Mauro Carvalho Chehab wrote: > Em 08-08-2010 13:10, Richard Zidlicky escreveu: > > On Wed, Jul 28, 2010 at 12:24:39AM +0200, Jiri Slaby wrote: > > > > sorry for seeing this so late, was flooded with email lately. > > > >> There is a better fix (which fixes the potential NULL dereference): > >> http://lkml.org/lkml/2010/6/7/175 > > > >> Richard, could you address the comments there and resend? > > > > I am running this patch since many weeks (after fixing the compile error obviously). > > Did not implement your beautification suggestion yet, was doing all kinds of experiments > > with IR and had plenty of unrelated issues. > > This patch seems a way better than the previous patch. I've rebased it against > the current tree (and fixed the identation). thanks for looking at it. > The only missing issue on it is the lack of your Signed-off-by. Richard, could you > please send it to us? Signed-off-by: Richard Zidlicky <rz@linux-m68k.org> PS: I will be away for a while. > > --- > drivers/media/dvb/siano/smscoreapi.c | 31 +++++++++++++------------------ > 1 file changed, 13 insertions(+), 18 deletions(-) > > --- patchwork.orig/drivers/media/dvb/siano/smscoreapi.c > +++ patchwork/drivers/media/dvb/siano/smscoreapi.c > @@ -1098,31 +1098,26 @@ EXPORT_SYMBOL_GPL(smscore_onresponse); > * > * @return pointer to descriptor on success, NULL on error. > */ > -struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev) > + > +struct smscore_buffer_t *get_entry(struct smscore_device_t *coredev) > { > struct smscore_buffer_t *cb = NULL; > unsigned long flags; > > - DEFINE_WAIT(wait); > - > spin_lock_irqsave(&coredev->bufferslock, flags); > + if (!list_empty(&coredev->buffers)) { > + cb = (struct smscore_buffer_t *) coredev->buffers.next; > + list_del(&cb->entry); > + } > + spin_unlock_irqrestore(&coredev->bufferslock, flags); > + return cb; > +} > > - /* 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); > +struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev) > +{ > + struct smscore_buffer_t *cb = NULL; > > - spin_unlock_irqrestore(&coredev->bufferslock, flags); > + wait_event(coredev->buffer_mng_waitq, (cb = get_entry(coredev))); > > return cb; > } ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] dvb: siano: free spinlock before schedule() @ 2010-08-24 15:43 ` Richard Zidlicky 0 siblings, 0 replies; 10+ messages in thread From: Richard Zidlicky @ 2010-08-24 15:43 UTC (permalink / raw) To: Mauro Carvalho Chehab Cc: Jiri Slaby, Kulikov Vasiliy, kernel-janitors, Douglas Schilling Landgraf, Jiri Kosina, Roel Kluin, Andrew Morton, linux-media, linux-kernel On Tue, Aug 24, 2010 at 09:52:36AM -0300, Mauro Carvalho Chehab wrote: > Em 08-08-2010 13:10, Richard Zidlicky escreveu: > > On Wed, Jul 28, 2010 at 12:24:39AM +0200, Jiri Slaby wrote: > > > > sorry for seeing this so late, was flooded with email lately. > > > >> There is a better fix (which fixes the potential NULL dereference): > >> http://lkml.org/lkml/2010/6/7/175 > > > >> Richard, could you address the comments there and resend? > > > > I am running this patch since many weeks (after fixing the compile error obviously). > > Did not implement your beautification suggestion yet, was doing all kinds of experiments > > with IR and had plenty of unrelated issues. > > This patch seems a way better than the previous patch. I've rebased it against > the current tree (and fixed the identation). thanks for looking at it. > The only missing issue on it is the lack of your Signed-off-by. Richard, could you > please send it to us? Signed-off-by: Richard Zidlicky <rz@linux-m68k.org> PS: I will be away for a while. > > --- > drivers/media/dvb/siano/smscoreapi.c | 31 +++++++++++++------------------ > 1 file changed, 13 insertions(+), 18 deletions(-) > > --- patchwork.orig/drivers/media/dvb/siano/smscoreapi.c > +++ patchwork/drivers/media/dvb/siano/smscoreapi.c > @@ -1098,31 +1098,26 @@ EXPORT_SYMBOL_GPL(smscore_onresponse); > * > * @return pointer to descriptor on success, NULL on error. > */ > -struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev) > + > +struct smscore_buffer_t *get_entry(struct smscore_device_t *coredev) > { > struct smscore_buffer_t *cb = NULL; > unsigned long flags; > > - DEFINE_WAIT(wait); > - > spin_lock_irqsave(&coredev->bufferslock, flags); > + if (!list_empty(&coredev->buffers)) { > + cb = (struct smscore_buffer_t *) coredev->buffers.next; > + list_del(&cb->entry); > + } > + spin_unlock_irqrestore(&coredev->bufferslock, flags); > + return cb; > +} > > - /* 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); > +struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev) > +{ > + struct smscore_buffer_t *cb = NULL; > > - spin_unlock_irqrestore(&coredev->bufferslock, flags); > + wait_event(coredev->buffer_mng_waitq, (cb = get_entry(coredev))); > > return cb; > } ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2010-08-24 15:53 UTC | newest] Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2010-07-27 18:42 [PATCH] dvb: siano: free spinlock before schedule() Kulikov Vasiliy 2010-07-27 18:42 ` Kulikov Vasiliy 2010-07-27 22:24 ` Jiri Slaby 2010-07-27 22:24 ` Jiri Slaby 2010-08-08 16:10 ` Richard Zidlicky 2010-08-08 16:10 ` Richard Zidlicky 2010-08-24 12:52 ` Mauro Carvalho Chehab 2010-08-24 12:52 ` Mauro Carvalho Chehab 2010-08-24 15:43 ` Richard Zidlicky 2010-08-24 15:43 ` Richard Zidlicky
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.