[RFC] mmaping with VIVT cache
Eric Miao
eric.y.miao at gmail.com
Wed Sep 15 03:37:14 EDT 2010
On Wed, Sep 15, 2010 at 3:31 PM, Russell King - ARM Linux
<linux at arm.linux.org.uk> wrote:
> On Wed, Sep 15, 2010 at 09:06:02AM +0800, Eric Miao wrote:
>> On Wed, Sep 15, 2010 at 7:50 AM, Russell King - ARM Linux
>> <linux at arm.linux.org.uk> wrote:
>> > On Mon, Sep 13, 2010 at 12:58:41PM -0700, P F wrote:
>> >> Hi,
>> >>
>> >> Please excuse the pseudonym.
>> >>
>> >> I have recently encountered a problem in the context of the UVC (webcam)
>> >> driver. The driver maintainer, Laurent, suggested that we bring the
>> >> thread to linux-arm-kernel for wider discussion. See here for reference:
>> >> http://lists.berlios.de/pipermail/linux-uvc-devel/2010-August/005864.html
>> >>
>> >> The problem I encountered was this: using an ARM926EJ-S with OHCI USB host,
>> >> I noticed intermittent graphical corruption of frames captured by several
>> >> different webcams, both UVC and non-UVC.
>> >>
>> >> I was able to isolate the corruption down to one specific instance. In
>> >> this instance, I collected three images:
>> >> 1A.jpg - collected from host, prior to corruption
>> >> 2A.jpg - collected from host, demonstrating corruption
>> >> 2B.jpg - collected from inline USB analyzer, same image as 2A
>> >>
>> >> Images 1A and 2A are in sequence, i.e., 2A immediately follows 1A. 2B is
>> >> not corrupted, and a binary diff between 2A and 2B shows two 32-byte
>> >> chunks have been changed. A binary diff between 2A and 1A shows that
>> >> these same two chunks match. Therefore, it seems there is some
>> >> contamination of the second image by the first.
>> >>
>> >> As I described in the linked message, I found a workaround for this issue
>> >> by adding
>> >> vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot)
>> >> in the UVC driver's mmap() function, but Laurent explained that this was
>> >> invalid.
>> >>
>> >> Does anybody have ideas for a proper fix? I can reproduce this corruption
>> >> easily, and would be happy to test proposed patches.
>> >
>> > The fact is that mapping buffers as cacheable into userspace on non-
>> > coherent architectures _will_ result in the cache contents getting in
>> > the way of updates to the DMA'd buffer. It's a fundamental property
>> > of such hardware implementations.
>> >
>>
>> Maybe we can just detect if the buffer is mapped in alias, and modify the
>> PTE, just as what we did to inconsistent write-combine? So to make this
>> transparent to other consistent architectures?
>
> All pages which are mapped into userspace have at least one alias.
>
Hrm... stumped.
More information about the linux-arm-kernel
mailing list