* em38xx locking question
@ 2015-03-10 13:18 Ezequiel Garcia
2015-03-10 13:26 ` Hans Verkuil
0 siblings, 1 reply; 6+ messages in thread
From: Ezequiel Garcia @ 2015-03-10 13:18 UTC (permalink / raw)
To: linux-media, mchehab, hans.verkuil
Mauro,
Function drivers/media/usb/em28xx/em28xx-video.c:get_next_buf
(copy pasted below for reference) does not take the list spinlock,
yet it modifies the list. Is that correct?
static inline struct em28xx_buffer *get_next_buf(struct em28xx *dev,
struct em28xx_dmaqueue *dma_q)
{
struct em28xx_buffer *buf;
if (list_empty(&dma_q->active)) {
em28xx_isocdbg("No active queue to serve\n");
return NULL;
}
/* Get the next buffer */
buf = list_entry(dma_q->active.next, struct em28xx_buffer, list);
/* Cleans up buffer - Useful for testing for frame/URB loss */
list_del(&buf->list);
buf->pos = 0;
buf->vb_buf = buf->mem;
return buf;
}
Thanks!
--
Ezequiel Garcia, VanguardiaSur
www.vanguardiasur.com.ar
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: em38xx locking question 2015-03-10 13:18 em38xx locking question Ezequiel Garcia @ 2015-03-10 13:26 ` Hans Verkuil 2015-03-10 13:29 ` Ezequiel Garcia 0 siblings, 1 reply; 6+ messages in thread From: Hans Verkuil @ 2015-03-10 13:26 UTC (permalink / raw) To: Ezequiel Garcia, linux-media, mchehab, hans.verkuil On 03/10/2015 02:18 PM, Ezequiel Garcia wrote: > Mauro, > > Function drivers/media/usb/em28xx/em28xx-video.c:get_next_buf > (copy pasted below for reference) does not take the list spinlock, > yet it modifies the list. Is that correct? That looks wrong to me. You really need spinlocks here. Regards, Hans > > static inline struct em28xx_buffer *get_next_buf(struct em28xx *dev, > struct em28xx_dmaqueue *dma_q) > { > struct em28xx_buffer *buf; > > if (list_empty(&dma_q->active)) { > em28xx_isocdbg("No active queue to serve\n"); > return NULL; > } > > /* Get the next buffer */ > buf = list_entry(dma_q->active.next, struct em28xx_buffer, list); > /* Cleans up buffer - Useful for testing for frame/URB loss */ > list_del(&buf->list); > buf->pos = 0; > buf->vb_buf = buf->mem; > > return buf; > } > > Thanks! > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: em38xx locking question 2015-03-10 13:26 ` Hans Verkuil @ 2015-03-10 13:29 ` Ezequiel Garcia 2015-03-10 13:46 ` Hans Verkuil 0 siblings, 1 reply; 6+ messages in thread From: Ezequiel Garcia @ 2015-03-10 13:29 UTC (permalink / raw) To: Hans Verkuil, linux-media, mchehab, hans.verkuil On 03/10/2015 10:26 AM, Hans Verkuil wrote: > On 03/10/2015 02:18 PM, Ezequiel Garcia wrote: >> Mauro, >> >> Function drivers/media/usb/em28xx/em28xx-video.c:get_next_buf >> (copy pasted below for reference) does not take the list spinlock, >> yet it modifies the list. Is that correct? > > That looks wrong to me. You really need spinlocks here. > OK, second question then. Is there any way to guarantee the URBs irq handler is *not* running, when vb2_ops are called (e.g. stop_streaming)? Otherwise, given stop_streaming will return the current buffer to vb2 (dev->usb_ctl.vid_buf), I believe that will race against the irq handler, which is processing it. It seems that's currently racy as well. -- Ezequiel Garcia, VanguardiaSur www.vanguardiasur.com.ar ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: em38xx locking question 2015-03-10 13:29 ` Ezequiel Garcia @ 2015-03-10 13:46 ` Hans Verkuil 2015-03-10 14:06 ` Ezequiel Garcia 0 siblings, 1 reply; 6+ messages in thread From: Hans Verkuil @ 2015-03-10 13:46 UTC (permalink / raw) To: Ezequiel Garcia, linux-media, mchehab, hans.verkuil On 03/10/2015 02:29 PM, Ezequiel Garcia wrote: > > > On 03/10/2015 10:26 AM, Hans Verkuil wrote: >> On 03/10/2015 02:18 PM, Ezequiel Garcia wrote: >>> Mauro, >>> >>> Function drivers/media/usb/em28xx/em28xx-video.c:get_next_buf >>> (copy pasted below for reference) does not take the list spinlock, >>> yet it modifies the list. Is that correct? >> >> That looks wrong to me. You really need spinlocks here. >> > > OK, second question then. Is there any way to guarantee the URBs irq handler > is *not* running, when vb2_ops are called (e.g. stop_streaming)? That depends on the op. But stop_streaming is the op that is supposed to turn off the streaming (and thus the irq), so it depends on the order of how things are done in that function. > Otherwise, given stop_streaming will return the current buffer to vb2 > (dev->usb_ctl.vid_buf), I believe that will race against the irq handler, > which is processing it. > > It seems that's currently racy as well. Hmm, the stop_streaming code looks fine at first sight, but I think there is a race if you start streaming both video and vbi, and then stop streaming one of the two. I think the code might keep calling get_next_buf() in that case, even if for that stream the streaming was stopped. This is a problem anyway: get_next_buf() should do this check at the beginning: if (!vb2_start_streaming_called(vb2_queue)) return NULL; to prevent it from using buffer before start_streaming was actually called. Regards, Hans ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: em38xx locking question 2015-03-10 13:46 ` Hans Verkuil @ 2015-03-10 14:06 ` Ezequiel Garcia 2015-03-10 14:16 ` Hans Verkuil 0 siblings, 1 reply; 6+ messages in thread From: Ezequiel Garcia @ 2015-03-10 14:06 UTC (permalink / raw) To: Hans Verkuil, linux-media, mchehab, hans.verkuil On 03/10/2015 10:46 AM, Hans Verkuil wrote: > On 03/10/2015 02:29 PM, Ezequiel Garcia wrote: >> >> >> On 03/10/2015 10:26 AM, Hans Verkuil wrote: >>> On 03/10/2015 02:18 PM, Ezequiel Garcia wrote: >>>> Mauro, >>>> >>>> Function drivers/media/usb/em28xx/em28xx-video.c:get_next_buf >>>> (copy pasted below for reference) does not take the list spinlock, >>>> yet it modifies the list. Is that correct? >>> >>> That looks wrong to me. You really need spinlocks here. >>> >> >> OK, second question then. Is there any way to guarantee the URBs irq handler >> is *not* running, when vb2_ops are called (e.g. stop_streaming)? > > That depends on the op. But stop_streaming is the op that is supposed to > turn off the streaming (and thus the irq), so it depends on the order > of how things are done in that function. > Ah, right. As long as you kill the urbs before you try to access the current buffer, everything is OK. >> Otherwise, given stop_streaming will return the current buffer to vb2 >> (dev->usb_ctl.vid_buf), I believe that will race against the irq handler, >> which is processing it. >> >> It seems that's currently racy as well. > > Hmm, the stop_streaming code looks fine at first sight, but I think there > is a race if you start streaming both video and vbi, and then stop streaming > one of the two. I think the code might keep calling get_next_buf() in that > case, even if for that stream the streaming was stopped. > > This is a problem anyway: get_next_buf() should do this check at the beginning: > > if (!vb2_start_streaming_called(vb2_queue)) > return NULL; > > to prevent it from using buffer before start_streaming was actually called. > I'd say get_next_buf() is called only in the URB complete handler path, and hence only after start_streaming. However, maybe there's a subtle issue here: URB complete handler can be called _while_ start_streaming is still running. -- Ezequiel Garcia, VanguardiaSur www.vanguardiasur.com.ar ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: em38xx locking question 2015-03-10 14:06 ` Ezequiel Garcia @ 2015-03-10 14:16 ` Hans Verkuil 0 siblings, 0 replies; 6+ messages in thread From: Hans Verkuil @ 2015-03-10 14:16 UTC (permalink / raw) To: Ezequiel Garcia, linux-media, mchehab, hans.verkuil On 03/10/2015 03:06 PM, Ezequiel Garcia wrote: > > > On 03/10/2015 10:46 AM, Hans Verkuil wrote: >> On 03/10/2015 02:29 PM, Ezequiel Garcia wrote: >>> >>> >>> On 03/10/2015 10:26 AM, Hans Verkuil wrote: >>>> On 03/10/2015 02:18 PM, Ezequiel Garcia wrote: >>>>> Mauro, >>>>> >>>>> Function drivers/media/usb/em28xx/em28xx-video.c:get_next_buf >>>>> (copy pasted below for reference) does not take the list spinlock, >>>>> yet it modifies the list. Is that correct? >>>> >>>> That looks wrong to me. You really need spinlocks here. >>>> >>> >>> OK, second question then. Is there any way to guarantee the URBs irq handler >>> is *not* running, when vb2_ops are called (e.g. stop_streaming)? >> >> That depends on the op. But stop_streaming is the op that is supposed to >> turn off the streaming (and thus the irq), so it depends on the order >> of how things are done in that function. >> > > Ah, right. As long as you kill the urbs before you try to access the > current buffer, everything is OK. > >>> Otherwise, given stop_streaming will return the current buffer to vb2 >>> (dev->usb_ctl.vid_buf), I believe that will race against the irq handler, >>> which is processing it. >>> > >>> It seems that's currently racy as well. >> >> Hmm, the stop_streaming code looks fine at first sight, but I think there >> is a race if you start streaming both video and vbi, and then stop streaming >> one of the two. I think the code might keep calling get_next_buf() in that >> case, even if for that stream the streaming was stopped. >> >> This is a problem anyway: get_next_buf() should do this check at the beginning: >> >> if (!vb2_start_streaming_called(vb2_queue)) >> return NULL; >> >> to prevent it from using buffer before start_streaming was actually called. >> > > I'd say get_next_buf() is called only in the URB complete handler path, > and hence only after start_streaming. Well, no. If you are streaming just video and then start streaming vbi in addition to the video, then I think get_next_buf() can be called for the VBI stream before start_streaming is called for that VBI stream. Hans > However, maybe there's a subtle > issue here: URB complete handler can be called _while_ start_streaming > is still running. > ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-03-10 14:17 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-03-10 13:18 em38xx locking question Ezequiel Garcia 2015-03-10 13:26 ` Hans Verkuil 2015-03-10 13:29 ` Ezequiel Garcia 2015-03-10 13:46 ` Hans Verkuil 2015-03-10 14:06 ` Ezequiel Garcia 2015-03-10 14:16 ` Hans Verkuil
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox