Commit a571b272 authored by Alexander Potapenko's avatar Alexander Potapenko Committed by Linus Torvalds

lib/stackdepot.c: use a non-instrumented version of memcmp()

stackdepot used to call memcmp(), which compiler tools normally
instrument, therefore every lookup used to unnecessarily call instrumented
code.  This is somewhat ok in the case of KASAN, but under KMSAN a lot of
time was spent in the instrumentation.

Link: http://lkml.kernel.org/r/20171117172149.69562-1-glider@google.comSigned-off-by: default avatarAlexander Potapenko <glider@google.com>
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
Cc: Dmitry Vyukov <dvyukov@google.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 334cfa48
...@@ -163,6 +163,21 @@ static inline u32 hash_stack(unsigned long *entries, unsigned int size) ...@@ -163,6 +163,21 @@ static inline u32 hash_stack(unsigned long *entries, unsigned int size)
STACK_HASH_SEED); STACK_HASH_SEED);
} }
/* Use our own, non-instrumented version of memcmp().
*
* We actually don't care about the order, just the equality.
*/
static inline
int stackdepot_memcmp(const unsigned long *u1, const unsigned long *u2,
unsigned int n)
{
for ( ; n-- ; u1++, u2++) {
if (*u1 != *u2)
return 1;
}
return 0;
}
/* Find a stack that is equal to the one stored in entries in the hash */ /* Find a stack that is equal to the one stored in entries in the hash */
static inline struct stack_record *find_stack(struct stack_record *bucket, static inline struct stack_record *find_stack(struct stack_record *bucket,
unsigned long *entries, int size, unsigned long *entries, int size,
...@@ -173,10 +188,8 @@ static inline struct stack_record *find_stack(struct stack_record *bucket, ...@@ -173,10 +188,8 @@ static inline struct stack_record *find_stack(struct stack_record *bucket,
for (found = bucket; found; found = found->next) { for (found = bucket; found; found = found->next) {
if (found->hash == hash && if (found->hash == hash &&
found->size == size && found->size == size &&
!memcmp(entries, found->entries, !stackdepot_memcmp(entries, found->entries, size))
size * sizeof(unsigned long))) {
return found; return found;
}
} }
return NULL; return NULL;
} }
......
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