40k reduction in my vmlinux. Thanks to Denis Vlasenko for performing the analysis. --- 25-akpm/arch/i386/lib/usercopy.c | 55 ++++++++++++++++++++++++++++++++++++- 25-akpm/include/asm-i386/uaccess.h | 52 ++-------------------------------- 2 files changed, 57 insertions(+), 50 deletions(-) diff -puN include/asm-i386/uaccess.h~uninline-copy_user include/asm-i386/uaccess.h --- 25/include/asm-i386/uaccess.h~uninline-copy_user 2004-04-11 15:59:30.713913560 -0700 +++ 25-akpm/include/asm-i386/uaccess.h 2004-04-11 16:00:17.140855592 -0700 @@ -454,55 +454,9 @@ __copy_from_user(void *to, const void __ return __copy_from_user_ll(to, from, n); } -/** - * copy_to_user: - Copy a block of data into user space. - * @to: Destination address, in user space. - * @from: Source address, in kernel space. - * @n: Number of bytes to copy. - * - * Context: User context only. This function may sleep. - * - * Copy data from kernel space to user space. - * - * Returns number of bytes that could not be copied. - * On success, this will be zero. - */ -static inline unsigned long -copy_to_user(void __user *to, const void *from, unsigned long n) -{ - might_sleep(); - if (access_ok(VERIFY_WRITE, to, n)) - n = __copy_to_user(to, from, n); - return n; -} - -/** - * copy_from_user: - Copy a block of data from user space. - * @to: Destination address, in kernel space. - * @from: Source address, in user space. - * @n: Number of bytes to copy. - * - * Context: User context only. This function may sleep. - * - * Copy data from user space to kernel space. - * - * Returns number of bytes that could not be copied. - * On success, this will be zero. - * - * If some data could not be copied, this function will pad the copied - * data to the requested size using zero bytes. - */ -static inline unsigned long -copy_from_user(void *to, const void __user *from, unsigned long n) -{ - might_sleep(); - if (access_ok(VERIFY_READ, from, n)) - n = __copy_from_user(to, from, n); - else - memset(to, 0, n); - return n; -} - +unsigned long copy_to_user(void __user *to, const void *from, unsigned long n); +unsigned long copy_from_user(void *to, + const void __user *from, unsigned long n); long strncpy_from_user(char *dst, const char __user *src, long count); long __strncpy_from_user(char *dst, const char __user *src, long count); diff -puN arch/i386/lib/usercopy.c~uninline-copy_user arch/i386/lib/usercopy.c --- 25/arch/i386/lib/usercopy.c~uninline-copy_user 2004-04-11 15:59:30.730910976 -0700 +++ 25-akpm/arch/i386/lib/usercopy.c 2004-04-11 16:05:18.130098272 -0700 @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -567,7 +568,8 @@ survive: return n; } -unsigned long __copy_from_user_ll(void *to, const void __user *from, unsigned long n) +unsigned long +__copy_from_user_ll(void *to, const void __user *from, unsigned long n) { if (movsl_is_ok(to, from, n)) __copy_user_zeroing(to, (const void *) from, n); @@ -575,3 +577,54 @@ unsigned long __copy_from_user_ll(void * n = __copy_user_zeroing_intel(to, (const void *) from, n); return n; } + +/** + * copy_to_user: - Copy a block of data into user space. + * @to: Destination address, in user space. + * @from: Source address, in kernel space. + * @n: Number of bytes to copy. + * + * Context: User context only. This function may sleep. + * + * Copy data from kernel space to user space. + * + * Returns number of bytes that could not be copied. + * On success, this will be zero. + */ +unsigned long +copy_to_user(void __user *to, const void *from, unsigned long n) +{ + might_sleep(); + if (access_ok(VERIFY_WRITE, to, n)) + n = __copy_to_user(to, from, n); + return n; +} +EXPORT_SYMBOL(copy_to_user); + +/** + * copy_from_user: - Copy a block of data from user space. + * @to: Destination address, in kernel space. + * @from: Source address, in user space. + * @n: Number of bytes to copy. + * + * Context: User context only. This function may sleep. + * + * Copy data from user space to kernel space. + * + * Returns number of bytes that could not be copied. + * On success, this will be zero. + * + * If some data could not be copied, this function will pad the copied + * data to the requested size using zero bytes. + */ +unsigned long +copy_from_user(void *to, const void __user *from, unsigned long n) +{ + might_sleep(); + if (access_ok(VERIFY_READ, from, n)) + n = __copy_from_user(to, from, n); + else + memset(to, 0, n); + return n; +} +EXPORT_SYMBOL(copy_from_user); _