[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CAHk-=wjFoLfXct8RdMQRGn_B7RFfpZib403CLORZrex1KbAAqg@mail.gmail.com>
Date: Tue, 8 Jan 2019 10:01:15 -0800
From: Linus Torvalds <torvalds@...ux-foundation.org>
To: David Laight <David.Laight@...lab.com>
Cc: Andrew Lutomirski <luto@...nel.org>,
"dvlasenk@...hat.com" <dvlasenk@...hat.com>,
Jens Axboe <axboe@...nel.dk>, Ingo Molnar <mingo@...nel.org>,
Thomas Gleixner <tglx@...utronix.de>,
Ingo Molnar <mingo@...hat.com>, "bp@...en8.de" <bp@...en8.de>,
Peter Anvin <hpa@...or.com>,
"the arch/x86 maintainers" <x86@...nel.org>,
Andrew Morton <akpm@...ux-foundation.org>,
Peter Zijlstra <a.p.zijlstra@...llo.nl>,
"brgerst@...il.com" <brgerst@...il.com>,
Linux List Kernel Mailing <linux-kernel@...r.kernel.org>,
"pabeni@...hat.com" <pabeni@...hat.com>
Subject: Re: [PATCH] x86: only use ERMS for user copies for larger sizes
On Tue, Jan 8, 2019 at 1:10 AM David Laight <David.Laight@...lab.com> wrote:
> >
> > It will never work for memcpy_fromio(). Any driver that thinks it will
> > copy from io space to user space absolutely *has* to do it by hand. No
> > questions, and no exceptions. Some loop like
> >
> > for (..)
> > put_user(readl(iomem++), uaddr++);
> >
> > because neither copy_to_user() nor memcpy_fromio() will *ever* handle
> > that correctly.
> >
> > They might randomly happen to work on x86, but absolutely nowhere else.
>
> Actually they tend to handle it on a lot of systems.
Not with memcpy_fromio(), at least.
That doesn't work even on x86. Try it. If the user space page is
swapped out (or not mapped), you'd get a kernel page fault.
And if you do "copy_to_user()" from a mmio region, you get what you
get. If somebody complains about it doing a byte-at-a-time copy, I'll
laugh in their face and tell them to fix their broken driver. It might
work on about half the architectures out there, but it's still
complete garbage, and it's not a bug in copy_to_user().
Linus
Powered by blists - more mailing lists