From: Marek Szyprowski <m.szyprowski@samsung.com>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Hans Verkuil <hverkuil@xs4all.nl>,
LMML <linux-media@vger.kernel.org>,
Pawel Osciak <pawel@osciak.com>
Subject: Re: [RFC PATCH] vb2: force output buffers to fault into memory
Date: Fri, 07 Dec 2012 15:29:30 +0100 [thread overview]
Message-ID: <50C1FD4A.7020808@samsung.com> (raw)
In-Reply-To: <2230570.TblGvim78c@avalon>
Hello,
On 12/6/2012 2:23 AM, Laurent Pinchart wrote:
> Hi Hans,
>
> On Tuesday 04 December 2012 16:48:40 Hans Verkuil wrote:
> > (repost after accidentally using HTML formatting)
> >
> > This needs a good review. The change is minor, but as I am not a mm expert,
> > I'd like to get some more feedback on this. The dma-sg change has been
> > successfully tested on our hardware, but I don't have any hardware to test
> > the vmalloc change.
> >
> > Note that the 'write' attribute is still stored internally and used to tell
> > whether set_page_dirty_lock() should be called during put_userptr.
> >
> > It is my understanding that that still makes sense, so I didn't change that.
> >
> > Regards,
> >
> > Hans
> >
> > --- start patch ---
> >
> > When calling get_user_pages for output buffers, the 'write' argument is set
> > to 0 (since the DMA isn't writing to memory), This can cause unexpected
> > results:
> >
> > If you calloc() buffer memory and do not fill that memory afterwards, then
> > the kernel assigns most of that memory to one single physical 'zero' page.
> >
> > If you queue that buffer to the V4L2 driver, then it will call
> > get_user_pages and store the results. Next you dequeue it, fill the buffer
> > and queue it again. Now the V4L2 core code sees the same userptr and length
> > and expects it to be the same buffer that it got before and it will reuse
> > the results of the previous get_user_pages call. But that still points to
> > zero pages, whereas userspace filled it up and so changed the buffer to use
> > different pages. In other words, the pages the V4L2 core knows about are no
> > longer correct.
> >
> > The solution is to always set 'write' to 1 as this will force the kernel to
> > fault in proper pages.
>
> I'm wondering if we should really force faulting pages. The buffer given to
> the driver might be real read-only memory, in which case faulting the pages
> would probably hurt (agreed, that's pretty unlikely, but it's still a valid
> use case according to the API).
>
> Moreover, this wouldn't fix all similar userptr-related issues. An application
> could remap a completely different memory area to the same userspace address
> between two QBUF calls, and videobuf2 would not handle that properly. That's
> also a valid use case according to the API, and it would be pretty difficult
> to handle it correctly in an efficient way on the kernel side. I think we
> could modify the spec to forbid mapping changes between QBUF calls, and in
> that case the zero-page mapping situation you described could be forbidden as
> well. If we clearly document it in the spec we could push the responsibility
> of faulting the pages to userspace.
I've spent some time thinking on this issue and I came to the conclusion
that it
might be a good idea extend the v4l2 spec with such case. Changing the
write
parameter for get_user_pages() is only a workaround, which doesn't even
work for
all possible use cases, so I agree with Laurent that user ptr usage
should be
much better documented. I only wonder if it a good idea to require
faulting in
pages from the user space application. Can we assume that memset(ptr, 0,
buf_size)
will do the job in all cases? I expect yes, but I would like to be
really sure,
this will be probably put into the documentation for the reference code.
Best regards
--
Marek Szyprowski
Samsung Poland R&D Center
next prev parent reply other threads:[~2012-12-07 14:29 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-04 15:48 [RFC PATCH] vb2: force output buffers to fault into memory Hans Verkuil
2012-12-06 1:23 ` Laurent Pinchart
2012-12-07 14:29 ` Marek Szyprowski [this message]
2012-12-11 14:00 ` Laurent Pinchart
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=50C1FD4A.7020808@samsung.com \
--to=m.szyprowski@samsung.com \
--cc=hverkuil@xs4all.nl \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-media@vger.kernel.org \
--cc=pawel@osciak.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 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.