Messages in this thread Patch in this message | | | From | Vitaly Mayatskikh <> | Subject | Re: [PATCH] x86: Optimize tail handling for copy_user | Date | Wed, 30 Jul 2008 14:07:58 +0200 |
| |
Linus Torvalds <torvalds@linux-foundation.org> writes:
> On Mon, 28 Jul 2008, Vitaly Mayatskikh wrote: >> >> Reduce protection faults count in copy_user_handle_tail routine by >> limiting clear length to the end of page as was suggested by Linus. > > No, you did it wrong.
Optimize tail handling with regarding to flags passed to handler routine.
Signed-off-by: Vitaly Mayatskikh <v.mayatskih@gmail.com>
diff --git a/arch/x86/lib/usercopy_64.c b/arch/x86/lib/usercopy_64.c index f4df6e7..d793900 100644 --- a/arch/x86/lib/usercopy_64.c +++ b/arch/x86/lib/usercopy_64.c @@ -161,23 +161,32 @@ EXPORT_SYMBOL(copy_in_user); /* * Try to copy last bytes and clear the rest if needed. * Since protection fault in copy_from/to_user is not a normal situation, - * it is not necessary to optimize tail handling. + * it is not necessary to do low level optimization of tail handling. */ unsigned long -copy_user_handle_tail(char *to, char *from, unsigned len, unsigned zerorest) +copy_user_handle_tail(char *dst, char *src, unsigned remainder, unsigned flags) { char c; - unsigned zero_len; + unsigned max_copy = remainder; - for (; len; --len) { - if (__get_user_nocheck(c, from++, sizeof(char))) + /* Don't even bother trying to cross a page in user space! */ + if (flags & DEST_IS_USERSPACE) + max_copy = min(max_copy, BYTES_LEFT_IN_PAGE(dst)); + if (flags & SOURCE_IS_USERSPACE) + max_copy = min(max_copy, BYTES_LEFT_IN_PAGE(src)); + + while (max_copy--) { + if (__get_user(c, src)) break; - if (__put_user_nocheck(c, to++, sizeof(char))) + if (__put_user(c, dst)) break; + src++; + dst++; + remainder--; } - for (c = 0, zero_len = len; zerorest && zero_len; --zero_len) - if (__put_user_nocheck(c, to++, sizeof(char))) - break; - return len; + if (flags & CLEAR_REMAINDER) + memset(dst, 0, remainder); + + return remainder; } -- wbr, Vitaly
| |