Messages in this thread | | | Date | Fri, 13 Sep 2002 01:29:52 -0700 | From | Andrew Morton <> | Subject | Re: [patch] readv/writev rework |
| |
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/
| |