Commit 95108fa3 authored by Ingo Molnar's avatar Ingo Molnar

x86: usercopy: check for total size when deciding non-temporal cutoff

Impact: make more types of copies non-temporal

This change makes the following simple fix:

  30d697fa: x86: fix performance regression in write() syscall

A bit more sophisticated: we check the 'total' number of bytes
written to decide whether to copy in a cached or a non-temporal
way.

This will for example cause the tail (modulo 4096 bytes) chunk
of a large write() to be non-temporal too - not just the page-sized
chunks.

Cc: Salman Qazi <sqazi@google.com>
Cc: Nick Piggin <npiggin@suse.de>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 3255aa2e
...@@ -198,7 +198,7 @@ static inline int __copy_from_user_nocache(void *dst, const void __user *src, ...@@ -198,7 +198,7 @@ static inline int __copy_from_user_nocache(void *dst, const void __user *src,
* non-temporal stores here. Smaller writes get handled * non-temporal stores here. Smaller writes get handled
* via regular __copy_from_user(): * via regular __copy_from_user():
*/ */
if (likely(size >= PAGE_SIZE)) if (likely(total >= PAGE_SIZE))
return __copy_user_nocache(dst, src, size, 1); return __copy_user_nocache(dst, src, size, 1);
else else
return __copy_from_user(dst, src, size); return __copy_from_user(dst, src, size);
...@@ -207,7 +207,7 @@ static inline int __copy_from_user_nocache(void *dst, const void __user *src, ...@@ -207,7 +207,7 @@ static inline int __copy_from_user_nocache(void *dst, const void __user *src,
static inline int __copy_from_user_inatomic_nocache(void *dst, static inline int __copy_from_user_inatomic_nocache(void *dst,
const void __user *src, unsigned size, unsigned total) const void __user *src, unsigned size, unsigned total)
{ {
if (likely(size >= PAGE_SIZE)) if (likely(total >= PAGE_SIZE))
return __copy_user_nocache(dst, src, size, 0); return __copy_user_nocache(dst, src, size, 0);
else else
return __copy_from_user_inatomic(dst, src, size); return __copy_from_user_inatomic(dst, src, size);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment