aboutsummaryrefslogtreecommitdiffstats
path: root/arch/cris/arch-v32/lib/usercopy.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2017-03-19 15:25:35 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2017-03-28 18:23:30 -0400
commitde09be340d3ef4568b27282f2f6fc44b1cb559ab (patch)
tree1e72a569e20ea9aad7d3c321a16c16b63ce31f03 /arch/cris/arch-v32/lib/usercopy.c
parentcris: get rid of zeroing in __asm_copy_from_user_N for N > 4 (diff)
downloadlinux-dev-de09be340d3ef4568b27282f2f6fc44b1cb559ab.tar.xz
linux-dev-de09be340d3ef4568b27282f2f6fc44b1cb559ab.zip
cris: get rid of zeroing
... the rest of it Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch/cris/arch-v32/lib/usercopy.c')
-rw-r--r--arch/cris/arch-v32/lib/usercopy.c23
1 files changed, 6 insertions, 17 deletions
diff --git a/arch/cris/arch-v32/lib/usercopy.c b/arch/cris/arch-v32/lib/usercopy.c
index 05e58dab800d..25f421f98858 100644
--- a/arch/cris/arch-v32/lib/usercopy.c
+++ b/arch/cris/arch-v32/lib/usercopy.c
@@ -184,19 +184,18 @@ unsigned long __copy_user_zeroing(void *pdst, const void __user *psrc,
{
__asm_copy_from_user_1 (dst, src, retn);
n--;
+ if (retn != 0)
+ goto exception;
}
if (((unsigned long) src & 2) && n >= 2)
{
__asm_copy_from_user_2 (dst, src, retn);
n -= 2;
+ if (retn != 0)
+ goto exception;
}
- /* We only need one check after the unalignment-adjustments, because
- if both adjustments were done, either both or neither reference
- had an exception. */
- if (retn != 0)
- goto copy_exception_bytes;
}
/* Movem is dirt cheap. The overheap is low enough to always use the
@@ -279,7 +278,7 @@ unsigned long __copy_user_zeroing(void *pdst, const void __user *psrc,
n -= 4;
if (retn)
- goto copy_exception_bytes;
+ goto exception;
}
/* If we get here, there were no memory read faults. */
@@ -307,17 +306,7 @@ unsigned long __copy_user_zeroing(void *pdst, const void __user *psrc,
bytes. */
return retn;
-copy_exception_bytes:
- /* We already have "retn" bytes cleared, and need to clear the
- remaining "n" bytes. A non-optimized simple byte-for-byte in-line
- memset is preferred here, since this isn't speed-critical code and
- we'd rather have this a leaf-function than calling memset. */
- {
- char *endp;
- for (endp = dst + n; dst < endp; dst++)
- *dst = 0;
- }
-
+exception:
return retn + n;
}
EXPORT_SYMBOL(__copy_user_zeroing);