public inbox for linux-media@vger.kernel.org
 help / color / mirror / Atom feed
From: Mauro Carvalho Chehab <mchehab@infradead.org>
To: "Aidan Thornton" <makosoft@googlemail.com>
Cc: v4l <video4linux-list@redhat.com>, Brandon Philips <bphilips@suse.de>
Subject: Re: [PATCH 6 of 9] videobuf-vmalloc.c: Fix hack of postponing mmap on remap failure
Date: Wed, 9 Apr 2008 17:42:16 -0300	[thread overview]
Message-ID: <20080409174216.3844d0ee@areia> (raw)
In-Reply-To: <c8b4dbe10804090626l6b2b10d9p1c22e02dfe2850fe@mail.gmail.com>

On Wed, 9 Apr 2008 14:26:46 +0100
"Aidan Thornton" <makosoft@googlemail.com> wrote:

> On Tue, Apr 8, 2008 at 9:50 PM, Mauro Carvalho Chehab
> <mchehab@infradead.org> wrote:
> > > >  With 6/9 or with this patch, the allocation will happen when you try to use an
> >  > >  mmap command. This can happen on streamon, reqbufs, dqbuf, qbuf or reqbuf.
> >  > >
> >  > >  Sorry, but I think I missed your point.
> >  >
> >  > I think I agree with Brandon. Allocating the buffers in reqbufs is
> >  > what the existing em28xx driver does. It saves a bit of complexity in
> >  > that you just have to allocate the buffers from one place and it seems
> >  > to be what the v4l2 API expects. (Apps have to call reqbufs first, but
> >  > the API doesn't put any real restrictions on what order they
> >  > mmap/munmap or queue/dequeue the buffers afterwards, and the API also
> >  > forbids apps from calling reqbufs with the existing buffers mapped or
> >  > streaming turned on which makes life easier). It's what I was going to
> >  > suggest, actually.
> >
> >  I'm still missed. I don't see what's the difference on what patch 6/9 were
> >  expecting to do and the proposed patch, in terms of adding a restriction of not
> >  accepting other mmap commands, without getting a REQBUFS.
> >
> >  The current way that videobuf works is the one that userspace apps expect. If
> >  we change videobuf behavior, for a given userspace API command, we risk to
> >  break some userspace app.
> 
> Either way, mmap isn't allowed without a REQBUFS first, and videobuf
> enforces this. The question is, what orderings of mmap/munmap and
> streamon/streamoff are allowed once you've called REQBUFS - if I'm
> reading the docs correctly, you're allowed to interleave mmap/munmap
> and streamon/streamoff in whatever order you like, don't have to mmap
> buffers before queuing them, etc. In practice, apps don't, but the
> possible combinations at least need to be handled cleanly.

One patch that worked is this one:
	http://linuxtv.org/hg/~mchehab/tm6010/rev/e1a2b9e33bd2

I tried first to use spinlock before vfree(), but kernel complained. I suspect
that vfree() can sleep.

So, what the above patch does is to streamoff() before unmapping. This seems to
be correct to my eyes, since there's no sense of keeping streamon() if the
buffers are unmapped.

I didn't pushed it on em28xx yet, since I'm trying to fix another bug there.

> In what way do you expect userspace apps to break?
> 
> >
> >  > >  A fix could be to disable IRQ during that interval of time, and/or protecting
> >  > >  with a spinlock.
> >  >
> >  > What you're doing in the attached patch won't trigger the issue, since
> >  > you're calling VIDIOC_STREAMOFF before munmap and that dequeues all
> >  > buffers. Try removing the calls to stop_capturing and start_capturing
> >  > around uninit_device / init_device. I haven't tried it, but you should
> >  > be prepared to get a kernel panic.
> >
> >  The tests I did covers the issue of unmapping/remapping. As we've already
> >  discussed, something else should be added to allow unmapping without streamoff.
> >
> >  The same kind of issue seems to apply also to videobuf-dma-sg. In fact, it is
> >  even worse with dma: since buffers will be filled without CPU, just disabling
> >  IRQ, or running a spinlock doesn't solve. You'll need to stop DMA before unmapping.
> 
> Actually, videobuf-dma-sg works in a quite interesting way - it
> actually treats mmap'ed IO essentially the same as userptr IO, just
> with some additional code to allocate the user pages.

I've started to write a patch to add the same functionality. Didn't finished
yet. I'm not sure if it would be important to provide userspace mmapped IO. I
suspect that most apps are using read() or kernel mmap() interfaces.

> Shutting off DMA on munmap wouldn't help, since the buffer could be a userptr one in
> some anonymous mapping entirely unrelated to the device.  I'm not sure
> whether or not this is an issue; I'd have to check the small print on
> the code that pins the pages in RAM, and I can't find it.

I suspect that the issue exists with DMA, although there's a sync routine
there, that may help to avoid such issues. But I think that the same strategy of
doing a streamoff before unmap should be used for kernel mmapped memory.

> (There's also some code to allocate bounce buffers in the mmap case if
> it doesn't have a userland address for the buffer yet. I'm not
> convinced this actually works.)

It should work. you can test it with "capture_example -u". Unfortunately, I
can't test here right now, since the desktop I use here for testing PCI devices
is burned. I'll need to save some money to buy another motherboard or to
replace the machine.

Cheers,
Mauro

--
video4linux-list mailing list
Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list

  parent reply	other threads:[~2008-04-09 20:44 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-03-28 10:18 [PATCH 0 of 9] videobuf fixes Brandon Philips
2008-03-28 10:18 ` [PATCH 1 of 9] soc_camera: Introduce a spinlock for use with videobuf Brandon Philips
2008-03-28 20:53   ` Guennadi Liakhovetski
2008-03-29  3:59     ` Brandon Philips
2008-04-04 13:46       ` [PATCH] soc-camera: use a spinlock for videobuffer queue Guennadi Liakhovetski
2008-04-04 20:17         ` Brandon Philips
2008-03-28 10:18 ` [PATCH 2 of 9] videobuf: Require spinlocks for all videobuf users Brandon Philips
2008-03-28 10:18 ` [PATCH 3 of 9] videobuf: Wakeup queues after changing the state to ERROR Brandon Philips
2008-03-28 10:18 ` [PATCH 4 of 9] videobuf: Simplify videobuf_waiton logic and possibly avoid missed wakeup Brandon Philips
2008-03-28 10:18 ` [PATCH 5 of 9] videobuf-vmalloc.c: Remove buf_release from videobuf_vm_close Brandon Philips
2008-03-28 10:18 ` [PATCH 6 of 9] videobuf-vmalloc.c: Fix hack of postponing mmap on remap failure Brandon Philips
     [not found]   ` <20080405131236.7c083554@gaivota>
     [not found]     ` <20080406080011.GA3596@plankton.ifup.org>
     [not found]       ` <20080407183226.703217fc@gaivota>
     [not found]         ` <20080408152238.GA8438@plankton.public.utexas.edu>
2008-04-08 18:40           ` Mauro Carvalho Chehab
     [not found]             ` <c8b4dbe10804081306xb1e8f91q64d1e6d18d3d2531@mail.gmail.com>
2008-04-08 20:50               ` Mauro Carvalho Chehab
     [not found]                 ` <c8b4dbe10804090626l6b2b10d9p1c22e02dfe2850fe@mail.gmail.com>
2008-04-09 20:42                   ` Mauro Carvalho Chehab [this message]
     [not found]             ` <20080408204514.GA6844@plankton.public.utexas.edu>
2008-04-08 21:37               ` Mauro Carvalho Chehab
     [not found]                 ` <20080415021558.GA22068@plankton.ifup.org>
2008-04-15 14:10                   ` Mauro Carvalho Chehab
2008-03-28 10:18 ` [PATCH 7 of 9] vivi: Simplify the vivi driver and avoid deadlocks Brandon Philips
2008-03-28 18:34   ` Mauro Carvalho Chehab
2008-03-29  5:35     ` Brandon Philips
2008-03-31 19:35       ` Mauro Carvalho Chehab
2008-03-28 10:18 ` [PATCH 8 of 9] videobuf: Avoid deadlock with QBUF and bring up to spec for empty queue Brandon Philips
2008-03-28 10:18 ` [PATCH 9 of 9] videobuf-dma-sg.c: Avoid NULL dereference and add comment about backwards compatibility Brandon Philips
2008-03-28 19:09 ` [PATCH 0 of 9] videobuf fixes Mauro Carvalho Chehab
2008-03-29  5:25   ` Brandon Philips
2008-03-29 22:49     ` Vanessa Ezekowitz
2008-03-31 18:35     ` Mauro Carvalho Chehab
2008-03-31 19:26       ` Brandon Philips
2008-03-31 21:31         ` Mauro Carvalho Chehab
2008-04-01  3:11           ` Brandon Philips
2008-04-01 20:49             ` Mauro Carvalho Chehab
2008-04-02 18:54               ` Brandon Philips
2008-04-02 20:06                 ` Mauro Carvalho Chehab
2008-04-02 18:56               ` Brandon Philips

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080409174216.3844d0ee@areia \
    --to=mchehab@infradead.org \
    --cc=bphilips@suse.de \
    --cc=makosoft@googlemail.com \
    --cc=video4linux-list@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox