Re: [patch] readv/writev rework

From: Andrew Morton (akpm@digeo.com)
Date: Fri Sep 13 2002 - 03:29:52 EST


Hirokazu Takahashi wrote:
>
> Hello,
>
> I updated the writev patch which may be easy to understand.
> How about it?

Looks nice. And yes, you hung onto the atomic kmap across multiple
iov segments ;) That will save a tlb invalidate per segment.
 
> But I have one question, Could let me know if you have any idea,
> why does filemap_copy_from_user() try to call kamp()+__copy_from_user()
> again after the first trial get fault.
>
> Is there any meanings?

We're not allowed to schedule away inside atomic_kmap - must remain
in the same task, on the same CPU etc. So the pagefault handler
will return immediately if we take a pagefault while copying to/from
userspace while holding an atomic kmap.

So the code first touches the userspace page (via __get_user) to
fault it in. Now, there is a 99.999999% chance that the copy_*_user()
will not fault - it will remain wholly atomic.

But there is the 0.0000001% chance that the VM will evict (or at least
unmap) the page between the __get_user() and the completion of the
copy_*_user(). In this case, copy_*_user() will fail and will return
a short copy.

Now, we could just touch the page with another __get_user() and retry
the atomic kmap approach. But I flipped a coin and decided to fall back
to a regular sleeping kmap instead. With a sleeping kmap, in a
non-atomic region the kernel will actually take the fault, fix it up
and the copy_*_user() will work OK.

> ...
> --- linux/mm/filemap.c.ORG Wed Sep 11 19:48:00 2030
> +++ linux/mm/filemap.c Fri Sep 13 16:08:51 2030

I shall retest...
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sun Sep 15 2002 - 22:00:32 EST